Winrarを実行し、h:\myjar.jar
にあるjarファイルをh:\new
フォルダーに解凍するプログラムをJavaで作成しています。私のJavaコードは次のようになります
import Java.io.File;
import Java.io.IOException;
public class MainClass {
public static void main(String[] args) {
Runtime r = Runtime.getRuntime();
Process p = null;
try {
File dir = new File("C:/Program Files/WinRAR");
p = r.exec("winrar x h:\\myjar.jar *.* h:\\new", null, dir);
} catch (IOException e) {
e.printStackTrace();
}
}
}
これを実行すると、このエラーが発生します
Java.io.IOException: Cannot run program "winrar" (in directory "C:\Program Files\WinRAR"): CreateProcess error=2, The system cannot find the file specified
at Java.lang.ProcessBuilder.start(Unknown Source)
at Java.lang.Runtime.exec(Unknown Source)
at Java.lang.Runtime.exec(Unknown Source)
at MainClass.main(MainClass.Java:16)
Caused by: Java.io.IOException: CreateProcess error=2, The system cannot find the file specified
at Java.lang.ProcessImpl.create(Native Method)
at Java.lang.ProcessImpl.<init>(Unknown Source)
at Java.lang.ProcessImpl.start(Unknown Source)
... 4 more
なぜ私がそのような問題に遭遇しているのか誰にも教えてもらえますか。動作するようにコードに組み込む必要がある変更は何ですか?
winrar.exe
がPATH
にあると仮定すると、Runtime.exec
はそれを見つけることができますが、そうでない場合は、たとえば、winrar.exe
はC:/Program Files/WinRAR
にインストールされます。次のようなものを使用する必要があります...
p=r.exec("C:/Program Files/WinRAR/winrar x h:\\myjar.jar *.* h:\\new");
個人的には、ProcessBuilder
を使用することをお勧めします。これにはいくつかの追加の構成機能があるためです。可能な場合は、コマンドとパラメーターを個別のString
要素に分離する必要があります。たとえば、単一のString
変数よりもスペースのようなものを扱います。
ProcessBuilder pb = new ProcessBuilder(
"C:/Program Files/WinRAR/winrar",
"x",
"myjar.jar",
"*.*",
"new");
pb.directory(new File("H:/"));
pb. redirectErrorStream(true);
Process p = pb.start();
InputStream
の内容をプロセスから読み取ることを忘れないでください。そうしないと、プロセスが停止する可能性があります。
ProcessBuilderを使用しましたが、同じ問題がありました。問題は、文字列配列の代わりに、コマンドを1つの文字列行として(cmdで入力するように)使用することでした。上記の例では。走ったら
ProcessBuilder pb = new ProcessBuilder("C:/Program Files/WinRAR/winrar x myjar.jar *.* new");
pb.directory(new File("H:/"));
pb. redirectErrorStream(true);
Process p = pb.start();
エラーが発生しました。しかし、私が走った場合
ProcessBuilder pb = new ProcessBuilder("C:/Program Files/WinRAR/winrar", "x", "myjar.jar", "*.*", "new");
pb.directory(new File("H:/"));
pb. redirectErrorStream(true);
Process p = pb.start();
すべてがOKでした。
指定したdir
は実行中のプロセスの作業ディレクトリです-実行可能ファイルを見つけるのに役立ちません。 cmd /c winrar ...
を使用してPATHで実行可能ファイルを探してプロセスを実行するか、absolutepath towinrar。
exec
はProcessBuilder
を使用するため、getRuntime().exec
を保持することをお勧めします。
試して
p=r.exec(new String[] {"winrar", "x", "h:\\myjar.jar", "*.*", "h:\\new"}, null, dir);
exec
の完全な最初の引数は、実行可能ファイルとして解釈されています。つかいます
p = rt.exec(new String[] {"winrar.exe", "x", "h:\\myjar.jar", "*.*", "h:\\new" }
null,
dir);