Assuma a configuração padrão do maven.
Digamos que em sua pasta de recursos você tenha um arquivo abc
.
Em Java, como posso obter o caminho absoluto para o arquivo, por favor?
Assuma a configuração padrão do maven.
Digamos que em sua pasta de recursos você tenha um arquivo abc
.
Em Java, como posso obter o caminho absoluto para o arquivo, por favor?
Respostas:
Você pode usar o ClassLoader.getResource
método para obter o recurso correto.
URL res = getClass().getClassLoader().getResource("abc.txt");
File file = Paths.get(res.toURI()).toFile();
String absolutePath = file.getAbsolutePath();
OU
Embora isso possa não funcionar o tempo todo, uma solução mais simples -
Você pode criar um File
objeto e usar o getAbsolutePath
método:
File file = new File("resources/abc.txt");
String absolutePath = file.getAbsolutePath();
target/classes/abc.txt
para referenciar o arquivo, já que este é o lugar canônico onde o Maven coloca os arquivos de recursos após o processamento (por exemplo, o plugin maven-resources pode ter feito a substituição da propriedade em abc.txt). É muito melhor usar abc.txt via getResource () do classpath.
A maneira correta que realmente funciona:
URL resource = YourClass.class.getResource("abc");
Paths.get(resource.toURI()).toFile();
Não importa agora onde o arquivo no caminho de classe está fisicamente, ele será encontrado contanto que o recurso seja realmente um arquivo e não uma entrada JAR.
(O aparentemente óbvio new File(resource.getPath())
não funciona para todos os caminhos! O caminho ainda é codificado por URL!)
new File(resource.toURI()).getAbsolutePath();
(ou seja, não acho que você precisa do objeto Caminho?)
new File(YourClass.class.getResource("abc").toURI().getPath())
se quisesse.
.getResource("/abc")
Crie a instância classLoader da classe que você precisa, então você pode acessar os arquivos ou recursos facilmente. agora você acessa o caminho usando o getPath()
método dessa classe.
ClassLoader classLoader = getClass().getClassLoader();
String path = classLoader.getResource("chromedriver.exe").getPath();
System.out.println(path);
Para retornar um arquivo ou caminho de arquivo
URL resource = YourClass.class.getResource("abc");
File file = Paths.get(resource.toURI()).toFile(); // return a file
String filepath = Paths.get(resource.toURI()).toFile().getAbsolutePath(); // return file path
Existem dois problemas em nosso caminho para o caminho absoluto:
O código a seguir nos dará todos os caminhos úteis:
URL localPackage = this.getClass().getResource("");
URL urlLoader = YourClassName.class.getProtectionDomain().getCodeSource().getLocation();
String localDir = localPackage.getPath();
String loaderDir = urlLoader.getPath();
System.out.printf("loaderDir = %s\n localDir = %s\n", loaderDir, localDir);
Aqui, ambas as funções que podem ser usadas para localização da pasta de recursos são pesquisadas. Quanto a class
, pode ser obtido de qualquer forma, estática ou dinamicamente.
Se o projeto não estiver no plug-in, o código, se executado em JUnit, imprimirá:
loaderDir = /C:.../ws/source.dir/target/test-classes/
localDir = /C:.../ws/source.dir/target/test-classes/package/
Portanto, para chegar a src / rest / resources, devemos subir e descer na árvore de arquivos. Ambos os métodos podem ser usados. Observe, não podemos usar getResource(resourceFolderName)
, pois essa pasta não está na pasta de destino. Ninguém coloca recursos nas pastas criadas, espero.
Se a classe estiver no pacote que está no plug-in, a saída do mesmo teste será:
loaderDir = /C:.../ws/plugin/bin/
localDir = /C:.../ws/plugin/bin/package/
Portanto, novamente devemos subir e descer na árvore de pastas.
O mais interessante é o caso quando o pacote é lançado no plugin. Como teste do plugin JUnit, para nosso exemplo. O resultado é:
loaderDir = /C:.../ws/plugin/
localDir = /package/
Aqui podemos obter o caminho absoluto apenas combinando os resultados de ambas as funções. E isso não é suficiente. Entre eles devemos colocar o caminho local do local onde estão os pacotes de classes, relativamente à pasta do plugin. Provavelmente, você terá que inserir algo como src
ousrc/test/resource
aqui.
Você pode inserir o código no seu e ver os caminhos que possui.