web-dev-qa-db-fra.com

Java ressource en tant que fichier

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

Mon application utilise des fichiers du fichier jar (valeur 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 sous forme de flux
b) listant les fichiers du répertoire défini par l'utilisateur ou du répertoire du fichier jar

Edit: Apparemment, l’idéal serait de rester loin de Java.io.File. Est-il possible de charger un répertoire à partir du classpath et d’en lister le contenu (fichiers/entités qu’il contient)?

119
Mantrum

ClassLoader.getResourceAsStream et Class.getResourceAsStream sont définitivement la voie à suivre pour charger les données de ressources. 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 ClassLoaderpourrait générer des données à la volée, en fonction du nom de la ressource qui lui est demandé. Si vous examinez l'API ClassLoader (qui est essentiellement le fonctionnement du mécanisme de chemin de classes), vous verrez qu'il n'y a rien qui vous permette de faire ce que vous voulez.

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 et chargez-le avant de proposer à l'utilisateur un choix de ressources.

57
Jon Skeet

J'ai eu le même problème et j'ai pu utiliser ce qui suit:

// 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()
97
Chris Conway

Voici un peu de code d'une de mes applications ... Faites-moi savoir si cela répond à 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 ça t'as aidé.

54
Maurice Rogers

Un moyen fiable de créer une instance de fichier sur une ressource extraite d'un fichier jar consiste à copier la ressource sous forme de flux dans un fichier temporaire (le fichier temporaire sera supprimé à la fermeture de la machine virtuelle Java):

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;
    }
}
10
Lukas Masuch

Essaye ça:

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

Plusieurs méthodes sont disponibles, par exemple. voir ici: http://www.javaworld.com/javaworld/javaqa/2003-08/01-qa-0808-property.html

4
topchef
2
Fish