Javaプログラム内から現在の作業ディレクトリを変更するにはどうすればよいですか?この問題について私が見つけたすべてのことは、あなたは単にそれを行うことができないと主張していますが、それが本当にそうだとは信じられません。
通常開始されたディレクトリからハードコードされた相対ファイルパスを使用してファイルを開くコードがあり、別のJavaプログラム内からそのコードを使用できるようにしたいだけです特定のディレクトリ内から起動する必要があります。 System.setProperty( "user.dir", "/path/to/dir" )
を呼び出すことができるように思えますが、私が理解できる限り、その行の呼び出しは黙って失敗し、何もしません。
Javaがこれを許可していない場合、それがget現在の作業ディレクトリを許可し、さらには許可するという事実がなければ、理解できます相対ファイルパスを使用してファイルを開くには...
純粋なJavaでこれを行う信頼できる方法はありません。 System.setProperty()
またはuser.dir
を介してJava -Duser.dir=...
プロパティを設定すると、その後のFiles
の作成に影響するようですが、 FileOutputStreams
。
File(String parent, String child)
コンストラクターは、ファイルパスとは別にディレクトリパスを構築し、スワッピングを容易にする場合に役立ちます。
別の方法は、別のディレクトリからJavaを実行するようにスクリプトをセットアップするか、JNIネイティブコード 以下に提案するように を使用することです。
関連するSunのバグ は2008年に「修正されない」としてクローズされました。
ProcessBuilder でレガシープログラムを実行する場合、その作業 directory を指定できます。
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");
}
}
正しく理解できれば、Javaプログラムは、現在の環境変数のcopyで始まります。 System.setProperty(String, String)
による変更は、元の環境変数ではなく、コピーを変更しています。これがSunがこの動作を選択した理由について完全な理由を提供するわけではありませんが、おそらく少し光を放ちます...
前述のように、JVMのCWDを変更することはできませんが、Runtime.exec()を使用して別のプロセスを起動する場合、作業ディレクトリを指定できるオーバーロードメソッドを使用できます。これは別のディレクトリでJavaプログラムを実行するためではありませんが、たとえばPerlスクリプトのような別のプログラムを起動する必要がある多くの場合、作業ディレクトリを残してそのスクリプトの作業ディレクトリを指定できますJVMの変更なし。
Runtime.exec javadocsを参照してください
具体的には、
public Process exec(String[] cmdarray,String[] envp, File dir) throws IOException
dir
は、サブプロセスを実行する作業ディレクトリです
作業ディレクトリは、オペレーティングシステムの機能です(プロセスの開始時に設定されます)。独自のシステムプロパティ(-Dsomeprop=/my/path
)を渡して、それをコードのFileの親として使用してみませんか。
File f = new File ( System.getProperty("someprop"), myFilename)
ここで行うより賢い/簡単なことは、現在の作業ディレクトリに存在することを前提としてファイルを開くのではなく、コードを変更することです(あなたはnew File("blah.txt")
のようなことをしていると仮定して、ファイルへのパスを自分で構築してください).
ユーザーにベースディレクトリを渡し、設定ファイルからそれを読み取らせ、他のプロパティが見つからない場合はuser.dir
にフォールバックします。しかし、プログラムのロジックを変更するよりも改善する方がはるかに簡単です。環境変数の仕組み。
起動しようとしました
String oldDir = System.setProperty("user.dir", currdir.getAbsolutePath());
うまくいくようです。しかし
File myFile = new File("localpath.ext"); InputStream openit = new FileInputStream(myFile);
ただし、FileNotFoundException
をスローします
myFile.getAbsolutePath()
正しいパスを示しています。 これを読む があります。私は問題があると思う:
解決策は次のとおりです。
File myFile = new File(System.getPropety("user.dir"), "localpath.ext");
JVMが認識している現在のディレクトリを使用して、ファイルオブジェクトを絶対オブジェクトとして作成します。ただし、そのコードは使用済みクラスに存在する必要があり、再利用コードの変更が必要です。
~~~~ JcHartmut
使用できます
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
シェルでコマンドを実行する場合、「Java -cp」などを記述し、「:」で区切って任意のディレクトリを追加できます。Javaが1つのディレクトリで何かを見つけられない場合他のディレクトリで、それが私がしていることです。
この質問に対する他の可能な答えは、ファイルを開いている理由によって異なります。これはプロパティファイルですか、それともアプリケーションに関連する構成を持つファイルですか?
この場合、クラスパスローダーを介してファイルをロードすることを検討してください。この方法では、Javaがアクセスできるファイルをロードできます。