Recurso de Java como archivo

¿Hay alguna forma en Java para construir una instancia de archivo en un recurso recuperado de un jar a través del cargador de clases?

Mi aplicación utiliza algunos archivos del jar (predeterminado) o de un directorio del sistema de archivos especificado en el tiempo de ejecución (entrada del usuario). Estoy buscando una forma consistente de
a) cargar estos archivos como una secuencia
b) listar los archivos en el directorio definido por el usuario o el directorio en el contenedor respectivamente

Editar: Aparentemente, el enfoque ideal sería mantenerse alejado de java.io.File por completo. ¿Hay alguna manera de cargar un directorio desde la ruta de clases y enumerar sus contenidos (archivos / entidades contenidos en él)?

ClassLoader.getResourceAsStream y Class.getResourceAsStream son definitivamente el camino a seguir para cargar los datos del recurso. Sin embargo, no creo que haya ninguna forma de “enumerar” el contenido de un elemento de la ruta de clases.

En algunos casos, esto puede ser simplemente imposible; por ejemplo, un ClassLoader podría generar datos sobre la marcha, según el nombre de recurso que se le solicite. Si miras la API de ClassLoader (que es básicamente lo que funciona el mecanismo classpath), verás que no hay nada para hacer lo que deseas.

Si sabe que tiene un archivo jar, puede cargarlo con ZipInputStream para averiguar qué hay disponible. Sin embargo, significará que tendrá un código diferente para directorios y archivos jar.

Una alternativa, si los archivos se crean por separado primero, es incluir un tipo de archivo de manifiesto que contenga la lista de recursos disponibles. Agrupe eso en el archivo jar o instálelo en el sistema de archivos como un archivo, y cárguelo antes de ofrecer al usuario una selección de recursos.

Tuve el mismo problema y pude usar lo siguiente:

 // Load the directory as a resource URL dir_url = ClassLoader.getSystemResource(dir_path); // Turn the resource into a File object File dir = new File(dir_url.toURI()); // List the directory String files = dir.list() 

Aquí hay un poco de código de una de mis aplicaciones … Avíseme si se adapta a sus necesidades. Puede usar esto si conoce el archivo que desea usar.

 URL defaultImage = ClassA.class.getResource("/packageA/subPackage/image-name.png"); File imageFile = new File(defaultImage.toURI()); 

Espero que ayude.

Una forma confiable de construir una instancia de archivo en un recurso recuperado de un jar es copiar el recurso como una secuencia en un archivo temporal (el archivo temporal se eliminará cuando salga 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; } } 

Prueba esto:

 ClassLoader.getResourceAsStream ("some/pkg/resource.properties"); 

Hay más métodos disponibles, por ejemplo, ver aquí: http://www.javaworld.com/javaworld/javaqa/2003-08/01-qa-0808-property.html