2011-09-15 7 views
0

は終了しません:外部プログラムが

Process p; 
rn = Runtime.getRuntime(); 

String[] unzip = new String[2]; 

unzip[0]="unzip"; 

unzip[1]=archive ; 

public void dezip() throws IOException{ 

    p = rn.exec(unzip); 
    int ret = p.exitValue(); 

System.out.println("End of unzip method"); 

しかし、私の最後のSystem.outunzip方法から我々出口かのように、実行されることはありません。 unzip()コールは仕事の半分だけを行い、アーカイブの一部は解凍されます。 コマンドラインからps -xまたはhtopを使用すると、解凍プロセスがまだここにあることがわかります。

お願いします。

+0

これはあなたのコードの正しいコピー/ペーストではありませんか?あなたは 'unzip'と呼ばれる方法について話します、それは'デジップ 'の意味ですか? –

+0

申し訳ありませんが、私はlinuxを使用していますので、unzipはコマンドです。 [link] http://linux.about.com/od/commands/l/blcmdl1_unzip.htm – lemoos

答えて

1

おそらく、プロセスからInputStreamを読み込む必要があります。いくつかのネイティブなプラットフォームには 標準入出力ストリーム、速やかに入力 ストリームを書き込むかの出力ストリームを読み取りに失敗したために限られたバッファサイズを提供するので

を:述べProcess

のJavadocを参照してください。サブプロセスによってサブプロセスがブロックされ、デッドロックする可能性があります。

+1

あなたは**プロセスの* Output *と* Error *ストリームを読み込んでフラッシュする必要があります。 'Process.getOutputStream'と' Process.getErrorStream'を参照してください。 –

+0

私はそれを取得しません.iはメソッドを解凍しており、作業の半分しか行いません。なぜストリームが必要ですか? – lemoos

+0

問題解決済み!私はunzipコマンドのために非常に静かなモードのために-qq引数を使用しました。それは完璧に機能しました。あなたはそれがバッファサイズの問題だったのは間違いありませんでした。 – lemoos

0

次のことを試してください:

p = rn.exec(unzip); 
p.waitFor() 

私はそれが何かを変えることを願っています。

+0

いいえ、「exitValue」は子プロセスが終了するのを待ちます。 –

+0

私はすでにそれを試しました。 p.waitFor()と同じ問題があります。 – lemoos

1

unzipコマンドがプロンプトを表示しているかどうかを確認します。ファイルがすでに存在し、上書きしたい場合は警告が表示されます。

また、私はJavaプログラムの途中にあるバッククォートですか?スペースや特殊文字を含むディレクトリを処理するために、Windowsシステム上で起動したときに実行可能ファイルのパスが引用されている場合

+0

いいえ、それはバッククォートではありません。スタックオーバフローメッセージエディタにはあまり慣れていないので、私のコードにバッククォートを入れます。 – lemoos

1
  1. は必ず外部プログラムが
  2. チェックユーザの入力を待たないようにしてください。

PS。 私はjava.lang.Runtimeクラスを使用していましたが、java.lang.ProcessBuilderクラスがはるかに優れていることがわかりました。現在の作業ディレクトリ、最も重要なのはシステム環境を指定できます。

+0

私の外部プログラムはユーザーの入力を待つことはありません。 – lemoos

+0

Javaから外部コマンドを実行するのはとても簡単ですが、実際にはそれは非常に遠いです。 STDINT、STDOUT、STDERRをフラッシュしてみましたか? –