Question

Est-il possible en Java pour construire une instance de fichier sur une ressource extraite d'un pot à travers le classloader?

Mon application utilise des fichiers à partir du pot (par défaut) ou à partir d'un répertoire de système de fichiers spécifié lors de l'exécution (entrée utilisateur). Je suis à la recherche d'une manière cohérente
a) le chargement de ces fichiers en tant que flux
b) la liste des fichiers dans le répertoire défini par l'utilisateur ou le répertoire dans le pot respectivement

Edit: Apparemment, l'approche idéale serait de rester loin de java.io.File tout à fait. Est-il possible de charger un répertoire de la liste et classpath son contenu (fichiers / entités contenues dans celui-ci)?

Était-ce utile?

La solution

ClassLoader.getResourceAsStream et sont certainement le Class.getResourceAsStream chemin à parcourir pour le chargement des données de ressources. Cependant, je ne crois pas qu'il y ait aucun moyen de « liste » le contenu d'un élément du classpath.

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

Si vous savez que vous avez bien un fichier jar, vous pouvez charger que, pour savoir <=> ce qui est disponible. Il signifie que vous aurez un code différent pour les répertoires et fichiers jar cependant.

Une alternative, si les fichiers sont créés séparément d'abord, est d'inclure une sorte de fichier manifeste contenant la liste des ressources disponibles. Bundle que dans le fichier jar ou l'inclure dans le système de fichiers sous forme de fichier, et le charger avant d'offrir à l'utilisateur un choix de ressources.

Autres conseils

J'ai eu le même problème et a 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
String files = dir.list()

Voici un peu de code d'un 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());

L'espoir qui aide.

Un moyen fiable pour construire une instance de fichier sur une ressource extraite d'un pot est à copier la ressource comme un flux dans un fichier temporaire (le fichier temporaire sera supprimé lorsque la sortie 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;
    }
}

Essayez ceci:

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

Il existe plusieurs méthodes disponibles, par exemple vois ici: http://www.javaworld.com/ JavaWorld / javaqa / 2003-08 / 01-qa-0808-property.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top