Uso del getResource para la clase File en java
Hola buen dia.
Estoy realizando un programita en java en el cual necesito hacer referencia a algunos archivos (que estan dentro de la carpeta de mi proyecto) por ejemplo: configuracion.properties, clienteLog.log, archivo.txt, etcetera.
Lo que estoy haciendo es crear un objeto de tipo File y como parametro hago referencia al recurso necesario (archivo.txt por ejemplo) de la siguiente manera:
Y al momento de hacer algo con el objeto creado como por ejemplo:
Siempre retorna un false, la ruta del archivo esta bien establecida pero no he encontrado la forma de hacer esto. El problema es que necesito el objeto de tipo File.
Alguien que pueda ayudarme? se lo agradeceria bastante. Saludos y gracias de antemano.
- javier23's blog
- Inicie sesión o regístrese para enviar comentarios
Comentarios
El directorio controlador
La ruta del recurso debe de estar en tu classpath para que el método getResource lo pueda encontrar.
En este ejemplo la ruta no esta en el classpath, esta dentro de un directorio llamado "otroDirectorio"
class Ejemplo {
public static void main(String ... args ) {
File file = new File(
Ejemplo.class.getResource("/controlador/resource/archivo.txt").getFile()
);
if ( file.exists() ) {
System.out.println("Archivo existe");
} else {
System.out.println("Archivo NO existe");
}
}
}
c:\>dir otroDirectorio\controlador\resource\archivo.txt
07/16/2014 12:07 PM 1 archivo.txt
1 File(s) 1 bytes
c:\>java Ejemplo
Exception in thread "main" java.lang.NullPointerException
at Ejemplo.main(Ejemplo.java:5)
Arroja NullPointerException porque el método getResource devuelve null ( no lo encontró ) y luego
null.getFile()
resulta en NullPointerException; ni siquiera llega a la condición.Si se agrega el directorio "otroDirectorio" al classpath,entonces Java sabrá donde buscar la ruta "controlador\resource\archivo.txt"
Archivo existe
Se puede modificar el código para validar cuando es null y mostrar que el archivo no existe en vez de fallar con NullPointerException así
import java.net.URL;
class Ejemplo {
public static void main(String ... args ) {
URL resource = Ejemplo.class.getResource("/controlador/resource/archivo.txt");
File file = null;;
if ( resource != null && (file = new File(resource.getFile())).exists() ) {
System.out.println("Archivo existe");
} else {
System.out.println("Archivo NO existe");
}
}
*Nota sobre la condición en el segundo ejemplo, en términos generales asignar y evaluar (como en
(file = new File(resource.getFile())).exists()
) no es tan recomendable porque no es tan claro que ocurre, pero para mí es más claro esto que anidar el if:if ( resource != null ) {
File file = new File(resource.getFile());
if( file.exists() ) {
System.out.println("Archivo existe");
} else {
System.out.println("Archivo NO existe");
}
} else {
System.out.println("Archivo NO existe");
}
Pero eso ya es cuestión de estilo.
Todavia no logro hacer que funcione
Muchas gracias por la ayuda OscarRyz pero no he logrado que me funcione. Este es la estructura de un programa de pruebas:
|
-->Rutas¬-->Rutas.java
|-->Sample.fxml
|-->SampleControler.java
En la clase SampleControler.java estoy haciendo lo siguiente:
if( file.exists() )
System.out.println("Si existe ");
else{
System.out.println("No existe ");
}
System.out.println(">>-------------------> " + file);
Y siempre en la condicion retorna false. Algo estoy haciendo mal? y el file no esta nulo porque cuando lo imprimo en la consola me sale esto:
Ah ya veo. El archivo está
Ah ya veo. El archivo está dentro de un jar, por eso el recurso sí existe, pero no es posible crear un archivo que haga referencia a un jar que está dentro de un jar.
Es como querer crear un archivo que esta dentro de un zip sin extraerlo.
Intenta obtener el inputstream en vez de eso.
http://stackoverflow.com/questions/3369794/how-to-a-read-file-from-jar-i...