Estou procurando uma maneira de obter uma lista de todos os nomes de recursos de um determinado diretório de caminho de classe, algo como um método List<String> getResourceNames (String directoryName)
.
Por exemplo, dado um diretório classpath x/y/z
contendo arquivos a.html
, b.html
, c.html
e um subdiretório d
, getResourceNames("x/y/z")
deve retornar um List<String>
contendo as seguintes cadeias: ['a.html', 'b.html', 'c.html', 'd']
.
Ele deve funcionar tanto para recursos no sistema de arquivos quanto em jars.
Eu sei que eu posso escrever um trecho rápido com File
s, JarFile
s e URL
s, mas eu não quero reinventar a roda. Minha pergunta é, dadas as bibliotecas existentes publicamente disponíveis, qual é a maneira mais rápida de implementar getResourceNames
? As pilhas Spring e Apache Commons são viáveis.
Respostas:
Scanner personalizado
Implemente seu próprio scanner. Por exemplo:
Spring Framework
Use a
PathMatchingResourcePatternResolver
partir do Spring Framework.Reflexões de Ronmamo
As outras técnicas podem ser lentas no tempo de execução para valores enormes de CLASSPATH. Uma solução mais rápida é usar a API de reflexões da ronmamo , que pré-compila a pesquisa em tempo de compilação.
fonte
new Reflections("my.package", new ResourcesScanner()).getResources(pattern)
getResourceAsStream()
com um caminho relativo para um diretório leva a um FileInputStream (File), que é definido para lançar FileNotFoundException se o arquivo for um diretório.Aqui está o código
Fonte : forums.devx.com/showthread.php?t=153784
Se você estiver usando o Spring, dê uma olhada no PathMatchingResourcePatternResolver
fonte
File.pathSeparator
vez de codificado:
nogetResources
método.final String[] classPathElements = classPath.split(System.pathSeparator);
Usando reflexões
Obtenha tudo no caminho de classe:
Outro exemplo - obtenha todos os arquivos com extensão .csv em some.package :
fonte
Se você usar o apache commonsIO, poderá usar o sistema de arquivos (opcionalmente com o filtro de extensão):
e para recursos / caminho de classe:
Se você não souber se "diretório /" está no sistema de arquivos ou nos recursos, você pode adicionar um
ou
antes das chamadas e use ambos em combinação ...
fonte
Portanto, em termos de PathMatchingResourcePatternResolver, é isso que é necessário no código:
fonte
classpath*:config/*.xml
Os
Spring framework
'sPathMatchingResourcePatternResolver
é realmente impressionante para estas coisas:Dependência do Maven:
fonte
Usou uma combinação da resposta de Rob.
fonte
/' or
.` ou./
nenhum dos quais realmente funcionouCom a Primavera é fácil. Seja um arquivo, uma pasta ou até vários arquivos, há chances de que você possa fazer isso por injeção.
Este exemplo demonstra a injeção de vários arquivos localizados na
x/y/z
pastaEle funciona para recursos no sistema de arquivos e também em JARs.
fonte
Isso deve funcionar (se a primavera não for uma opção):
fonte
Do meu jeito, no Spring, usado durante um teste de unidade:
fonte
O mecanismo mais robusto para listar todos os recursos no caminho de classe atualmente é usar esse padrão com o ClassGraph , porque ele lida com a maior variedade possível de mecanismos de especificação de caminho de classe , incluindo o novo sistema de módulo JPMS. (Eu sou o autor do ClassGraph.)
fonte
Eu acho que você pode aproveitar o [ Fornecedor do sistema de arquivos zip ] [1] para conseguir isso. Ao usar
FileSystems.newFileSystem
lo, parece que você pode tratar os objetos nesse ZIP como um arquivo "regular".Na documentação vinculada acima:
A documentação para o
jdk.zipfs
módulo em [Java 11 states] [5]:Aqui está um exemplo artificial que eu fiz usando seus recursos de exemplo. Observe que a
.zip
é a.jar
, mas você pode adaptar seu código para usar os recursos do caminho de classe:Configuração
Java
Resultado
fonte
Nenhuma das respostas funcionou para mim, embora eu tenha meus recursos colocados em pastas de recursos e seguido as respostas acima. O que fez um truque foi:
fonte
Com base nas informações de @rob acima, criei a implementação que estou lançando para o domínio público:
Embora eu não esperasse
getResourcesAsStream
trabalhar assim em um diretório, ele realmente funciona e funciona bem.fonte