Estou tentando ler um arquivo de texto definido na variável de sistema CLASSPATH. Não é uma variável de usuário.
Estou tentando obter fluxo de entrada para o arquivo como abaixo:
Coloque o diretório do arquivo ( D:\myDir
) em CLASSPATH e tente abaixo:
InputStream in = this.getClass().getClassLoader().getResourceAsStream("SomeTextFile.txt");
InputStream in = this.getClass().getClassLoader().getResourceAsStream("/SomeTextFile.txt");
InputStream in = this.getClass().getClassLoader().getResourceAsStream("//SomeTextFile.txt");
Coloque o caminho completo do arquivo ( D:\myDir\SomeTextFile.txt
) no CLASSPATH e tente o mesmo acima das 3 linhas de código.
Infelizmente, NENHUM deles está funcionando e estou sempre entrando null
no meu InputStream in
.
getResourceAsStream()
File.Separator
- porque você não está pedindo um arquivo , está pedindo um recurso . É importante entender que a abstração envolvida não é o sistema de arquivos.Class.getResourceAsStream
é realmente um método conveniente para chamarClassLoader.getResourceAsStream
, mas com o recurso adicional de recursos "relativos". Se você estiver especificando um recurso absoluto, qualquer chamada usando o mesmo carregador de classe fará a mesma coisa.Ao usar o Spring Framework (como uma coleção de utilitários ou contêiner - você não precisa usar a última funcionalidade), pode usar facilmente a abstração de Recurso .
Através da interface do recurso , você pode acessar o recurso como InputStream , URL , URI ou arquivo . Alterar o tipo de recurso para, por exemplo, um recurso do sistema de arquivos é uma simples questão de alterar a instância.
fonte
É assim que leio todas as linhas de um arquivo de texto no meu caminho de classe, usando o Java 7 NIO:
NB, este é um exemplo de como isso pode ser feito. Você precisará fazer melhorias conforme necessário. Este exemplo funcionará apenas se o arquivo estiver realmente presente no seu caminho de classe; caso contrário, uma NullPointerException será lançada quando getResource () retornar nulo e .toURI () for invocado nele.
Além disso, desde o Java 7, uma maneira conveniente de especificar conjuntos de caracteres é usar as constantes definidas em
java.nio.charset.StandardCharsets
(estas são, de acordo com seus javadocs , "garantidas para estar disponíveis em todas as implementações da plataforma Java").Portanto, se você souber que a codificação do arquivo é UTF-8, especifique explicitamente o conjunto de caracteres
StandardCharsets.UTF_8
fonte
Spring
'sStreamUtils.copyToString
.Tente por favor
Suas tentativas não deram certo porque somente o carregador de classe para suas aulas é capaz de carregar a partir do classpath. Você usou o carregador de classes para o próprio sistema java.
fonte
Para realmente ler o conteúdo do arquivo, eu gosto de usar o Commons IO + Spring Core. Supondo Java 8:
Alternativamente:
fonte
Para obter o caminho absoluto da classe, tente o seguinte:
fonte
De alguma forma, a melhor resposta não funciona para mim. Eu preciso usar um código um pouco diferente.
Espero que isso ajude aqueles que encontram o mesmo problema.
fonte
Se você usa o Goiaba:
podemos obter URL de CLASSPATH:
ou InputStream:
fonte
Para ler o conteúdo de um arquivo em uma String a partir de
classpath
, você pode usar o seguinte:Nota:
IOUtils
faz parte deCommons IO
.Chame assim:
fonte
Você diz "Estou tentando ler um arquivo de texto definido na variável de sistema CLASSPATH". Meu palpite é que está no Windows e você está usando esta caixa de diálogo feia para editar as "Variáveis do sistema".
Agora você executa seu programa Java no console. E isso não funciona: o console obtém uma cópia dos valores das variáveis do sistema uma vez quando é iniciado . Isso significa que qualquer alteração na caixa de diálogo posteriormente não terá nenhum efeito.
Existem estas soluções:
Inicie um novo console após cada alteração
Use
set CLASSPATH=...
no console para definir a cópia da variável no console e, quando seu código funcionar, cole o último valor na caixa de diálogo da variável.Coloque a chamada para Java no
.BAT
arquivo e clique duas vezes nele. Isso criará um novo console sempre (copiando assim o valor atual da variável do sistema).CUIDADO: Se você também tiver uma variável Usuário
CLASSPATH
, ela sombreará a variável do sistema. É por isso que geralmente é melhor colocar a chamada para seu programa Java em um.BAT
arquivo e definir o caminho de classe (usandoset CLASSPATH=
) em vez de depender de um sistema global ou variável de usuário.Isso também garante que você possa ter mais de um programa Java trabalhando no seu computador, pois eles provavelmente terão caminhos de classe diferentes.
fonte
Minha resposta não é exatamente o que é solicitado na pergunta. Em vez disso, estou dando uma solução exatamente com a facilidade com que podemos ler um arquivo em nosso aplicativo java a partir do caminho da classe do projeto.
Por exemplo, suponha que um nome de arquivo de configuração example.xml esteja localizado em um caminho como abaixo: -
com.myproject.config.dev
e nosso arquivo de classe executável java está no caminho abaixo: -
com.myproject.server.main
Agora, basta verificar o caminho acima, que é o diretório / pasta comum mais próximo, de onde você pode acessar o diretório / pasta dev e principal (com.myproject.server.main - onde existe a classe executável java do aplicativo) - Podemos ver é a pasta / diretório myproject que é o diretório / pasta comum mais próximo, de onde podemos acessar nosso arquivo example.xml. Portanto, a partir de uma classe executável java reside na pasta / diretório main , temos que voltar duas etapas como ../../ para acessar o meu projeto . Agora, depois disso, veja como podemos ler o arquivo: -
fonte
Se você compilar seu projeto no arquivo jar: você pode colocar o arquivo em resources / files / your_file.text ou pdf;
e use este código:
fonte
Estou usando o servidor de aplicativos webshpere e meu módulo da Web é baseado no Spring MVC. Eles
Test.properties
estavam localizados na pasta de recursos, tentei carregar esses arquivos usando o seguinte:this.getClass().getClassLoader().getResourceAsStream("Test.properties");
this.getClass().getResourceAsStream("/Test.properties");
Nenhum dos códigos acima carregou o arquivo.
Mas com a ajuda do código abaixo, o arquivo de propriedades foi carregado com sucesso:
Thread.currentThread().getContextClassLoader().getResourceAsStream("Test.properties");
Obrigado ao usuário "user1695166" .
fonte
Usar
org.apache.commons.io.FileUtils.readFileToString(new File("src/test/resources/sample-data/fileName.txt"));
fonte
Cenário:
1)
client-service-1.0-SNAPSHOT.jar
tem dependênciaread-classpath-resource-1.0-SNAPSHOT.jar
2) queremos ler o conteúdo dos recursos do caminho da classe (
sample.txt
) deread-classpath-resource-1.0-SNAPSHOT.jar
throughclient-service-1.0-SNAPSHOT.jar
.3)
read-classpath-resource-1.0-SNAPSHOT.jar
temsrc/main/resources/sample.txt
1.
pom.xml
deread-classpath-resource-1.0-SNAPSHOT.jar
2.
ClassPathResourceReadTest.java
classe emread-classpath-resource-1.0-SNAPSHOT.jar
que carrega o conteúdo do arquivo de recursos do caminho da classe.3.
pom.xml
declient-service-1.0-SNAPSHOT.jar
4.
AccessClassPathResource.java
instanciar aClassPathResourceReadTest.java
classe onde, ele irá carregarsample.txt
e imprimir seu conteúdo também.Execute o jar executável da seguinte maneira:
fonte
Não use o método getClassLoader () e use o "/" antes do nome do arquivo. "/" é muito importante
fonte
/
tem exatamente o mesmo efeito que usar ogetClassLoader()
métodofonte
você precisa colocar sua 'variável de sistema' no caminho de classe java.
fonte