2017-03-01 7 views
1

splitコマンドをJavaプログラムで実行しようとしています。私は、引数--verboseとコンソールでそれを実行すると、以下のように、それが生成されたチャンクを出力します。実行中のJavaプロセスの印刷出力

creating file 'chunk00' 
creating file 'chunk01' 
creating file 'chunk02' 

しかし、私はJavaプログラムでそれを実行すると、これらの出力は、処理が終了した後に印刷されます。 splitプロセスが実行されている間に出力を得るために必要なのは何ですか?

ProcessBuilder pb = new ProcessBuilder("split", "-a 2", "-d", "-b 52MB","--verbose",path+"/"+db,"chunk"); 
     pb.redirectErrorStream(true); 
     File workingFolder = new File("/home/hajibaba"); 
     pb.directory(workingFolder); 
     Process proc = pb.start(); 
     BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream())); 

     // read the output from the command 
     String s = null; 
     while ((s = stdInput.readLine()) != null) 
     { 
      System.out.println(s); 
     } 
     proc.waitFor(); 

しかし、それは印刷同じ結果を得るためechoを使用するbashスクリプトのために働く:

私は、次のコードを使用しました。

+1

また、 "-a 2" "-b"、 "52メガバイト" に "-a"、 "2"、また "-b 52メガバイト" に分割しなければなりません –

答えて

1

I/Oは対話型セッションではラインバッファリングされますが、パイプへの書き込み時にはバッファリングされます。

この問題を回避するには、unbufferコマンドでバッファリングをオフにすることができます。

ProcessBuilder pb = new ProcessBuilder("unbuffer", "split", "-a2", "-d", "-b52MB","--verbose",path+"/"+db,"chunk"); 

https://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe

関連する問題