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

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?

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.

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.

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:

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?

É 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.

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.

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

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!