180

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

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

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

4

14 に答える 14

154

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

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

別の方法として、別のディレクトリから Java を実行するようにスクリプトを設定するか、以下に示すように JNI ネイティブ コードを使用します

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

于 2009-05-08T14:59:28.917 に答える
42

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

于 2009-05-08T15:04:03.977 に答える
30

システム プロパティ「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");
    }
}
于 2012-12-20T23:00:52.430 に答える
21

JNA/JNI を使用して libc を呼び出し、PWD を変更することができます。JRuby の人たちは、 jnr-posixと呼ばれる POSIX 呼び出しを行うための便利な Java ライブラリを持っています。ここにメイブン情報があります

于 2011-11-20T20:45:07.487 に答える
17

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

Runtime.execjavadocsを参照してください

具体的には、

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

dirサブプロセスを実行するための作業ディレクトリはどこにありますか

于 2013-02-06T15:20:56.213 に答える
11

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

于 2009-05-08T14:58:35.470 に答える
5

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

File f = new File ( System.getProperty("someprop"), myFilename)
于 2009-05-08T14:59:11.850 に答える
4

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

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

于 2009-05-08T15:03:03.290 に答える
0

If you run your commands in a shell you can write something like "java -cp" and add any directories you want separated by ":" if java doesnt find something in one directory it will go try and find them in the other directories, that is what I do.

于 2012-07-31T15:48:17.243 に答える
-1

FileSystemView を使用する

private FileSystemView fileSystemView;
fileSystemView = FileSystemView.getFileSystemView();
currentDirectory = new File(".");
//listing currentDirectory
File[] filesAndDirs = fileSystemView.getFiles(currentDirectory, false);
fileList = new ArrayList<File>();
dirList = new ArrayList<File>();
for (File file : filesAndDirs) {
if (file.isDirectory())
    dirList.add(file);
else
    fileList.add(file);
}
Collections.sort(dirList);
if (!fileSystemView.isFileSystemRoot(currentDirectory))
    dirList.add(0, new File(".."));
Collections.sort(fileList);
//change
currentDirectory = fileSystemView.getParentDirectory(currentDirectory);
于 2013-09-11T14:23:20.787 に答える