Cómo obtener la ruta absoluta al archivo en la carpeta / resources de su proyecto


95

Suponga la configuración estándar de Maven.

Diga en su carpeta de recursos que tiene un archivo abc.

En Java, ¿cómo puedo obtener la ruta absoluta al archivo, por favor?


¿Quieres escribir un complemento de Maven? ¿O desea acceder al archivo cuando se ejecuta su programa?
Gyro Gearless


Hay tres variantes de solución, según la situación: stackoverflow.com/a/56327069/715269
Gangnus

Respuestas:


73

Puede utilizar el ClassLoader.getResourcemétodo para obtener el recurso correcto.

URL res = getClass().getClassLoader().getResource("abc.txt");
File file = Paths.get(res.toURI()).toFile();
String absolutePath = file.getAbsolutePath();

O

Aunque esto puede no funcionar todo el tiempo, una solución más simple:

Puede crear un Fileobjeto y usar el getAbsolutePathmétodo:

File file = new File("resources/abc.txt");
String absolutePath = file.getAbsolutePath();

8
Un consejo de uso limitado, ya que se basa en el directorio de trabajo como raíz de maven. E incluso entonces, debería usarlo target/classes/abc.txtpara hacer referencia al archivo, ya que este es el lugar canónico donde Maven coloca los archivos de recursos después del procesamiento (por ejemplo, el complemento maven-resources podría haber realizado una sustitución de propiedades en abc.txt). Es mucho mejor usar abc.txt a través de getResource () desde classpath.
Gyro Gearless

2
¿Qué sucede si un usuario final ejecuta su aplicación como un JAR ejecutable? Entonces no habrá ningún archivo físico. Esta es otra razón por la que debería utilizar getResource () y, por ejemplo, abrir el flujo de entrada en función de lo que desee hacer con él.
Matthew Wise

6
¿Se puede eliminar esto como la respuesta correcta? @Karol S respondió a continuación: esa debería ser la respuesta correcta (de ahí la discrepancia de
votos a favor

3
Respuesta incorrecta. Consulte a continuación la respuesta de @Karol
bhathiya-perera

167

La forma correcta que realmente funciona:

URL resource = YourClass.class.getResource("abc");
Paths.get(resource.toURI()).toFile();

No importa ahora dónde esté físicamente el archivo en la ruta de clase, se encontrará siempre que el recurso sea en realidad un archivo y no una entrada JAR.

(¡Lo aparentemente obvio new File(resource.getPath())no funciona para todas las rutas! ¡La ruta todavía está codificada en URL!)


5
O presumiblemente podría hacer: new File(resource.toURI()).getAbsolutePath();(es decir, ¿no creo que necesite el objeto Path?)
Dan King

1
Buen consejo sobre toURI (), ¡esto evita que los espacios en su camino salgan como% 20!
Matthew Wise

29
¡Gracias! Esto casi funcionó para mí. Pero tuve que hacer un cambio: YourClass.class.getClassLoader (). GetResource ("abc");
yngwietiger

Alternativamente, podría hacerlo new File(YourClass.class.getResource("abc").toURI().getPath())si quisiera.
Mike Rylander

2
No entiendo cómo esto ha funcionado para muchas personas sin la barra de inicio:.getResource("/abc")
Cahen

28

Necesita especificar la ruta comenzada desde /

URL resource = YourClass.class.getResource("/abc");
Paths.get(resource.toURI()).toFile();

12

Cree la instancia de classLoader de la clase que necesita, luego podrá acceder a los archivos o recursos fácilmente. ahora accedes a la ruta usando el getPath()método de esa clase.

 ClassLoader classLoader = getClass().getClassLoader();
 String path  = classLoader.getResource("chromedriver.exe").getPath();
 System.out.println(path);

1

Para devolver un archivo o ruta de archivo

URL resource = YourClass.class.getResource("abc");
File file = Paths.get(resource.toURI()).toFile(); // return a file
String filepath = Paths.get(resource.toURI()).toFile().getAbsolutePath();  // return file path

0

Hay dos problemas en nuestro camino hacia la ruta absoluta:

  1. La ubicación encontrada no será donde se encuentran los archivos de origen, sino donde se guarda la clase. Y la carpeta de recursos seguramente estará en algún lugar de la carpeta de origen del proyecto.
  2. Las mismas funciones para recuperar el recurso funcionan de manera diferente si la clase se ejecuta en un complemento o en un paquete directamente en el espacio de trabajo.

El siguiente código nos dará todas las rutas útiles:

    URL localPackage = this.getClass().getResource("");
    URL urlLoader = YourClassName.class.getProtectionDomain().getCodeSource().getLocation();
    String localDir = localPackage.getPath();
    String loaderDir = urlLoader.getPath();
    System.out.printf("loaderDir = %s\n localDir = %s\n", loaderDir, localDir);

Aquí se investigan ambas funciones que se pueden utilizar para la localización de la carpeta de recursos. En cuanto a class, se puede obtener de cualquier manera, estática o dinámicamente.


Si el proyecto no está en el complemento, si se ejecuta el código en JUnit, se imprimirá:

loaderDir = /C:.../ws/source.dir/target/test-classes/
 localDir = /C:.../ws/source.dir/target/test-classes/package/

Entonces, para llegar a src / rest / resources, debemos subir y bajar por el árbol de archivos. Se pueden utilizar ambos métodos. Tenga en cuenta que no podemos usar getResource(resourceFolderName), porque esa carpeta no está en la carpeta de destino. Nadie pone recursos en las carpetas creadas, espero.


Si la clase está en el paquete que está en el complemento, el resultado de la misma prueba será:

loaderDir = /C:.../ws/plugin/bin/
 localDir = /C:.../ws/plugin/bin/package/

Entonces, nuevamente debemos subir y bajar por el árbol de carpetas.


El más interesante es el caso cuando el paquete se inicia en el complemento. Como prueba del complemento JUnit, para nuestro ejemplo. La salida es:

loaderDir = /C:.../ws/plugin/
 localDir = /package/

Aquí podemos obtener la ruta absoluta solo combinando los resultados de ambas funciones. Y no es suficiente. Entre ellos debemos poner la ruta local del lugar donde están los paquetes de clases, en relación con la carpeta del complemento. Probablemente, tendrá que insertar algo como srco src/test/resourceaquí.

Puedes insertar el código en el tuyo y ver las rutas que tienes.

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.