[java] Java에서 현재 작업 디렉토리를 변경 하시겠습니까?

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)