read - load file java
Carga de archivos por getClass(). GetResource() (2)
La mejor forma de acceder a los archivos desde la carpeta de recursos dentro de un contenedor es usar InputStream a través de getResourceAsStream
. Si aún necesita un recurso como instancia de archivo, puede copiar el recurso como una secuencia en un archivo temporal (el archivo temporal se eliminará cuando se cierre la JVM):
public static File getResourceAsFile(String resourcePath) {
try {
InputStream in = ClassLoader.getSystemClassLoader().getResourceAsStream(resourcePath);
if (in == null) {
return null;
}
File tempFile = File.createTempFile(String.valueOf(in.hashCode()), ".tmp");
tempFile.deleteOnExit();
try (FileOutputStream out = new FileOutputStream(tempFile)) {
//copy stream
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = in.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead);
}
}
return tempFile;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
He seguido la forma de cargar el archivo de recursos usando getClass.getResource(path)
. El fragmento de código está aquí:
String url = "Test.properties";
System.out.println("Before printing paths..");
System.out.println("Path2: "+ getClass().getResource(url).getPath());
FileInputStream inputStream = new FileInputStream(new File(getClass().getResource(url).toURI()));
i_propConfig.load(inputStream);
inputStream.close();
Lo he configurado en eclipse con la jerarquía (en origen hay una carpeta llamada SwingDemo. En SwingDemo está mi archivo java así como el archivo de recursos) ...
- src
- SwingDemo
- CustomDialog.java
- Test.properties
- SwingDemo
Cuando estoy ejecutando esto en eclipse todo está funcionando bien. Pero tan pronto como intento ejecutar las aplicaciones desde la línea de cmd, se produce una excepción de puntero nulo.
La jerarquía de implementación de la línea de comando es la siguiente:
Carpeta: D:/Work/Java Progrms/SwingDemo
Jerarquía:
- SwingDemo
- CustomDialog.java
- Test.properties
Antes que nada compilé este archivo dentro de la carpeta SwingDemo
desde la línea de comandos (javac CustomDialog.java
). Luego retrocedo un paso a la carpeta Programas de Java (como mencioné el paquete dentro de la clase .java) y ejecuto las aplicaciones usando el famoso
java SwingDemo.CustomDialog
Solía seguir pasos similares cuando usaba el nuevo FileInputStream ("ruta") anteriormente. Después de hacer esto, obtengo una excepción de puntero nulo.
Creo que getClass().getResource(url)
no puede cargar archivos desde un directorio específico. Es por eso que puse el recurso en el mismo directorio que el de mi archivo java. Funcionó bien en Eclipse. Pero por qué esto está dando error cuando corro desde Command Line.
getClass().getResource()
usa el cargador de clases para cargar el recurso. Esto significa que el recurso debe estar en el classpath que se va a cargar.
Cuando lo haces con Eclipse, todo lo que colocas en la carpeta fuente es "compilado" por Eclipse:
- Los archivos .java se compilan en archivos .class que van al directorio bin (de forma predeterminada)
- otros archivos se copian en el directorio bin (respetando el paquete / carpeta hirearchy)
Al iniciar el programa con Eclipse, el directorio bin se encuentra, por lo tanto, en classpath, y dado que contiene el archivo Test.properties, este archivo puede cargarse mediante el cargador de clases, utilizando getResource()
o getResourceAsStream()
.
Si no funciona desde la línea de comandos, es porque el archivo no está en la ruta de clases.
Tenga en cuenta que NO debe hacer
FileInputStream inputStream = new FileInputStream(new File(getClass().getResource(url).toURI()));
para cargar un recurso Porque eso solo puede funcionar si el archivo se carga desde el sistema de archivos. Si empaqueta su aplicación en un archivo jar, o si carga las clases en una red, no funcionará. Para obtener un InputStream, solo use
getClass().getResourceAsStream("Test.properties")
Y finalmente, como lo indica la documentación,
Foo.class.getResourceAsStream("Test.properties")
cargará un archivo Test.properties ubicado en el mismo paquete que la clase Foo.
Foo.class.getResourceAsStream("/com/foo/bar/Test.properties")
cargará un archivo Test.properties ubicado en el paquete com.foo.bar
.