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.getResourcemé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 Fileobjeto e usar o getAbsolutePathmétodo:
File file = new File("resources/abc.txt");
String absolutePath = file.getAbsolutePath();
target/classes/abc.txtpara 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 srcousrc/test/resource aqui.
Você pode inserir o código no seu e ver os caminhos que possui.