1

以下のJavaコードをUnix(AIXとLinuxの両方)で実行していますが、機能しません。このコードを実行すると、ファイルq1.01は圧縮されず、例外はスローされません(ファイルq1.01が存在し、コマンドの実行後にファイルq1.01.Zが見つかると思います)。 「whichcompress」と入力すると、コマンドプロンプトに「/ usr / bin/compress」と報告されます。Unixプロンプトでコマンド「/usr/ bin / compressq1.01」を入力すると、正常に機能します。何が間違っているのかについてのアイデアはありますか?

String cmd = "/usr/bin/compress q1.01";
Runtime.getRuntime().exec(cmd);
4

5 に答える 5

2

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

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

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

.exec() は、引数を渡すために String 配列を必要とします。

試す

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

.exec はローカル コマンド シェルを呼び出さないことに注意してください。つまり、 .exec() を呼び出す前に、とりわけ、ワイルドカード展開といくつかの引数の解析を行う必要があります。これが、完全なコマンドラインを渡すことができない理由です。

于 2009-06-26T14:37:21.390 に答える
1

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

答えてくれてありがとう。それは役に立ちました!

于 2009-06-26T16:06:01.067 に答える
0

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

于 2009-06-26T13:21:49.500 に答える
0

このサイトはいくつかの手がかりを提供できるかもしれません。

于 2009-06-26T13:22:38.377 に答える
0

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

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

于 2009-06-26T15:01:41.840 に答える