Obtendo o diretório de trabalho atual em Java

Desejo acessar meu diretório de trabalho atual usando

String current = new java.io.File( "." ).getCanonicalPath(); System.out.println("Current dir:"+current); String currentDir = System.getProperty("user.dir"); System.out.println("Current dir using System:" +currentDir); 

Saída:

 Current dir: C:\WINDOWS\system32 Current dir using System: C:\WINDOWS\system32 

Minha saída não está correta porque a unidade C não é meu diretório atual. Precisa de ajuda nesse sentido.

 public class JavaApplication1 { public static void main(String[] args) { System.out.println("Working Directory = " + System.getProperty("user.dir")); } } 

Isso imprimirá um caminho absoluto completo de onde seu aplicativo foi inicializado.

Veja: http://docs.oracle.com/javase/tutorial/essential/io/pathOps.html

Usando java.nio.file.Path e java.nio.file.Paths , você pode fazer o seguinte para mostrar o que o Java considera como seu caminho atual. Isso para 7 e em diante e usa o NIO.

 Path currentRelativePath = Paths.get(""); String s = currentRelativePath.toAbsolutePath().toString(); System.out.println("Current relative path is: " + s); 

Esta saída Current relative path is: /Users/george/NetBeansProjects/Tutorials que no meu caso é de onde eu corri a class. Construir caminhos de maneira relativa, por não usar um separador de entrelinha para indicar que você está construindo um caminho absoluto, usará esse caminho relativo como ponto inicial.

O seguinte trabalha no Java 7 e acima (veja aqui para documentação).

 import java.nio.file.Paths; Paths.get(".").toAbsolutePath().normalize().toString(); 

Isto lhe dará o caminho do seu diretório de trabalho atual:

 Path path = FileSystems.getDefault().getPath("."); 

E isso lhe dará o caminho para um arquivo chamado “Foo.txt” no diretório de trabalho:

 Path path = FileSystems.getDefault().getPath("Foo.txt"); 

Edit: Para obter um caminho absoluto do diretório atual a partir da raiz do sistema de arquivos:

 Path path = FileSystems.getDefault().getPath(".").toAbsolutePath(); 

Esta é a solução para mim

 File currentDir = new File(""); 

O que faz você pensar que c: \ windows \ system32 não é seu diretório atual? A propriedade user.dir é explicitamente para ser “Diretório de trabalho atual do usuário”.

Para colocar de outra forma, a menos que você inicie o Java a partir da linha de comando, c: \ windows \ system32 provavelmente é o seu CWD. Ou seja, se você clicar duas vezes para iniciar seu programa, é improvável que o CWD seja o diretório do qual você está clicando duas vezes.

Edit : Parece que isso só é verdade para janelas antigas e / ou versões de Java.

 this.getClass().getClassLoader().getResource("").getPath() 

Use CodeSource#getLocation() .

Isso funciona bem em arquivos JAR também. Você pode obter CodeSource por ProtectionDomain#getCodeSource() e o ProtectionDomain por sua vez, pode ser obtido pela Class#getProtectionDomain() .

 public class Test { public static void main(String... args) throws Exception { URL location = Test.class.getProtectionDomain().getCodeSource().getLocation(); System.out.println(location.getFile()); } } 

geralmente, como um object File:

 File getCwd() { return new File("").getAbsoluteFile(); } 

você pode querer ter uma string completa como “D: / a / b / c” fazendo:

 getCwd().getAbsolutePath() 

Estou no Linux e obtenho o mesmo resultado para ambas as abordagens:

 @Test public void aaa() { System.err.println(Paths.get("").toAbsolutePath().toString()); System.err.println(System.getProperty("user.dir")); } 

Paths.get("") docs

System.getProperty("user.dir") docs

O diretório de trabalho atual é definido de forma diferente em diferentes implementações Java. Para determinada versão anterior ao Java 7, não havia uma maneira consistente de obter o diretório de trabalho. Você poderia contornar isso iniciando o arquivo Java com -D e definindo uma variável para conter as informações

Algo como

 java -D com.mycompany.workingDir="%0" 

Isso não está certo, mas você entendeu. Em seguida, System.getProperty("com.mycompany.workingDir")

Eu encontrei esta solução nos comentários que é melhor que outros e mais portável:

 String cwd = new File("").getAbsolutePath(); 

Espero que você queira acessar o diretório atual, incluindo o pacote, ou seja, se o seu programa Java está em c:\myApp\com\foo\src\service\MyTest.java e você deseja imprimir até c:\myApp\com\foo\src\service então você pode tentar o seguinte código:

 String myCurrentDir = System.getProperty("user.dir") + File.separator + System.getProperty("sun.java.command") .substring(0, System.getProperty("sun.java.command").lastIndexOf(".")) .replace(".", File.separator); System.out.println(myCurrentDir); 

Nota: Este código é testado apenas no Windows com o Oracle JRE.

No Linux, quando você executa um arquivo jar a partir do terminal , ambos retornam a mesma String : “/ home / CurrentUser” , não importa onde esteja o arquivo jar. Depende apenas do diretório atual que você está usando com o seu terminal, quando você inicia o arquivo jar.

 Paths.get("").toAbsolutePath().toString(); System.getProperty("user.dir"); 

Se sua Class com main for chamada de MainClass , tente:

 MainClass.class.getProtectionDomain().getCodeSource().getLocation().getFile(); 

Isso retornará uma String com o caminho absoluto do arquivo jar .

Usar o Windows user.dir retorna o diretório conforme o esperado, mas NÃO quando você inicia seu aplicativo com direitos elevados (executado como admin), nesse caso, você obtém C: \ WINDOWS \ system32

Mencione que ele é verificado apenas no Windows mas acho que funciona perfeitamente em outros Sistemas Operacionais [ Linux,MacOs,Solaris ] :).


Eu tinha 2 arquivos .jar no mesmo diretório. Eu queria do arquivo .jar para iniciar o outro arquivo .jar que está no mesmo diretório.

O problema é que quando você o inicia a partir do cmd o diretório atual é system32 .


Avisos!

  • O abaixo parece funcionar muito bem em todos os testes que fiz mesmo com o nome da pasta ;][[;'57f2g34g87-8+9-09!2#@!$%^^&() ou ()%&$%^@# funciona bem.
  • Eu estou usando o ProcessBuilder com o abaixo da seguinte forma:

🍂 ..

 //The class from which i called this was the class `Main` String path = getBasePathForClass(Main.class); String applicationPath= new File(path + "application.jar").getAbsolutePath(); System.out.println("Directory Path is : "+applicationPath); //Your know try catch here //Mention that sometimes it doesn't work for example with folder `;][[;'57f2g34g87-8+9-09!2#@!$%^^&()` ProcessBuilder builder = new ProcessBuilder("java", "-jar", applicationPath); builder.redirectErrorStream(true); Process process = builder.start(); //...code 

🍂 getBasePathForClass(Class classs) :

  /** * Returns the absolute path of the current directory in which the given * class * file is. * * @param classs * @return The absolute path of the current directory in which the class * file is. * @author GOXR3PLUS[StackOverFlow user] + bachden [StackOverFlow user] */ public static final String getBasePathForClass(Class classs) { // Local variables File file; String basePath = ""; boolean failed = false; // Let's give a first try try { file = new File(classs.getProtectionDomain().getCodeSource().getLocation().toURI().getPath()); if (file.isFile() || file.getPath().endsWith(".jar") || file.getPath().endsWith(".zip")) { basePath = file.getParent(); } else { basePath = file.getPath(); } } catch (URISyntaxException ex) { failed = true; Logger.getLogger(classs.getName()).log(Level.WARNING, "Cannot firgue out base path for class with way (1): ", ex); } // The above failed? if (failed) { try { file = new File(classs.getClassLoader().getResource("").toURI().getPath()); basePath = file.getAbsolutePath(); // the below is for testing purposes... // starts with File.separator? // String l = local.replaceFirst("[" + File.separator + // "/\\\\]", "") } catch (URISyntaxException ex) { Logger.getLogger(classs.getName()).log(Level.WARNING, "Cannot firgue out base path for class with way (2): ", ex); } } // fix to run inside eclipse if (basePath.endsWith(File.separator + "lib") || basePath.endsWith(File.separator + "bin") || basePath.endsWith("bin" + File.separator) || basePath.endsWith("lib" + File.separator)) { basePath = basePath.substring(0, basePath.length() - 4); } // fix to run inside netbeans if (basePath.endsWith(File.separator + "build" + File.separator + "classs")) { basePath = basePath.substring(0, basePath.length() - 14); } // end fix if (!basePath.endsWith(File.separator)) { basePath = basePath + File.separator; } return basePath; } 

Nenhuma das respostas postadas aqui funcionou para mim. Aqui está o que funcionou:

 java.nio.file.Paths.get( getClass().getProtectionDomain().getCodeSource().getLocation().toURI() ); 

Edit: A versão final no meu código:

 URL myURL = getClass().getProtectionDomain().getCodeSource().getLocation(); java.net.URI myURI = null; try { myURI = myURL.toURI(); } catch (URISyntaxException e1) {} return java.nio.file.Paths.get(myURI).toFile().toString() 

Suponha que você esteja tentando executar seu projeto dentro do eclipse, ou netbean ou independente da linha de comando. Eu escrevi um método para consertá-lo

 public static final String getBasePathForClass(Class clazz) { File file; try { String basePath = null; file = new File(clazz.getProtectionDomain().getCodeSource().getLocation().toURI().getPath()); if (file.isFile() || file.getPath().endsWith(".jar") || file.getPath().endsWith(".zip")) { basePath = file.getParent(); } else { basePath = file.getPath(); } // fix to run inside eclipse if (basePath.endsWith(File.separator + "lib") || basePath.endsWith(File.separator + "bin") || basePath.endsWith("bin" + File.separator) || basePath.endsWith("lib" + File.separator)) { basePath = basePath.substring(0, basePath.length() - 4); } // fix to run inside netbean if (basePath.endsWith(File.separator + "build" + File.separator + "classs")) { basePath = basePath.substring(0, basePath.length() - 14); } // end fix if (!basePath.endsWith(File.separator)) { basePath = basePath + File.separator; } return basePath; } catch (URISyntaxException e) { throw new RuntimeException("Cannot firgue out base path for class: " + clazz.getName()); } } 

Para usar, em todos os lugares que você deseja obter o caminho base para ler o arquivo, você pode passar sua class de âncora para o método acima, o resultado pode ser a coisa que você precisa: D

melhor,

este é o nome do diretório atual

 String path="/home/prasad/Desktop/folderName"; File folder = new File(path); String folderName=folder.getAbsoluteFile().getName(); 

este é o caminho do diretório atual

 String path=folder.getPath(); 

System.getProperty("java.class.path")

    Intereting Posts