¿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.


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.


¿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");  

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


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();
}

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


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 

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());

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"));

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 .


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


0

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


-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);
}

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.