etc./StackOverFlow

Java에서 현재 작업 디렉토리를 얻는 방법은 무엇입니까?

청렴결백한 만능 재주꾼 2023. 5. 2. 22:10
반응형

질문자 :Qazi


Java를 사용하여 현재 작업 디렉토리에 액세스하고 싶습니다.

내 코드:

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

산출:

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

C 드라이브가 현재 디렉토리가 아니기 때문에 내 출력이 정확하지 않습니다.

현재 디렉토리를 얻는 방법?



코드:

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

이것은 애플리케이션이 초기화된 현재 디렉토리의 절대 경로를 인쇄합니다.


설명:

문서에서 :

java.io 패키지는 현재 사용자 디렉토리를 사용하여 상대 경로 이름을 확인합니다. 현재 디렉토리는 시스템 속성인 user.dir 로 표시되며 JVM이 호출된 디렉토리이다.


Anuj Patel

참조: 경로 작업(Java™ 자습서 > 필수 클래스 > 기본 I/O) .

java.nio.file.Pathjava.nio.file.Paths 사용하여 다음을 수행하여 Java가 현재 경로라고 생각하는 것을 표시할 수 있습니다. 이것은 7 이상용이며 NIO를 사용합니다.

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

이것은 다음을 출력합니다.

 Current relative path is: /Users/george/NetBeansProjects/Tutorials

제 경우에는 수업을 시작한 곳입니다.

절대 경로를 구성하고 있음을 나타내기 위해 선행 구분 기호를 사용하지 않고 상대 방법으로 경로를 구성하면 이 상대 경로가 시작점으로 사용됩니다.


geoO

다음은 Java 7 이상에서 작동합니다( 문서는 여기 참조).

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

Dmitry Bespalov

이것은 현재 작업 디렉토리의 경로를 제공합니다:

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

그러면 작업 디렉토리에 "Foo.txt"라는 파일의 경로가 표시됩니다.

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

편집 : 현재 디렉토리의 절대 경로를 얻으려면:

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

* 업데이트 * 현재 작업 디렉토리를 얻으려면:

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

Mark

자바 11 이상

이 솔루션은 다른 솔루션보다 우수하고 휴대성이 뛰어납니다.

 Path cwd = Path.of("").toAbsolutePath();

또는

 String cwd = Path.of("").toAbsolutePath().toString();

freedev

이것이 나를 위한 해결책이다

 File currentDir = new File("");

user2430452

c:\windows\system32 가 현재 디렉토리가 아니라고 생각하는 이유는 무엇입니까? user.dir 속성은 명시적으로 "사용자의 현재 작업 디렉터리"입니다.

달리 말하면 명령줄에서 Java를 시작하지 않는 한 c:\windows\system32가 아마도 CWD일 것입니다. 즉, 프로그램을 시작하기 위해 두 번 클릭하는 경우 CWD는 두 번 클릭하는 디렉토리가 아닐 가능성이 높습니다.

편집 : 이것은 이전 창 및/또는 Java 버전에만 해당되는 것으로 보입니다.


Paul Wagland

CodeSource#getLocation() 사용하십시오.

이것은 JAR 파일에서도 잘 작동합니다. CodeSourceProtectionDomain#getCodeSource() 로 얻을 수 있고 ProtectionDomainClass#getProtectionDomain() 으로 얻을 수 있습니다.

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

Community Wiki

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

Peter De Winter

일반적으로 File 객체로:

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

다음을 수행하는 "D:/a/b/c"와 같은 정규화된 문자열을 원할 수 있습니다.

 getCwd().getAbsolutePath()

comeGetSome

저는 Linux를 사용 중이며 다음 두 가지 접근 방식 모두에 대해 동일한 결과를 얻습니다.

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

Paths.get("") 문서

System.getProperty("user.dir") 문서


Bohdan

c:\myApp\com\foo\src\service\MyTest.java c:\myApp\com\foo\src\service 까지 인쇄하려는 경우 패키지를 포함한 현재 디렉토리에 액세스하기를 바랍니다. c:\myApp\com\foo\src\service 다음 코드를 시도할 수 있습니다.

 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);

메모:


Community Wiki

Linux 에서 터미널 에서 jar 파일을 실행하면 jar 파일의 위치에 관계없이 둘 다 동일한 String : "/home/CurrentUser" 를 반환합니다. jar 파일을 시작할 때 터미널과 함께 사용 중인 현재 디렉토리에 따라 다릅니다.

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

main 이 있는 ClassMainClass 라고 하면 다음을 시도하십시오.

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

이것은 jar 파일의 절대 경로 String 을 반환합니다.


Jan Povolný

Windows user.dir을 사용하면 예상대로 디렉터리가 반환되지만 상승된 권한으로 응용 프로그램을 시작할 때는 그렇지 않습니다(관리자 권한으로 실행). 이 경우 C:\WINDOWS\system32가 표시됩니다.


SijeDeHaan

Windows 에서만 확인 Linux,MacOs,Solaris ]에서 완벽하게 작동한다고 생각합니다. :).


같은 디렉토리에 2개의 .jar 파일이 있습니다. .jar 파일에서 동일한 디렉토리에 있는 .jar 파일을 시작하고 싶었습니다.

cmd 에서 시작할 때 현재 디렉토리가 system32 입니다.


경고!

  • 아래는 폴더 이름으로도 수행한 모든 테스트에서 꽤 잘 작동하는 것 같습니다 ;][[;'57f2g34g87-8+9-09!2#@!$%^^&() 또는 ()%&$%^@# 잘 작동합니다.
  • ProcessBuilder 사용하고 있습니다.

..

 //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 + "classes")) { basePath = basePath.substring(0, basePath.length() - 14); } // end fix if (!basePath.endsWith(File.separator)) { basePath = basePath + File.separator; } return basePath; }

GOXR3PLUS

Eclipse, netbean 또는 명령줄에서 독립 실행형 내에서 프로젝트를 실행하려고 한다고 가정합니다. 나는 그것을 고치는 방법을 썼다.

 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 + "classes")) { 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()); } }

사용하려면 파일을 읽을 기본 경로를 얻으려는 모든 곳에서 위의 메서드에 앵커 클래스를 전달할 수 있습니다. 결과는 필요한 것일 수 있습니다. D

최상의,


bachden

현재 작업 디렉토리는 다른 Java 구현에서 다르게 정의됩니다. Java 7 이전의 특정 버전에서는 작업 디렉토리를 가져오는 일관된 방법이 없었습니다. -D 하여 Java 파일을 시작하고 정보를 저장할 변수를 정의하여 이 문제를 해결할 수 있습니다.

같은 것

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

그것은 옳지 않지만 당신은 아이디어를 얻습니다. 그런 다음 System.getProperty("com.mycompany.workingDir") ...


MJB

이것은 혼란의 순간이 올 때마다 내 은색 총알입니다. (메인에서 가장 먼저 호출하십시오). 예를 들어 JVM이 IDE에 의해 다른 버전으로 미끄러졌을 수 있습니다. 이 정적 함수는 현재 프로세스 PID를 검색하고 해당 PID에서 VisualVM을 엽니다. 당신이 모든 것을 원하고 당신이 그것을 얻기 때문에 혼란은 바로 거기에서 멈춥니다...

 public static void callJVisualVM() { System.out.println("USER:DIR!:" + System.getProperty("user.dir")); //next search current jdk/jre String jre_root = null; String start = "vir"; try { java.lang.management.RuntimeMXBean runtime = java.lang.management.ManagementFactory.getRuntimeMXBean(); String jvmName = runtime.getName(); System.out.println("JVM Name = " + jvmName); long pid = Long.valueOf(jvmName.split("@")[0]); System.out.println("JVM PID = " + pid); Runtime thisRun = Runtime.getRuntime(); jre_root = System.getProperty("java.home"); System.out.println("jre_root:" + jre_root); start = jre_root.concat("\\..\\bin\\jvisualvm.exe " + "--openpid " + pid); thisRun.exec(start); } catch (Exception e) { System.getProperties().list(System.out); e.printStackTrace(); } }

Kurskinen

이것은 정확히 질문한 내용은 아니지만 중요한 참고 사항이 있습니다. Windows 시스템에서 Java를 실행할 때 Oracle 설치 프로그램은 "java.exe"를 C:\Windows\system32에 저장하고 이것이 런처 역할을 합니다. Java 응용 프로그램(경로 앞에 java.exe가 있고 Java 응용 프로그램이 명령줄에서 실행되는 경우 제외). \ WINDOWS \ system32를 맥 OS 또는 * nix에서 스크립트 구현에서 예제를 실행하는 이유는 윈도우에서 다른 결과로 돌아 오는 유지 :이 파일 ( ".")이 반환 C를 유지하는 이유입니다.

불행히도, JNI 호출을 사용하여 고유한 네이티브 런처 실행 파일을 만들고, 시작되었습니다. 다른 모든 것은 특정 상황에서 깨질 수 있는 최소한의 뉘앙스가 있을 것입니다.


Ted

이와 같이 시도하십시오. 답변이 늦었다는 것을 알고 있지만이 질문이 제기 된 java8 새 버전에서이 명백한 일이 발생했지만 ..

코드

 import java.io.File; public class Find_this_dir { public static void main(String[] args) { //some sort of a bug in java path is correct but file dose not exist File this_dir = new File(""); //but these both commands work too to get current dir // File this_dir_2 = new File(this_dir.getAbsolutePath()); File this_dir_2 = new File(new File("").getAbsolutePath()); System.out.println("new File(" + "\"\"" + ")"); System.out.println(this_dir.getAbsolutePath()); System.out.println(this_dir.exists()); System.out.println(""); System.out.println("new File(" + "new File(" + "\"\"" + ").getAbsolutePath()" + ")"); System.out.println(this_dir_2.getAbsolutePath()); System.out.println(this_dir_2.exists()); } }

이것은 작동하고 현재 경로를 보여주지만 왜 java가 new File(""); 게다가 나는 Java8 컴파일러를 사용하고 있습니다 ...

이것은 잘 작동합니다. new File(new File("").getAbsolutePath());

이제 File 객체에 현재 디렉토리가 있으므로 (예제 파일 객체는 f임),

f.getAbsolutePath() 는 문자열 변수 유형의 경로를 제공합니다...

C 드라이브가 아닌 다른 디렉토리에서 테스트하면 제대로 작동합니다.


Avon97

Java 11의 경우 다음을 사용할 수도 있습니다.

 var path = Path.of(".").toRealPath();

Volodya Lombrozo

내가 가장 좋아하는 방법은 현재 실행 중인 프로세스에 연결된 시스템 환경 변수에서 가져오는 것입니다. 이 경우 애플리케이션은 JVM에서 관리됩니다.

 String currentDir = System.getenv("PWD"); /* /home/$User/Documents/java */

홈 디렉토리, OS 버전과 같이 유용할 수 있는 다른 환경 변수를 보려면 .......

 //Home directory String HomeDir = System.getEnv("HOME"); //Outputs for unix /home/$USER //Device user String user = System.getEnv("USERNAME"); //Outputs for unix $USER

이 접근 방식의 아름다운 점은 모든 유형의 OS 플랫폼에 대해 모든 경로가 해결된다는 것입니다.


Andrew Mititi

여기에 게시 된 답변 중 어느 것도 나를 위해 일하지 않았습니다. 효과가 있었던 것은 다음과 같습니다.

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

편집: 내 코드의 최종 버전:

 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()

VenerableAgents

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


Marko Stojkovic

이것은 현재 디렉토리 이름입니다

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

이것은 현재 디렉토리 경로입니다

 String path=folder.getPath();

Prasad De Silva

출처 : http:www.stackoverflow.com/questions/4871051/how-to-get-the-current-working-directory-in-java

반응형