下記の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
答えて
おそらくファイルへの絶対パスを使用する必要があります。出力をキャプチャして、問題の内容を確認します。その方法については、this pageを参照してください。
Thisサイトでは、いくつかの手がかりを提供することができます。
[後の編集:問題は最初の説明にありました。 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()を呼び出す必要があることを意味します。このため、完全なコマンドラインを渡すことはできません。
私はそのようなランタイム#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
が確認されました。ランタイム#exec(String)は実際に引数を分割します。 Runtime.getRuntime()。exec( "nslookup www.stackoverflow.com")を試してください。 – JesperE
ああ!この形式のexecメソッドを試してみましたが、 "* .01"を引数として使用していました。シェルを経由しないので展開されませんでした。ありがとう! –
プロセス入力ストリームがnullの場合、Javaがサブプロセスを生成することさえできないと思われます。 Process#exitValue()は何を返しますか?
strace
を使用して、実際にシステムコールレベルで何が起こるかを確認することをお勧めします。実際のexec()の引数と戻りコードは特に興味深いでしょう。
プロセス入力ストリームがnullでない場合は、ストリームからnullを返すreadLineです。明らかに、実行時には出力がありません。 –
多くのUnixプログラムは、成功すると出力を全く表示しません。 – JesperE
いくつかの問題がありました。 1つは、ワイルドカードを使用しようとしていたことです。シェルは呼び出されていないので、展開されていませんでした。もう1つの問題は、このような非常に小さなテストファイルを作成したことです。 "echo 'abc'> q1.01"。このファイルは非常に小さく、圧縮はそれ以上圧縮できず、そのまま放置されました。 (愚かなことに、シェルでコマンドを入力したときに、別のファイル名を使用して圧縮したと思います。)
皆さん、お返事ありがとうございます。それは助けになった!
- 1. UNIX系のexec()とsystem()の違い
- 2. Java with PHP exec
- 3. Java Unix Terminal
- 4. JavaのRuntime.getRuntime()。exec()はWindows 7上で動作しますか?
- 5. UNIXホスト上SFTP
- 6. JavaのUNIXは、フィルタ
- 7. Java API for Unix
- 8. ディスク上のUNIXソケットファイル対ubuntu上のtmpfs
- 9. Unix上のSAS Progam Editor
- 10. Java - Unixエポックの時刻を
- 11. JavaのUnixは、Javaで財産
- 12. JavaのWindows NFSでRuntime.getRuntime()。exec()問題
- 13. Windows上のUnixスタイルのツールですか?
- 14. Unix上のC++:スレッドライブラリの違いは?
- 15. Unix上でのJavaの大文字と小文字を区別しないディレクトリアクセス
- 16. UnixシェルスクリプトとJava Jarコマンド
- 17. Javaで既存のunixライブラリを使用する方法
- 18. プロセス交換を伴うjava exec
- 19. Runtime.getRuntime()。exec( "java -jar xxx.jar); Not Working | Mac OS X
- 20. UNIXドメインソケット上でファイルディスクリプタを送信し、select()
- 21. Maven execプラグインClassNotFoundException
- 22. JavaでUnixコマンドを繰り返す
- 23. maven execプラグインのexecとjavaの両方の目標を定義できますか?
- 24. WindowsでのJava Runtime Execが引数のUnicodeで失敗する
- 25. PHP Execのコマンド
- 26. のexec /システム() - PHP
- 27. Linux userland exec
- 28. 特定のケースでJava Runtime execがバッチファイルをロードできない
- 29. execコマンドアンドロイドネイティブコード
- 30. Javaの異なるユーザーとしてUNIXコマンドを実行する
Javaではなくシェルでコマンドを実行するとファイルが圧縮されますか? – jimyi
Javaがプログラムディレクトリのq1.01を探している可能性があります。ファイルへの完全なファイルパスを提供しようとしましたか?また、圧縮ファイルがシステム上の別の場所にあるかどうかを確認してください。 –
おそらく、exec()によって返されたProcessオブジェクトからstdout/stderrストリームを読むことができます。それはなぜあなたがそれが動作していないかの手がかりを与えるかもしれません。 –