java.io.FileNotFoundException: el sistema no puede encontrar el archivo especificado

Así que he estado atrapado en esto por un tiempo. Básicamente, tengo un archivo creado llamado “word.txt” y cada vez que ejecuto el progtwig me da este error:

Exception in thread "main" java.io.FileNotFoundException: word.txt (The system cannot find the file specified) at java.io.FileInputStream.open(Native Method) at java.io.FileInputStream.(Unknown Source) at java.util.Scanner.(Unknown Source) at Hangman1.main(Hangman1.java:6) 

Aquí está mi código:

 import java.io.File; import java.util.*; public class Hangman1 { public static void main(String[] args) throws Exception { Scanner input = new Scanner(new File("word.txt")); String in = ""; in = input.nextLine(); } } 

Irónicamente, creé el archivo “word.txt” en el mismo directorio que mi archivo java y, sin embargo, todavía me está dando ese error.

Coloque word.txt directamente como hijo de la carpeta raíz del proyecto y un par de src

 Project_Root src word.txt 

Descargo de responsabilidad: me gustaría explicar por qué esto funciona para este caso particular y por qué puede no funcionar para otros.

Por qué funciona:

Cuando utiliza File o cualquiera de las otras variantes de FileXxx , está buscando un archivo en el sistema de archivos relativo al “directorio de trabajo” . El directorio de trabajo se puede describir así:

Cuando corres desde la línea de comando

C:\EclipseWorkspace\ProjectRoot\bin > java com.mypackage.Hangman1

el directorio de trabajo es C:\EclipseWorkspace\ProjectRoot\bin . Con su IDE (al menos todas las que he trabajado), el directorio de trabajo es ProjectRoot . Por lo tanto, cuando el archivo se encuentra en ProjectRoot , usar solo el nombre del archivo como la ruta relativa es válida, porque está en la raíz del directorio de trabajo.

Del mismo modo, si esta fuera su estructura de proyecto ProjectRoot\src\word.txt , entonces la ruta "src/word.txt" sería válida.

Por qué no puede funcionar

Por un lado, el directorio de trabajo siempre podría cambiar. Por ejemplo, al ejecutar el código desde la línea de comando como en el ejemplo anterior, el directorio de trabajo es el bin . Entonces, en este caso fallará, ya que no hay bin\word.txt

En segundo lugar, si tuviera que exportar este proyecto a un jar, y el archivo se configuró para incluirse en el jar, también fallaría, ya que la ruta ya no sería válida.

Dicho esto, debe determinar si el archivo debe ser un recurso incrustado (o simplemente un “recurso”, términos que a veces usaré indistintamente). Si es así, querrá construir el archivo en la ruta de clase y acceder a ella a través de una URL. Lo primero que debería hacer (en este caso particular) es asegurarse de que el archivo esté integrado en el classpath. Con el archivo en la raíz del proyecto, debe configurar la comstackción para incluir el archivo. Pero si coloca el archivo en el src o en algún directorio a continuación, entonces la comstackción predeterminada debe ponerlo en la ruta de la clase.

Puede acceder al recurso classpath de varias maneras. Puede hacer uso de la clase Class , que tiene el método getResourceXxx , desde el cual usa para obtener recursos de classpath.

Por ejemplo, si cambió la estructura de su proyecto a ProjectRoot\src\resources\word.txt , podría usar esto:

 InputStream is = Hangman1.class.getResourceAsStream("/resources/word.txt"); BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 

getResourceAsStream devuelve un InputStream , pero obtiene una URL bajo el capó. Alternativamente, podría obtener una URL si eso es lo que necesita. getResource() devolverá una URL

Para los usuarios de Maven, donde la estructura del directorio es como src/main/resources , el contenido de la carpeta de resources se coloca en la raíz del classpath. Entonces, si tienes un archivo allí, entonces solo getResourceAsStream("/thefile.txt")

Se pueden usar rutas relativas, pero pueden ser complicadas. La mejor solución es saber dónde se guardan los archivos, es decir, imprimir la carpeta:

 import java.io.File; import java.util.*; public class Hangman1 { public static void main(String[] args) throws Exception { File myFile = new File("word.txt"); System.out.println("Attempting to read from file in: "+myFile.getCanonicalPath()); Scanner input = new Scanner(myFile); String in = ""; in = input.nextLine(); } } 

Este código debe imprimir la carpeta donde está buscando. Coloque el archivo allí y estará listo para ir.

Su archivo debe estar directamente debajo de la carpeta del proyecto, y no dentro de ninguna otra subcarpeta.

Si la carpeta de su proyecto se llama, por ejemplo, AProject , debe estar en el mismo lugar que su carpeta src .

 Aproject src word.txt 

creo que siempre hierve a la classpath . Dicho esto, si ejecuta desde la misma carpeta donde está su clase, cambie la Scanner input = new Scanner(new File("word.txt")); a la Scanner input = new Scanner(new File("./word.txt")); eso debería funcionar

Asegúrese de que cuando crea un archivo txt no escriba el nombre “nombre.txt”, solo escriba “nombre”. Si escribe “nombre.txt”, Eclipse lo verá como “nombre.txt.txt”. Esto lo resolvió para mí. Guarde también el archivo en la carpeta src, no en la carpeta donde reside el .java, una carpeta arriba.

Estaba leyendo la ruta desde un archivo de propiedades y no mencioné que había un espacio al final. Asegúrate de no tener uno.

Tengo el mismo problema, pero ¿sabes por qué? porque no puse .txt al final de mi Archivo y entonces era File no textFile, solo debes hacer dos cosas:

  1. Coloque su archivo de texto en el directorio raíz (por ejemplo, si tiene un proyecto llamado HelloWorld, simplemente haga clic derecho en el archivo HelloWorld en el directorio del paquete y cree el archivo
  2. Guarde como ese archivo el nombre que desee pero con un .txt al final de eso supongo que su problema está resuelto, pero lo escribo para que otras personas lo sepan. Gracias.