질문자 :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.Path
및 java.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("");
user2430452c:\windows\system32 가 현재 디렉토리가 아니라고 생각하는 이유는 무엇입니까? user.dir
속성은 명시적으로 "사용자의 현재 작업 디렉터리"입니다.
달리 말하면 명령줄에서 Java를 시작하지 않는 한 c:\windows\system32가 아마도 CWD일 것입니다. 즉, 프로그램을 시작하기 위해 두 번 클릭하는 경우 CWD는 두 번 클릭하는 디렉토리가 아닐 가능성이 높습니다.
편집 : 이것은 이전 창 및/또는 Java 버전에만 해당되는 것으로 보입니다.
Paul WaglandCodeSource#getLocation()
사용하십시오.
이것은 JAR 파일에서도 잘 작동합니다. CodeSource
는 ProtectionDomain#getCodeSource()
로 얻을 수 있고 ProtectionDomain
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()); } }
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")
문서
Bohdanc:\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 WikiLinux 에서 터미널 에서 jar 파일을 실행하면 jar 파일의 위치에 관계없이 둘 다 동일한 String
: "/home/CurrentUser" 를 반환합니다. jar 파일을 시작할 때 터미널과 함께 사용 중인 현재 디렉토리에 따라 다릅니다.
Paths.get("").toAbsolutePath().toString(); System.getProperty("user.dir");
main
이 있는 Class
가 MainClass
라고 하면 다음을 시도하십시오.
MainClass.class.getProtectionDomain().getCodeSource().getLocation().getFile();
이것은 jar 파일의 절대 경로 String
을 반환합니다.
Jan PovolnýWindows user.dir을 사용하면 예상대로 디렉터리가 반환되지만 상승된 권한으로 응용 프로그램을 시작할 때는 그렇지 않습니다(관리자 권한으로 실행). 이 경우 C:\WINDOWS\system32가 표시됩니다.
SijeDeHaanWindows
에서만 확인 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; }
GOXR3PLUSEclipse, 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 드라이브가 아닌 다른 디렉토리에서 테스트하면 제대로 작동합니다.
Avon97Java 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