rutas - abrir recurso con ruta relativa en java
ruta relativa java netbeans (11)
En mi aplicación Java necesito obtener algunos archivos y directorios.
Esta es la estructura del programa:
./main.java
./package1/guiclass.java
./package1/resources/resourcesloader.java
./package1/resources/repository/modules/ -> this is the dir I need to get
./package1/resources/repository/SSL-Key/cert.jks -> this is the file I need to get
guiclass
carga la clase resourcesloader que cargará mis recursos (directorio y archivo).
En cuanto al archivo, probé
resourcesloader.class.getClass().getResource("repository/SSL-Key/cert.jks").toString()
para obtener el camino real, pero de esta manera no funciona.
No tengo idea de cómo hacer el directorio.
¿Hace el siguiente trabajo?
resourcesloader.class.getClass().getResource("/package1/resources/repository/SSL-Key/cert.jks")
¿Hay alguna razón por la que no puedas especificar la ruta completa, incluido el paquete?
@GianCarlo: Puedes intentar llamar a la propiedad del sistema user.dir que te dará la raíz de tu proyecto java y luego agregar esta ruta a tu ruta relativa, por ejemplo:
String root = System.getProperty("user.dir");
String filepath = "/path/to/yourfile.txt"; // in case of Windows: "//path //to//yourfile.txt
String abspath = root+filepath;
// using above path read your file into byte []
File file = new File(abspath);
FileInputStream fis = new FileInputStream(file);
byte []filebytes = new byte[(int)file.length()];
fis.read(filebytes);
Con la esperanza de proporcionar información adicional para aquellos que no recogen esto tan rápido como otros, me gustaría proporcionar mi escenario, ya que tiene una configuración ligeramente diferente. Mi proyecto fue configurado con la siguiente estructura de directorio (usando Eclipse):
Project/ src/ // application source code org/ myproject/ MyClass.java test/ // unit tests res/ // resources images/ // PNG images for icons my-image.png xml/ // XSD files for validating XML files with JAXB my-schema.xsd conf/ // default .conf file for Log4j log4j.conf lib/ // libraries added to build-path via project settings
Estaba teniendo problemas al cargar mis recursos desde el directorio de res . Quería que todos mis recursos se separaran de mi código fuente (simplemente para fines de gestión / organización). Entonces, lo que tenía que hacer era agregar el directorio res a la ruta de compilación y luego acceder al recurso a través de:
static final ClassLoader loader = MyClass.class.getClassLoader();
// in some function
loader.getResource("images/my-image.png");
loader.getResource("xml/my-schema.xsd");
loader.getResource("conf/log4j.conf");
NOTA: El /
se omite desde el comienzo de la cadena de recursos porque estoy usando ClassLoader.getResource(String) lugar de Class.getResource(String) .
Cuando utiliza ''getResource'' en una clase, una ruta relativa se resuelve en función del paquete en el que está la clase. Cuando utiliza ''getResource'' en un ClassLoader, una ruta relativa se resuelve en función de la carpeta raíz.
Si usa una ruta absoluta, ambos métodos ''getResource'' comenzarán en la carpeta raíz.
Hice una pequeña modificación en el trazador de líneas de @ jonathan.cone (agregando .getFile()
) para evitar la excepción del puntero nulo y establecer la ruta al directorio de datos. Esto es lo que funcionó para mí:
String realmID = new java.util.Scanner(new java.io.File(RandomDataGenerator.class.getClassLoader().getResource("data/aa-qa-id.csv").getFile().toString())).next();
Para aquellos que usan eclipse + maven. Supongamos que intenta acceder al archivo images/pic.jpg
en src/main/resources
. Haciéndolo de esta manera:
ClassLoader loader = MyClass.class.getClassLoader();
File file = new File(loader.getResource("images/pic.jpg").getFile());
es perfectamente correcto, pero puede dar como resultado una excepción de puntero nulo. Parece que eclipse no reconoce las carpetas en la estructura de directorios maven como carpetas de origen de inmediato. Al eliminar y la carpeta src/main/resources
de la lista de carpetas de origen del proyecto y ponerla de nuevo (proyecto> propiedades> ruta de compilación java> fuente> eliminar / agregar carpeta), pude resolver esto.
Proporcione la ruta relativa al cargador de clases, no la clase de la que obtiene el cargador. Por ejemplo:
resourcesloader.class.getClassLoader().getResource("package1/resources/repository/SSL-Key/cert.jks").toString();
Tuve problemas con el uso del getClass().getResource("filename.txt")
. Al leer las instrucciones de documentación de Java, si su recurso no está en el mismo paquete que la clase a la que intenta acceder, entonces debe darle una ruta relativa que comience por ''/''
. La estrategia recomendada es colocar los archivos de recursos en una carpeta de "recursos" en el directorio raíz. Entonces, por ejemplo, si tienes la estructura:
src/main/com/mycompany/myapp
a continuación, puede agregar una carpeta de recursos recomendada por maven en:
src/main/resources
Además, puede agregar subcarpetas en la carpeta de recursos
src/main/resources/textfiles
y diga que su archivo se llama myfile.txt
para que tenga
src/main/resources/textfiles/myfile.txt
Ahora aquí es donde entra el problema de la ruta estúpida. Digamos que tiene una clase en su com.mycompany.myapp package
y desea acceder al archivo myfile.txt
desde su carpeta de recursos. Algunos dicen que necesitas dar:
"/main/resources/textfiles/myfile.txt" path
o
"/resources/textfiles/myfile.txt"
ambos están equivocados. Después de ejecutar mvn clean compile
, los archivos y las carpetas se copian en:
myapp/target/classes
carpeta. Pero la carpeta de recursos no está allí, solo las carpetas en la carpeta de recursos. Así que tienes:
myapp/target/classes/textfiles/myfile.txt
myapp/target/classes/com/mycompany/myapp/*
así que la ruta correcta para dar al getClass().getResource("")
es:
"/textfiles/myfile.txt"
aquí está:
getClass().getResource("/textfiles/myfile.txt")
Esto ya no devolverá nulo, pero devolverá su clase. Espero que esto ayude a alguien. Me resulta extraño que la carpeta "resources"
no se copie también, sino solo las subcarpetas y los archivos directamente en la carpeta "resources"
. Me parece lógico que la carpeta "resources"
también se encuentre en "myapp/target/classes"
Utilizar esta:
resourcesloader.class.getClassLoader().getResource("/path/to/file").**getPath();**
Yendo con las dos respuestas como se menciona arriba. El primero
resourcesloader.class.getClassLoader().getResource("package1/resources/repository/SSL-Key/cert.jks").toString();
resourcesloader.class.getResource("repository/SSL-Key/cert.jks").toString()
¿Debería ser una y la misma cosa?
resourcesloader.class.getClass()
Se puede dividir en:
Class<resourcesloader> clazz = resourceloader.class;
Class<Class> classClass = clazz.getClass();
Lo que significa que estás intentando cargar el recurso usando una clase de arranque.
En cambio, probablemente quieras algo como:
resourcesloader.class.getResource("repository/SSL-Key/cert.jks").toString()
Si solo javac advirtiera sobre llamar a métodos estáticos en contextos no estáticos ...