web-dev-qa-db-ja.com

Javaで現在の作業ディレクトリを変更しますか?

Javaプログラム内から現在の作業ディレクトリを変更するにはどうすればよいですか?この問題について私が見つけたすべてのことは、あなたは単にそれを行うことができないと主張していますが、それが本当にそうだとは信じられません。

通常開始されたディレクトリからハードコードされた相対ファイルパスを使用してファイルを開くコードがあり、別のJavaプログラム内からそのコードを使用できるようにしたいだけです特定のディレクトリ内から起動する必要があります。 System.setProperty( "user.dir", "/path/to/dir" )を呼び出すことができるように思えますが、私が理解できる限り、その行の呼び出しは黙って失敗し、何もしません。

Javaがこれを許可していない場合、それがget現在の作業ディレクトリを許可し、さらには許可するという事実がなければ、理解できます相対ファイルパスを使用してファイルを開くには...

158
Nick

純粋なJavaでこれを行う信頼できる方法はありません。 System.setProperty()またはuser.dirを介してJava -Duser.dir=...プロパティを設定すると、その後のFilesの作成に影響するようですが、 FileOutputStreams

File(String parent, String child) コンストラクターは、ファイルパスとは別にディレクトリパスを構築し、スワッピングを容易にする場合に役立ちます。

別の方法は、別のディレクトリからJavaを実行するようにスクリプトをセットアップするか、JNIネイティブコード 以下に提案するように を使用することです。

関連するSunのバグ は2008年に「修正されない」としてクローズされました。

140
Michael Myers

ProcessBuilder でレガシープログラムを実行する場合、その作業 directory を指定できます。

36
PhiLho

isシステムプロパティ「user.dir」を使用してこれを行う方法があります。理解すべき重要な部分は、getAbsoluteFile()を呼び出す必要があることです(以下に示すように)。そうしないと、相対パスがdefault "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");
    }
}
29
Steve K

JNA/JNIを使​​用してlibcを呼び出すと、PWDを変更できます。 JRubyには、POSIX呼び出しを行うための便利なJavaライブラリがあります jna-posix ここに Maven情報

その使用例が表示されます here (Clojureコード、申し訳ありません)。関数chdirToRootを見てください

17
Allen Rohner

正しく理解できれば、Javaプログラムは、現在の環境変数のcopyで始まります。 System.setProperty(String, String)による変更は、元の環境変数ではなく、コピーを変更しています。これがSunがこの動作を選択した理由について完全な理由を提供するわけではありませんが、おそらく少し光を放ちます...

11
Adam Paynter

前述のように、JVMのCWDを変更することはできませんが、Runtime.exec()を使用して別のプロセスを起動する場合、作業ディレクトリを指定できるオーバーロードメソッドを使用できます。これは別のディレクトリでJavaプログラムを実行するためではありませんが、たとえばPerlスクリプトのような別のプログラムを起動する必要がある多くの場合、作業ディレクトリを残してそのスクリプトの作業ディレクトリを指定できますJVMの変更なし。

Runtime.exec javadocsを参照してください

具体的には、

public Process exec(String[] cmdarray,String[] envp, File dir) throws IOException

dirは、サブプロセスを実行する作業ディレクトリです

11
Bizmarck

作業ディレクトリは、オペレーティングシステムの機能です(プロセスの開始時に設定されます)。独自のシステムプロパティ(-Dsomeprop=/my/path)を渡して、それをコードのFileの親として使用してみませんか。

File f = new File ( System.getProperty("someprop"), myFilename)
5
raphaëλ

ここで行うより賢い/簡単なことは、現在の作業ディレクトリに存在することを前提としてファイルを開くのではなく、コードを変更することです(あなたはnew File("blah.txt")のようなことをしていると仮定して、ファイルへのパスを自分で構築してください).

ユーザーにベースディレクトリを渡し、設定ファイルからそれを読み取らせ、他のプロパティが見つからない場合はuser.dirにフォールバックします。しかし、プログラムのロジックを変更するよりも改善する方がはるかに簡単です。環境変数の仕組み。

4
matt b

起動しようとしました

String oldDir = System.setProperty("user.dir", currdir.getAbsolutePath());

うまくいくようです。しかし

File myFile = new File("localpath.ext"); InputStream openit = new FileInputStream(myFile);

ただし、FileNotFoundExceptionをスローします

myFile.getAbsolutePath()

正しいパスを示しています。 これを読む があります。私は問題があると思う:

  • Javaは、新しい設定で現在のディレクトリを認識します。
  • ただし、ファイル処理はオペレーティングシステムによって行われます。残念ながら、新しいセットの現在のディレクトリはわかりません。

解決策は次のとおりです。

File myFile = new File(System.getPropety("user.dir"), "localpath.ext");

JVMが認識している現在のディレクトリを使用して、ファイルオブジェクトを絶対オブジェクトとして作成します。ただし、そのコードは使用済みクラスに存在する必要があり、再利用コードの変更が必要です。

~~~~ JcHartmut

2

使用できます

new File( "relative/path")。getAbsoluteFile()

System.setProperty( "user.dir"、 "/ some/directory")

System.setProperty("user.dir", "C:/OtherProject");
File file = new File("data/data.csv").getAbsoluteFile();
System.out.println(file.getPath());

印刷します

C:\OtherProject\data\data.csv
1
javacommons

シェルでコマンドを実行する場合、「Java -cp」などを記述し、「:」で区切って任意のディレクトリを追加できます。Javaが1つのディレクトリで何かを見つけられない場合他のディレクトリで、それが私がしていることです。

0
Zloy Smiertniy

この質問に対する他の可能な答えは、ファイルを開いている理由によって異なります。これはプロパティファイルですか、それともアプリケーションに関連する構成を持つファイルですか?

この場合、クラスパスローダーを介してファイルをロードすることを検討してください。この方法では、Javaがアクセスできるファイルをロードできます。

0
Nathan Feger