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?
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?
Respuestas:
Puede utilizar el ClassLoader.getResource
mé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 File
objeto y usar el getAbsolutePath
método:
File file = new File("resources/abc.txt");
String absolutePath = file.getAbsolutePath();
target/classes/abc.txt
para 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.
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!)
new File(resource.toURI()).getAbsolutePath();
(es decir, ¿no creo que necesite el objeto Path?)
new File(YourClass.class.getResource("abc").toURI().getPath())
si quisiera.
.getResource("/abc")
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);
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
Hay dos problemas en nuestro camino hacia la ruta absoluta:
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 src
o src/test/resource
aquí.
Puedes insertar el código en el tuyo y ver las rutas que tienes.