¿Cómo leer el archivo desde la ruta relativa en el proyecto Java? java.io.File no puede encontrar la ruta especificada

113

Tengo un proyecto con 2 paquetes:

  1. tkorg.idrs.core.searchengines
  2. tkorg.idrs.core.searchengines

En el paquete (2) tengo un archivo de texto ListStopWords.txt, en el paquete (1) tengo una clase FileLoadder. Aquí está el código en FileLoader:

File file = new File("properties\\files\\ListStopWords.txt");

Pero tengo este error:

The system cannot find the path specified

¿Puedes dar una solución para solucionarlo? Gracias.

tiendv
fuente
12
Sus dos ejemplos de paquetes son iguales. ¿No te refieres properties.filesa 2?
BalusC

Respuestas:

173

Si ya está en la ruta de clases, simplemente obténgalo de la ruta de clases en lugar del sistema de archivos del disco. No juegues con las rutas relativas java.io.File. Dependen del directorio de trabajo actual sobre el que no tiene ningún control desde el interior del código Java.

Suponiendo que ListStopWords.txtesté en el mismo paquete que su FileLoaderclase, haga lo siguiente:

URL url = getClass().getResource("ListStopWords.txt");
File file = new File(url.getPath());

O si todo lo que buscas en última instancia es en realidad InputStreamalgo:

InputStream input = getClass().getResourceAsStream("ListStopWords.txt");

Sin duda, esto es preferible a la creación de un new File()porque urlpuede que no represente necesariamente una ruta del sistema de archivos del disco, pero también podría representar la ruta del sistema de archivos virtual (lo que puede suceder cuando el JAR se expande en la memoria en lugar de en una carpeta temporal en el sistema de archivos del disco) o incluso una ruta de red que, por definición, no puede digerirse por el Fileconstructor.

Si el archivo -como sugiere el nombre del paquete- es en realidad un archivo de propiedades completo (que contiene key=valuelíneas) con la extensión "incorrecta", entonces puede alimentar InputStreamel load()método inmediatamente .

Properties properties = new Properties();
properties.load(getClass().getResourceAsStream("ListStopWords.txt"));

Nota: cuando intente acceder a él desde el staticcontexto interno , utilice FileLoader.class(o lo que sea YourClass.class) en lugar de getClass()en los ejemplos anteriores.

BalusC
fuente
¿Se eliminó FileLoader de java? Estoy tratando de hacer esto desde un contexto estático (java 6) y no puedo encontrar ninguna forma de importarlo y me sigue diciendo que no se puede resolver en un tipo. Curiosamente, se completó automáticamente cuando lo escribí, pero luego procedió a darme un error.
turbo
2
oh, se supone que es ClassLoader.class.
turbo
4
@turbo: FileLoaderes la clase personalizada de OP. Se supone que es exactamente esa clase en la que está intentando obtener el recurso. Así, así NameOfYourCurrentClass.class.getResourceAsStream(...). El ClassLoader.classfallará si la ClassLoaderclase está siendo cargado por un cargador de clases diferentes, lo que puede ocurrir en una aplicación "empresa" con una jerarquía de múltiples cargadores de clases (como una aplicación web Java EE).
BalusC
Oh, ya veo. No entendí que era dependiente. ¡Gracias por aclarar eso!
turbo
10
¿Alguna sugerencia para si el archivo no está en el mismo paquete? En mi caso, estoy tratando de abrir un archivo que se encuentra en un paquete de prueba.
Robin Newhouse
44

La siguiente línea se puede utilizar si queremos especificar la ruta relativa del archivo.

File file = new File("./properties/files/ListStopWords.txt");  
santhosh
fuente
3
¿Puedo saber por qué hay 3 barras entre el camino?
MSNaidu
Error:> Carácter de escape ilegal en literal de cadena.
IgorGanapolsky
¿Cómo convertir esto en un InputStream?
IgorGanapolsky
1
@IgorGanapolskyInputStream is = new FileInputStream("./properties/files/ListStopWords.txt");
Cameron Hudson
42

La ruta relativa funciona en Java usando el. operador.

  • . significa la misma carpeta que el contexto que se está ejecutando actualmente.
  • .. significa la carpeta principal del contexto que se está ejecutando actualmente.

Entonces, la pregunta es, ¿cómo sabe la ruta en la que está buscando Java actualmente?

haz un pequeño experimento

   File directory = new File("./");
   System.out.println(directory.getAbsolutePath());

Observe la salida, llegará a conocer el directorio actual donde está buscando java. Desde allí, simplemente use el operador ./ para ubicar su archivo.

por ejemplo si la salida es

G: \ JAVA8Ws \ MyProject \ content.

y su archivo está presente en la carpeta MyProject, simplemente use

File resourceFile = new File("../myFile.txt");

Espero que esto ayude

Samrat
fuente
después de horas de búsqueda, esta respuesta me proporcionó la solución
erdostamasa
8
InputStream in = FileLoader.class.getResourceAsStream("<relative path from this class to the file to be read>");
try {
    BufferedReader reader = new BufferedReader(new InputStreamReader(in));
    String line = null;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
} catch (Exception e) {
    e.printStackTrace();
}
polea sin fricción
fuente
1
@IgorGanapolsky es el nombre de Class. Puede hacer referencia a .classliteral solo proporcionando el nombre completo de su clase.
Tomasz Mularczyk
Creo que pretende ser FileLoader.
jamesdeath123
6

tratar .\properties\files\ListStopWords.txt

insecto.
fuente
5

Podría haber comentado, pero tengo menos reputación por eso. La respuesta de Samrat hizo el trabajo por mí. Es mejor ver la ruta del directorio actual a través del siguiente código.

    File directory = new File("./");
    System.out.println(directory.getAbsolutePath());

Simplemente lo usé para rectificar un problema que enfrentaba en mi proyecto. Asegúrese de utilizar ./ ​​para volver al directorio principal del directorio actual.

    ./test/conf/appProperties/keystore 
dezible
fuente
Estoy ejecutando mi código a través de Tomcat y, por lo tanto, el directorio actual no es la carpeta del proyecto. ¿Cómo defino la ruta relativa a la raíz del proyecto? Actualmente estoy usando la ruta difícil: "C: \\ Users \\ user \\ Desktop \\ Repositories \\ L1_WebShop \\ dblogs.log";
Tiago Redaelli
@TiagoRedaelli mira estas preguntas: stackoverflow.com/questions/12843217/…
dezible
4

Si bien la respuesta proporcionada por BalusC funciona para este caso, se interrumpirá cuando la ruta del archivo contenga espacios porque en una URL, estos se están convirtiendo a% 20, que no es un nombre de archivo válido. Si construye el objeto File usando un URI en lugar de una String, los espacios en blanco se manejarán correctamente:

URL url = getClass().getResource("ListStopWords.txt");
File file = new File(url.toURI());
Mark Krijgsman
fuente
2

Quería analizar 'command.json' dentro de src / main // js / Simulator.java. Para eso, copié el archivo json en la carpeta src y di la ruta absoluta como esta:

Object obj  = parser.parse(new FileReader("./src/command.json"));
sver
fuente
2

ingrese la descripción de la imagen aquí

Suponiendo que quiera leer desde el resourcesdirectorio en FileSystemclase.

String file = "dummy.txt";
var path = Paths.get("src/com/company/fs/resources/", file);
System.out.println(path);

System.out.println(Files.readString(path));

Nota:. No se necesita liderazgo .

R Sol
fuente
1

Para mí, en realidad, el problema es que la ruta de clase del objeto File proviene <project folder path> or ./src, así que use File file = new File("./src/xxx.txt");resolvió mi problema

J.Luan
fuente
0

String basePath = nuevo archivo ("myFile.txt"). GetAbsolutePath (); esta ruta base que puede usar como la ruta correcta de su archivo

usuario13499397
fuente
-1

Si está intentando llamar getClass()desde un método estático o un bloque estático, puede hacerlo de la siguiente manera.

Puede llamar getClass()al Propertiesobjeto en el que está cargando.

public static Properties pathProperties = null;

static { 
    pathProperties = new Properties();
    String pathPropertiesFile = "/file.xml;
    InputStream paths = pathProperties.getClass().getResourceAsStream(pathPropertiesFile);
}
arun_kk
fuente
Simplemente falta una cita de cierre.
jamesdeath123
-1

Si el archivo de texto no se está leyendo, intente usar una ruta absoluta más cercana (si lo desea, puede usar la ruta absoluta completa) como esta:

FileInputStream fin=new FileInputStream("\\Dash\\src\\RS\\Test.txt");

suponga que la ruta absoluta es:

C:\\Folder1\\Folder2\\Dash\\src\\RS\\Test.txt
KR N
fuente