Ressource Java en fichier

Existe-t-il un moyen en Java de construire une instance de fichier sur une ressource extraite d’un jar via le chargeur de classes?

Mon application utilise des fichiers du fichier jar (par défaut) ou d’un répertoire de système de fichiers spécifié lors de l’exécution (entrée utilisateur). Je cherche un moyen cohérent de
a) charger ces fichiers en tant que stream
b) répertoriant les fichiers dans le répertoire défini par l’utilisateur ou le répertoire dans le jar respectivement

Edit: Apparemment, l’approche idéale serait de restr loin de java.io.File tout à fait. Existe-t-il un moyen de charger un répertoire à partir du classpath et d’en répertorier le contenu (fichiers / entités qu’il contient)?

ClassLoader.getResourceAsStream et Class.getResourceAsStream sont certainement le moyen de charger les données de ressource. Cependant, je ne crois pas qu’il soit possible de “lister” le contenu d’un élément du classpath.

Dans certains cas, cela peut être simplement impossible – par exemple, un ClassLoader peut générer des données à la volée, en fonction du nom de ressource demandé. Si vous regardez l’API ClassLoader (qui est fondamentalement ce à travers lequel fonctionne le mécanisme classpath), vous verrez qu’il n’y a rien à faire.

Si vous savez que vous avez réellement un fichier jar, vous pouvez le charger avec ZipInputStream pour savoir ce qui est disponible. Cela signifie que vous aurez un code différent pour les répertoires et les fichiers jar.

Une alternative, si les fichiers sont créés séparément en premier, consiste à inclure une sorte de fichier manifeste contenant la liste des ressources disponibles. Regroupez-le dans le fichier JAR ou incluez-le dans le système de fichiers en tant que fichier, puis chargez-le avant d’offrir à l’utilisateur un choix de ressources.

J’ai eu le même problème et j’ai pu utiliser les éléments suivants:

 // 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 Ssortingng files = dir.list() 

Voici un peu de code d’une de mes applications … Faites-moi savoir si cela convient à vos besoins. Vous pouvez l’utiliser si vous connaissez le fichier que vous souhaitez utiliser.

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

J’espère que cela pourra aider.

Un moyen fiable de construire une instance de fichier sur une ressource extraite d’un fichier jar consiste à copier la ressource en tant que stream dans un fichier temporaire (le fichier temporaire sera supprimé à la fermeture de la machine JVM):

 public static File getResourceAsFile(Ssortingng resourcePath) { try { InputStream in = ClassLoader.getSystemClassLoader().getResourceAsStream(resourcePath); if (in == null) { return null; } File tempFile = File.createTempFile(Ssortingng.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; } } 

Essaye ça:

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

Il y a plus de méthodes disponibles, par exemple voir ici: http://www.javaworld.com/javaworld/javaqa/2003-08/01-qa-0808-property.html