Foros del Web » Programación para mayores de 30 ;) » Java »

[SOLUCIONADO] Duda sobre File.separator

Estas en el tema de Duda sobre File.separator en el foro de Java en Foros del Web. Hola, alguien puede explicarme cómo funciona la ruta hacia un recurso en un proyecto java y al exportarlo a su respectivo jar ? El hecho ...
  #1 (permalink)  
Antiguo 08/10/2016, 04:16
 
Fecha de Ingreso: diciembre-2013
Mensajes: 16
Antigüedad: 10 años, 3 meses
Puntos: 1
Duda sobre File.separator

Hola, alguien puede explicarme cómo funciona la ruta hacia un recurso en un proyecto java y al exportarlo a su respectivo jar ?

El hecho es que esto:

Código:
btnCerrar.setIcon( new ImageIcon(MainWindow.class.getResource("src"+File.separator+"images"+File.separator+"icons"+File.separator+"x.png")));
me da nullPointer (que no encuentra la ruta),

En cambio estos dos no:
Código:
btnCerrar.setIcon( new ImageIcon(MainWindow.class.getResource("images/icons/x.png")));
--> funciona en eclipse y en .jar
Código:
btnCerrar.setIcon( new ImageIcon("src/images/icons/x.png"));
->solo funciona en eclipse

Pero , porque cuando exporto el jar, si le cambio la extensión a rar o zip, y lo abro, en la barra de direcciones, la barra aparece como la de Windows ' \ '. Pero dentro de eclipse tengo que poner ' / '.
Se supone (y lei por algun foro) que System.getProperty(File.separator) sirve justamente para que la ruta sea valida en mas de un SO (Windows y Linux)
  #2 (permalink)  
Antiguo 08/10/2016, 10:18
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: Duda sobre File.separator

Hola:

En java siempre funciona bien la barra "/", tanto si estás en windows como en linux. Dentro de tu código, puedes poner perfectamente "C:/un/path/fichero.txt" y funciona correctamente.

En cuanto a leer ficheros dentro del jar, en realidad se leen ficheros que estén en el classpath, puede ser dentro del jar, puede ser fuera del jar, siempre que el directorio esté en el classpath.

El resource puedes obtenerlo de dos formas, bien a partir de una clase, como en tu caso ainWindow.class.getResource(), bien con la clase ClassLoader.getSystemResource()....

La primera busca el recurso en el mismo sitio donde esté tu clase (MainWindow.class), así que tienes que poner un path relativo a esa clase. La segunda lo busca desde el raíz del classpath, por lo que debes poner un path que empiece por / y desde el raiz del classpath.

por ejemplo, algo como esto
MainWindow.getResource("../../../src/images/icono.png")
donde los ../.. son los necesarios para subir desde el paquete de tu clase hasta el directorio src y luego bajar hacia images. Y eso siempre y cuando src/images forme parte del classpath. Como te he comentado, funcionará aunque no esté en el classpath si estas sobre el IDE, sin jar.

o bien
ClassLoader.getSystemResource("/src/images/icono.png")


Esto puede funcionarte bien en eclipse, puesto que no hay un jar creado y a base de path relativos llegas a cualquier sitio del sistema de ficheros, esté o no en el classpath, pero si tienes el jar ya creado, o tienes dentro del jar "/src/images/icono.png", o no lo encontrarás. No suele ser habitual meter el directorio src dentro del jar, por lo que suele ser mejor lo siguiente

Como forma habitual, asegúrate de que images está dentro del jar o del classpath y usa ClassLoader.getSystemResource("/images/icono.png"). Sin directorio /src

Se bueno.
__________________
Apuntes Java
Wiki de Programación

Última edición por chuidiang; 08/10/2016 a las 10:23
  #3 (permalink)  
Antiguo 08/10/2016, 12:36
 
Fecha de Ingreso: diciembre-2013
Mensajes: 16
Antigüedad: 10 años, 3 meses
Puntos: 1
Respuesta: Duda sobre File.separator

OK. Complemento con esto que encontré por la web.
https://docs.oracle.com/javase/8/docs/api/java/io/File.html#separatorChar

http://docs.oracle.com/javase/8/docs/api/java/lang/ClassLoader.html#getResource-java.lang.String-

http://blogs.atlassian.com/2006/12/how_to_use_file_separator_when/

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:09.