2016-07-23 19 views
0

javaから(linux)-subprocessへのデータの送信に問題があります。ProcessBuilder/Processです。Java Process/ProcessBuilderのOutputStreamにパイプとして書き込む

シェル専用の基本的な例は、次のようになり、正常に動作します。

echo "hello world" | cat - >/tmp/receive.dat 

は今、私は内部的に新しいプロセス(cat - >/tmp/receive.dat)を作成し、それにデータを送信すべきJavaプログラムでecho "hello world"を置換したいです。

私は次のことを試してみましたが、ファイル/tmp/receive.datは手つかずのまま:

String[] cmdArray = { "/bin/cat", "-", ">/tmp/receive.dat" }; 
ProcessBuilder builder = new ProcessBuilder (cmdArray); 
builder.directory (new File ("/tmp")); 
Process p = builder.start(); 
OutputStream pos = p.getOutputStream(); 

byte [] bytes = "hello world".getBytes(); 
pos.write (bytes); 
pos.close(); 
p.waitFor(); 

同じことが当然のようになっcmdArrayと、Windows環境で起こります

cmd /c type con >c:\tmp\receive.dat 

印刷を直接から、System.outにjavaは、Javaプログラムのlivecycle内で呼び出されるべきである多くのサブプロセスを代替するものではありません。

thx助けてください! Tombo

答えて

1

ここでの問題点は、/bin/catが実際にファイルに書き込まれないことです。単に標準出力に書き込みます。出力のリダイレクト>/tmp/receive.datは実際にシェルによって実行されますが、この方法でcatを呼び出すことによってシェルをバイパスしています。

達成しようとしているのは、単にファイルに書き込むOutputStreamだけで、標準のJava I/O(FileOutputStreamやfriendsなど)を使用している場合です。また、シェルに依存するものとは異なり、クロスプラットフォーム(Windowsフレンドリ)でもあります。

サブプロセスのためにjavaから標準出力に書き込めないというコメントについては、あなたが呼び出すサブプロセスは親プロセス(javaプロセス - ProcessBuilder.Redirect.INHERIT参照)から標準を継承することができます。したがって、javaからサブプロセスを呼び出す場合でも、すべての出力をファイルにリダイレクトすることは、最初の例(Javaプログラムがechoコマンドを置き換える)と同じ方法で動作するはずです。

+0

変です!もちろん、出力のリダイレクトはシェルによって行われますが、ここにはシェルがありません> /tmp/receive.datがcatにパラメータとして送信されました...別の受信者コマンド(ghostscript)を使ってテストしました元気? –

+0

ghostscript自体には、 "> file"を "ファイルに書き込む"と解釈する特別なロジックがあるかもしれませんが、catにはそのような機能はありません(常に単に標準出力に書き出します)。私はcatの逆であるコマンドを探していました(標準入力をパラメータとして指定されたファイルに書きます)が、そのようなことは見ませんでした。 – thewmo

-1

おそらくProcessBuilder#redirectOutput(File)が必要です。>機能はcatのものではなく、cat(私たちの言う意味ではプロセスビルダー)のものです。

+0

コマンドシェルの機能です。 'cat'とプロセスビルダーのどちらにも何もしません。 – EJP

関連する問題