Je cherche un moyen d'obtenir une liste de tous les noms de ressources à partir d'un répertoire classpath donné, quelque chose comme une méthode List<String> getResourceNames (String directoryName)
.
Par exemple, étant donné un répertoire classpath x/y/z
fichiers contenant a.html
, b.html
, c.html
et un sous - répertoire d
, getResourceNames("x/y/z")
doit retourner un List<String>
contenant les chaînes suivantes: ['a.html', 'b.html', 'c.html', 'd']
.
Il devrait fonctionner à la fois pour les ressources du système de fichiers et les fichiers jar.
Je sais que je peux écrire un extrait rapide avec File
s, JarFile
s et URL
s, mais je ne veux pas réinventer la roue. Ma question est, étant donné les bibliothèques publiques existantes, quel est le moyen le plus rapide à mettre en œuvre getResourceNames
? Les piles Spring et Apache Commons sont toutes deux réalisables.
Réponses:
Scanner personnalisé
Implémentez votre propre scanner. Par exemple:
Cadre Spring
Utiliser
PathMatchingResourcePatternResolver
depuis Spring Framework.Ronmamo Reflections
Les autres techniques peuvent être lentes à l'exécution pour les énormes valeurs CLASSPATH. Une solution plus rapide consiste à utiliser l' API Reflections de ronmamo , qui précompile la recherche au moment de la compilation.
la source
new Reflections("my.package", new ResourcesScanner()).getResources(pattern)
getResourceAsStream()
avec un chemin d'accès relatif à un répertoire conduit à un FileInputStream (File), qui est défini pour lever FileNotFoundException si le fichier est un répertoire.Voici le code
Source : forums.devx.com/showthread.php?t=153784
Si vous utilisez Spring Jetez un œil à PathMatchingResourcePatternResolver
la source
File.pathSeparator
au lieu de codé:
en dur dans lagetResources
méthode.final String[] classPathElements = classPath.split(System.pathSeparator);
Utiliser des réflexions
Obtenez tout sur le chemin de classe:
Un autre exemple - obtenez tous les fichiers avec l'extension .csv de some.package :
la source
Si vous utilisez apache commonsIO, vous pouvez utiliser pour le système de fichiers (en option avec le filtre d'extension):
et pour les ressources / classpath:
Si vous ne savez pas si "directoy /" est dans le système de fichiers ou dans les ressources, vous pouvez ajouter un
ou
avant les appels et utilisez les deux en combinaison ...
la source
Donc, en termes de PathMatchingResourcePatternResolver, c'est ce qui est nécessaire dans le code:
la source
classpath*:config/*.xml
Les
Spring framework
« sPathMatchingResourcePatternResolver
est vraiment génial pour ces choses:Dépendance Maven:
la source
Utilisé une combinaison de la réponse de Rob.
la source
/' or
ou l' autre. »ou./
aucune d'entre elles n'a réellement fonctionnéAvec Spring, c'est facile. Qu'il s'agisse d'un fichier, d'un dossier ou même de plusieurs fichiers, il y a des chances que vous puissiez le faire par injection.
Cet exemple illustre l'injection de plusieurs fichiers situés dans le
x/y/z
dossier.Il fonctionne pour les ressources dans le système de fichiers ainsi que dans les fichiers JAR.
la source
Cela devrait fonctionner (si le printemps n'est pas une option):
la source
À ma façon, pas de printemps, utilisé lors d'un test unitaire:
la source
Le mécanisme le plus robuste pour répertorier toutes les ressources dans le chemin de classe est actuellement d'utiliser ce modèle avec ClassGraph , car il gère le plus large éventail possible de mécanismes de spécification de chemin de classe, y compris le nouveau système de modules JPMS. (Je suis l'auteur de ClassGraph.)
la source
Je pense que vous pouvez utiliser le [ Fournisseur de système de fichiers Zip ] [1] pour y parvenir. Lors de son utilisation,
FileSystems.newFileSystem
il semble que vous puissiez traiter les objets de ce fichier ZIP comme un fichier "normal".Dans la documentation liée ci-dessus:
La documentation du
jdk.zipfs
module dans [États Java 11] [5]:Voici un exemple artificiel que j'ai fait en utilisant vos ressources d'exemple. Notez que a
.zip
est un.jar
, mais vous pouvez adapter votre code pour utiliser à la place des ressources de chemin de classe:Installer
Java
Production
la source
Aucune des réponses n'a fonctionné pour moi, même si mes ressources ont été placées dans des dossiers de ressources et que j'ai suivi les réponses ci-dessus. Ce qui a fait un tour était:
la source
Sur la base des informations de @rob ci-dessus, j'ai créé l'implémentation que je publie dans le domaine public:
Bien que je ne m'attendais pas
getResourcesAsStream
à travailler comme ça sur un répertoire, ça marche vraiment et ça marche bien.la source