0

このシェルを Java で実行しようとしましたが、うまくいきません。

Process p = Runtime.getRuntime().exec(" cat *.java|sed '/import/d'|sed'/package/d'>>b.java ");

cmd を " ls" や " "などに変更するopen foo.javaと、コードが機能します。

理由はありますか?

4

2 に答える 2

1

問題は、ファイルのワイルドカード パターンがglobによって展開されないことです。したがって、パターンは文字どおりに処理され、ファイルは見つかりません。bashこれを解釈するには、次のようなシェルが必要です。

Process p = Runtime.getRuntime().exec(new String[] { 
                   "bash", "-c", 
                   "cat *.java|sed '/import/d'|sed'/package/d'>>b.java" });

getErrorStreamの内容を確認してください。

余談: varargs 配列を使用して command を構築する、より便利な ProcessBuilderStringの使用を検討してください。

于 2013-04-26T02:05:14.083 に答える
0

ここにはいくつかの問題があります。

  1. *.java部分は、通常シェルによって展開されるグロブです
  2. プロセスからプロセスへのパイプラインの組み立てもシェルの機能です
  3. 出力リダイレクトはシェル機能です

基本的に、このタイプのパイプラインを実行するにはシェルを呼び出す必要があります。このexecメソッドは、引数を指定して特定のプログラムを実行します。シェルを直接呼び出してコマンドラインを引数として渡すことでこれを機能させることができるかもしれませんが、それが機能するかどうかは疑問です。

cat *.javaディレクトリの内容を列挙し、各ファイルを個別に読み取ることによって、パーツを実装する必要がある場合があります。Processコマンドごとに個別のインスタンスを開きsed、インスタンスの入力ストリームと出力ストリームを使用してそれらの間のパイプラインを実装しProcessます。

于 2013-04-26T02:08:38.380 に答える