Digamos que eu terminei minha aula principal C:\Users\Justian\Documents\
. Como posso fazer com que meu programa mostre que está disponível C:\Users\Justian\Documents
?
O hard-Coding não é uma opção - ele precisa ser adaptável se for movido para outro local.
Quero despejar vários arquivos CSV em uma pasta, fazer com que o programa reconheça todos os arquivos, depois carregue os dados e os manipule. Eu realmente só quero saber como navegar até essa pasta.
java
path
working-directory
Justian Meyer
fonte
fonte
Respostas:
Uma maneira seria usar a propriedade do sistema,
System.getProperty("user.dir");
que fornecerá "O diretório de trabalho atual quando as propriedades foram inicializadas". Provavelmente é isso que você deseja. para descobrir onde ojava
comando foi emitido, no seu caso, no diretório com os arquivos a serem processados, mesmo que o arquivo .jar real possa residir em outro lugar na máquina. Ter o diretório do arquivo .jar real não é útil na maioria dos casos.O seguinte irá imprimir o diretório atual de onde o comando foi chamado, independentemente de onde o arquivo .class ou .jar o arquivo .class está.
se você estiver em
/User/me/
e seu arquivo .jar contendo o código acima estiver no/opt/some/nested/dir/
comandojava -jar /opt/some/nested/dir/test.jar Test
será geradocurrent dir = /User/me
.Você também deve olhar como bônus em usar um bom analisador de argumentos de linha de comando orientado a objetos. Eu recomendo altamente JSAP , o Java Simple Argument Parser. Isso permitiria que você usasse
System.getProperty("user.dir")
e, alternativamente, passasse outra coisa para anular o comportamento. Uma solução muito mais sustentável. Isso tornaria a passagem no diretório para o processo muito fácil de fazer e seria capaz de retrocederuser.dir
se nada fosse passado.fonte
user.dir
é muito fácil de usar. System.getProperty ("user.dir");Use
CodeSource#getLocation()
. Isso também funciona bem em arquivos JAR. Você pode obterCodeSource
porProtectionDomain#getCodeSource()
e, porProtectionDomain
sua vez, pode ser obtido porClass#getProtectionDomain()
.Atualizar conforme comentário do OP:
Isso exigiria codificar / conhecer seu caminho relativo em seu programa. Em vez disso, considere adicionar seu caminho ao caminho de classe para que você possa usar
ClassLoader#getResource()
Ou para passar seu caminho como
main()
argumento.fonte
getLocation()
método. Outros obviamente não vão funcionar.Imprime algo como:
Observe que
File.getCanonicalPath()
lança uma IOException marcada, mas removerá coisas como../../../
fonte
fonte
Acabei de usar:
...
fonte
Paths.get("").toAbsolutePath();
Paths.get("my/file").toAbsolutePath()
isso/my/file
, o que definitivamente não é o cwd.Se você deseja obter seu diretório de trabalho atual, use a seguinte linha
fonte
Se você quiser o caminho absoluto do código-fonte atual, minha sugestão é:
fonte
Quem disse que sua classe principal está em um arquivo em um disco rígido local? As classes são mais frequentemente agrupadas em arquivos JAR e, às vezes, carregadas pela rede ou mesmo geradas instantaneamente.
Então, o que você realmente deseja fazer? Provavelmente existe uma maneira de fazer isso que não faz suposições sobre a origem das classes.
fonte