Solución:
Ponga word.txt directamente como hijo de la carpeta raíz del proyecto y como 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 que no funcione para otros.
Por qué funciona:
Cuando usas File
o cualquiera de los otros FileXxx
variantes, busca 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:EclipseWorkspaceProjectRootbin > java com.mypackage.Hangman1
el directorio de trabajo es C:EclipseWorkspaceProjectRootbin
. Con su IDE (al menos con todos los que he trabajado), el directorio de trabajo es el ProjectRoot
. Entonces, cuando el archivo está en el ProjectRoot
, entonces usar solo el nombre del archivo como ruta relativa es válido, porque está en la raíz del directorio de trabajo.
Del mismo modo, si esta fuera la estructura de su proyecto ProjectRootsrcword.txt
, luego el camino "src/word.txt"
sería válido.
Por qué puede que no funcione
Por un lado, el directorio de trabajo siempre puede 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 binword.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 tampoco será 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í, entonces querrá construir el archivo en la ruta de clases y acceder a él a través de una URL. Lo primero que debe hacer (en este caso particular) es asegurarse de que el archivo obtenga construido en el classpath. Con el archivo en la raíz del proyecto, debe configurar la compilación para incluir el archivo. Pero si pones el archivo en el src
o en algún directorio a continuación, la compilación predeterminada debería colocarlo en la ruta de clases.
Puede acceder al recurso classpath de varias formas. Puede hacer uso de la Class
clase, que tiene getResourceXxx
método, del cual se usa para obtener recursos de classpath.
Por ejemplo, si cambió la estructura de su proyecto a ProjectRootsrcresourcesword.txt
, podrías 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 oculta. Alternativamente, puede obtener un URL
si eso es lo que necesitas. getResource()
devolverá una URL
Para los usuarios de Maven, donde la estructura del directorio es como src/main/resources
, el contenido del resources
La carpeta se coloca en la raíz de la ruta de clases. Entonces, si tiene un archivo allí, solo usaría getResourceAsStream("/thefile.txt")
Se pueden utilizar rutas relativas, pero pueden ser complicadas. La mejor solución es saber dónde se guardan tus 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 debería imprimir la carpeta donde está buscando. Coloque el archivo allí y estará listo para comenzar.
Su archivo debe estar directamente debajo de la carpeta del proyecto y no dentro de ninguna otra subcarpeta.
Si la carpeta de su proyecto lleva el nombre, por ejemplo, AProject
, debe estar en el mismo lugar que su src
carpeta.
Aproject
src
word.txt