2016-05-02 5 views
1

からのコマンドを実行するのに、指定されたパスを見つけることができない原因となり、これは私のコードで問題は、私はしても、次の例外を取得していますしかし、私はcmdから同じコマンドを実行するとき、私は何の問題もなく、私はちょうどそれが指定されたファイルを見つけることができない理由を把握することはできません! PS:私が最初にプロセスビルダーは、私はJavaコード からのmysqldumpを実行するために<code>ProcessBuilder</code>を使用していますERROR2もCMD

Exception in thread "main" java.io.IOException: Cannot run program "mysqldump -u root -P 3316 -h localhost > G:\test.sql": CreateProcess error=2, The system cannot find the file specified 
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:470) 
    at com.etq.e2mc.platform.windows.WindowsProcess.executeCommant(WindowsProcess.java:46) 
    at com.etq.e2mc.platform.windows.WindowsProcess.main(WindowsProcess.java:67) 
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>(ProcessImpl.java:177) 
    at java.lang.ProcessImpl.start(ProcessImpl.java:28) 
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:452) 
    ... 2 more 

答えて

1

をmysqldump.exeのフルパスを与えてみましたし、同じ結果を得た、あなたは、配列の最初の値がプログラムであることを意味し、配列でProcessBuilder(String... command)を呼び出しています。ただし、文字列全体を"mysqldump -u root -P 3316 -h localhost > G:\\test.sql"に送信していますが、これはプログラムではありません。プログラムはmysqldumpのみです。

第二に、getInputStream()を使用して出力をキャプチャする場合、あなたはそれ以外の場合は、あなたのリスクは、出力バッファは、完全な実行しているあなたが実行しているプログラムの実行を停止、基本的にあなたのプログラムの待機の間にデッドロックを引き起こし、前waitFor()を呼び出すことを行う必要がありますコマンドが終了し、コマンドが出力を読み込むのを待っています。ストリームが必要な場合は、通常別のスレッドでストリームを読む必要があります。

第3に、>をコマンド文字列に使用して出力をリダイレクトすることはできません。それはcmd.exeなので、cmd.exeを呼び出すことはありません。ファイルにリダイレクトする場合は、ProcessBuilderを使用して直接行います。

ProcessBuilder processBuilder = new ProcessBuilder(
     "mysqldump", "-u", "root", "-P", "3316", "-h", "localhost"); 
processBuilder.redirectErrorStream(true); 
processBuilder.redirectOutput(new File("G:\\test.sql")); 
Process process = processBuilder.start(); 
int resultCode = process.waitFor(); 
if (resultCode != 0) { 
    throw new Exception("Program failed with error " + resultCode); 
} 
+0

私は正直、私はあなたが書いたコードをしようとしていますし、 'メソッドredirectOutput(ファイル)取得していますがタイプProcessBuilder'には未定義であることを知らなかった貴重な情報をありがとう、あなたは他の提案を持っていますどのように出力をリダイレクトする方法については?、shoud私はちょうどcmdを呼び出すとmysqldump ?? - PS:java 6を使用していて、Java 7でalotがテストされていないのでアップグレードできません。 – user1

+0

次に、getInputStream()によってファイルに返された入力ストリームからデータをポンピングする独自のスレッドを作成する必要があります。 – Andreas

関連する問題