Java 프로그램 내에서 현재 작업 디렉토리를 어떻게 변경합니까? 내가 당신이 단순히 할 수 없다는 문제 주장에 대해 찾을 수 있었던 모든 것이지만, 나는 그것이 실제로 사실이라고 믿을 수 없습니다.
일반적으로 시작되는 디렉토리에서 하드 코딩 된 상대 파일 경로를 사용하여 파일을 여는 코드 조각이 있으며 내부에서 시작할 필요없이 다른 Java 프로그램에서 해당 코드를 사용할 수 있기를 원합니다. 특정 디렉토리. 그것은 당신이 전화 할 수 있어야하는 것처럼 보이지만 System.setProperty( "user.dir", "/path/to/dir" )
, 내가 알아낼 수있는 한 그 줄을 전화하는 것은 조용히 실패하고 아무것도하지 않습니다.
Java가 현재 작업 디렉토리 를 얻 거나 상대 파일 경로를 사용하여 파일을 열 수 없다는 사실이 아니라면 Java 가이 작업을 수행 할 수 없었는지 이해 합니다 ….
답변
순수한 Java에서는이를 수행 할 수있는 확실한 방법이 없습니다. 설정 user.dir
을 통해 속성을 System.setProperty()
또는 java -Duser.dir=...
후속 작품에 영향을 미치는 것으로 보인다 Files
아니라 예 FileOutputStreams
.
File(String parent, String child)
당신이 쉽게 스와핑을 허용, 파일 경로에서 별도로 디렉토리 경로를 구축하는 경우 생성자는 도움이 될 수 있습니다.
대안은 다른 디렉토리에서 Java를 실행하도록 스크립트를 설정하거나 아래 제안 된대로 JNI 기본 코드 를 사용하는 것 입니다.
관련 Sun 버그 는 2008 년 “수정되지 않음”으로 종료되었습니다.
답변
ProcessBuilder로 레거시 프로그램을 실행 하면 작업 디렉토리 를 지정할 수 있습니다 .
답변
이 인 시스템 프로퍼티 “으로 user.dir”을 사용하여이 작업을 수행 할 수있는 방법은. 이해해야 할 중요한 부분은 getAbsoluteFile ()을 호출해야하며 (아래 참조) 그렇지 않으면 상대 경로가 기본 “user.dir”값 에 대해 결정됩니다 .
import java.io.*;
public class FileUtils
{
public static boolean setCurrentDirectory(String directory_name)
{
boolean result = false; // Boolean indicating whether directory was set
File directory; // Desired current working directory
directory = new File(directory_name).getAbsoluteFile();
if (directory.exists() || directory.mkdirs())
{
result = (System.setProperty("user.dir", directory.getAbsolutePath()) != null);
}
return result;
}
public static PrintWriter openOutputFile(String file_name)
{
PrintWriter output = null; // File to open for writing
try
{
output = new PrintWriter(new File(file_name).getAbsoluteFile());
}
catch (Exception exception) {}
return output;
}
public static void main(String[] args) throws Exception
{
FileUtils.openOutputFile("DefaultDirectoryFile.txt");
FileUtils.setCurrentDirectory("NewCurrentDirectory");
FileUtils.openOutputFile("CurrentDirectoryFile.txt");
}
}
답변
JNA / JNI를 사용하여 libc를 호출하여 PWD를 변경할 수 있습니다. JRuby를들는 POSIX를 만들기위한 편리한 자바 라이브러리가 전화 통화를 JNA-POSIX 여기입니다 받는다는 정보
여기 에서 그 사용 예를 볼 수 있습니다 (Clojure 코드, 죄송합니다). chdirToRoot 함수를보십시오
답변
언급했듯이 JVM의 CWD를 변경할 수는 없지만 Runtime.exec ()를 사용하여 다른 프로세스를 시작하려는 경우 작업 디렉토리를 지정할 수있는 오버로드 된 메소드를 사용할 수 있습니다. 이것은 실제로 다른 디렉토리에서 Java 프로그램을 실행하기위한 것이 아니라 Perl 스크립트와 같은 다른 프로그램을 실행해야하는 경우가 많을 때 JVM의 작업 디렉토리를 변경하지 않고 해당 스크립트의 작업 디렉토리를 지정할 수 있습니다.
Runtime.exec javadocs를 참조하십시오.
구체적으로 특별히,
public Process exec(String[] cmdarray,String[] envp, File dir) throws IOException
dir
하위 프로세스를 실행할 작업 디렉토리는 어디에 있습니까?
답변
올바르게 이해하면 Java 프로그램은 현재 환경 변수 의 사본 으로 시작 합니다. 변경 사항 System.setProperty(String, String)
은 원래 환경 변수가 아니라 사본을 수정합니다. 이것이 썬이 왜이 행동을 선택했는지에 대한 철저한 이유를 제공하지는 않지만 아마도 약간의 빛을 비추고 있습니다 …
답변
작업 디렉토리는 운영 체제 기능입니다 (프로세스가 시작될 때 설정 됨). 왜 자신의 시스템 속성 ( -Dsomeprop=/my/path
)을 전달하고 코드에서 파일의 부모로 사용하지 않습니까?
File f = new File ( System.getProperty("someprop"), myFilename)