Encontrar diretório da classe em tempo de execução

8 respostas
E

Olá pessoal, preciso de uma ajudinha, Tenho que fazer a serialização de uma lista (salvar e carregar o arquivo), até ai tudo bem, mas gostaria de fazer o seguinte, ao invés de gravar em um caminho fíxo(ex: “C:\Data”) eu gostaria de pegar o diretório em que minha classe Main está localizada, em tempo de execução, e atribuir como caminho para o arquivo a ser gravado para eu poder rodar em diferentes máquinas sem precisar alterar o caminho dos arquivos no código fonte, tem como fazer isso no java?

8 Respostas

V

Você pode obter o caminho onde a aplicação está rodando através de

File caminho = new File(".");

Mas no Java é virtualmente impossível encontrar o caminho do main. É uma das coisas que odeio em Java.

E

Cara era exatamente isso que eu queria. encontrei o caminho do meu projeto, agora basta salvar os arquivos .dat nessa pasta, aí não importa onde eu colocar o projeto, ele sempre vai salvar o arquivo. ao contrário de antes que, eu deveria ter um diretório fixo. Amigo vc não faz idéia do quanto me ajudou, de verdade Valeu mesmo.

V

Esse não é o caminho do projeto, mas de onde a aplicação está rodando. São coisas diferentes. O usuário poderá alterar o atalho da aplicação e alterar a opção “Executar em”, e esse diretório do File(".") se alterará. Se isso está ok para você, então, problema resolvido. :slight_smile:

D

Olá pessoa,

Estou usando ubuntu 11.04 com java na versão:

java version “1.6.0_26”
Java™ SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot™ Server VM (build 20.1-b02, mixed mode)

e ao printar new File(".") ele mostra o caminho do diretório do usuário: /home/diego

tentei encontrar referencias na internet sobre o atalho, mas não encontrei…

então, o atalho retorna o que exatamente? Caminho da aplicação ou caminho do userdir?

V

É o que falei. O new File(".") retorna o local onde a aplicação foi configurada para ser disparada.
Não sei os detalhes específicos do Ubuntu, mas pelo que você descreveu, ele está configurado para disparar no diretório do usuário.

G

Um exeplo para ajudar a entender melhor a diferença:

No diretório C:\Temp\testeUserDir foi criada e compilada uma classe chamada ShowCurrentDir:

public class ShowCurrentDir { public static void main(String[] args) { System.out.println("Diretorio atual: " + new java.io.File(".").getAbsolutePath()); } }

Se o programa mostrasse o diretório da aplicação, então o resultado seria sempre igual independendo de onde se está ao chamar.
Sempre iria imprimir C:\Temp\testeUserDir
Mas ao chamá-la de vários lugares, temos o seguinte:

C:\Temp\testeUserDir>set CLASSPATH=C:\Temp\testeUserDir
C:\Temp\testeUserDir>java ShowCurrentDir
Diretorio atual: C:\Temp\testeUserDir.
C:\Temp\testeUserDir>cd …
C:\Temp>java ShowCurrentDir
Diretorio atual: C:\Temp.
C:\Temp>cd \windows\system32
C:\Windows\System32>java ShowCurrentDir
Diretorio atual: C:\Windows\System32.

dieego_,
Tente executar a aplicação pela console, fica mais fácil de ter controle sobre o diretório de onde se está chamando, e assim entender melhor o que está acontecendo.

L

Use este método
https://sites.google.com/site/lucasportela/home/java/retornopromptdecomandonojava

troque o comando por: wmic process where name=“nomeDoSeuPrograma.exe” get executablepath

D

Agora entendi!

Estou executando pelo eclipse e abri o eclipse por atalho com o usuário “diego”
Então o ubuntu assume que o diretório que chamou o eclipse é o diretório do usuário, portanto /home/diego

Obrigado!

Criado 12 de maio de 2010
Ultima resposta 9 de ago. de 2011
Respostas 8
Participantes 5