2009-06-26 9 views
1

下記のJavaコードをUnix(AIXとLinuxの両方)上で実行していますが、動作しません。このコードを実行すると、q1.01ファイルが圧縮されず、例外がスローされません(ファイルq1.01が存在し、コマンド実行後にファイルq1.01.Zが見つかることを期待しています)。コマンドプロンプトで「which compress」と入力すると「/ usr/bin/compress」と表示されます。 Unixのプロンプトに "/ usr/bin/compress q1.01"というコマンドを入力すると正常に動作します。何が間違っているかもしれないかに関するアイデア?Unix上のJava exec

+1

Javaではなくシェルでコマンドを実行するとファイルが圧縮されますか? – jimyi

+0

Javaがプログラムディレクトリのq1.01を探している可能性があります。ファイルへの完全なファイルパスを提供しようとしましたか?また、圧縮ファイルがシステム上の別の場所にあるかどうかを確認してください。 –

+0

おそらく、exec()によって返されたProcessオブジェクトからstdout/stderrストリームを読むことができます。それはなぜあなたがそれが動作していないかの手がかりを与えるかもしれません。 –

答えて

0

おそらくファイルへの絶対パスを使用する必要があります。出力をキャプチャして、問題の内容を確認します。その方法については、this pageを参照してください。

0

Thisサイトでは、いくつかの手がかりを提供することができます。

2

[後の編集:問題は最初の説明にありました。 OPはq.01ではなくワイルドカードを渡していました。だから私の答えは太字の部分を除いて間違っています。それが意味をなされるので、私はそれを残しています。]

引数なしでプログラム名として/usr/bin/compressを実行しようとしています。

Runtime.exec()メソッドには多くの形式があります。あなたは.exec(String)バージョンを使用しています。バージョンは実行可能ファイルだけです。代わりに、.exec(String[])配列バージョンを使用する必要があります。このバージョンでは、実行可能ファイルはString [0]で、パラメータはString [1 ..]になります。

.exec()は引数を渡すための文字列配列を必要とします。

は.execは、ローカルコマンドシェルを呼び出していないことを

String[] cmd = new String[] { "/usr/bin/compress", "q1.01" }; 
Runtime.getRuntime().exec(cmd); 

注意してみてください。これは、とりわけ、ワイルドカードの展開やいくつかの引数の解析など、の前に、 .exec()を呼び出す必要があることを意味します。このため、完全なコマンドラインを渡すことはできません。

+0

私はそのようなランタイム#exec(String)メソッドのマニュアルを解釈しません:http://java.sun.com/javase/6/docs/api/java/lang/Runtime.html#exec(java.lang)。 String、%20java.lang.String []、%20java.io.File)は、引数がStringTokenizerクラスを使用してトークンに分割されていることを示します。 – JesperE

+0

が確認されました。ランタイム#exec(String)は実際に引数を分割します。 Runtime.getRuntime()。exec( "nslookup www.stackoverflow.com")を試してください。 – JesperE

+0

ああ!この形式のexecメソッドを試してみましたが、 "* .01"を引数として使用していました。シェルを経由しないので展開されませんでした。ありがとう! –

0

プロセス入力ストリームがnullの場合、Javaがサブプロセスを生成することさえできないと思われます。 Process#exitValue()は何を返しますか?

straceを使用して、実際にシステムコールレベルで何が起こるかを確認することをお勧めします。実際のexec()の引数と戻りコードは特に興味深いでしょう。

+0

プロセス入力ストリームがnullでない場合は、ストリームからnullを返すreadLineです。明らかに、実行時には出力がありません。 –

+0

多くのUnixプログラムは、成功すると出力を全く表示しません。 – JesperE

1

いくつかの問題がありました。 1つは、ワイルドカードを使用しようとしていたことです。シェルは呼び出されていないので、展開されていませんでした。もう1つの問題は、このような非常に小さなテストファイルを作成したことです。 "echo 'abc'> q1.01"。このファイルは非常に小さく、圧縮はそれ以上圧縮できず、そのまま放置されました。 (愚かなことに、シェルでコマンドを入力したときに、別のファイル名を使用して圧縮したと思います。)

皆さん、お返事ありがとうございます。それは助けになった!

関連する問題