2012-01-16 12 views
0

私はプロセスストリームからデータを読み込んでいます。基本的には、私はRuntime.exec APIを使用してプロセスを実行しており、プロセス入力ストリームを取得しています。ストリームからの不完全なデータ

私は、その後のようなプロセスの出力を収集しています
Runtime rt = Runtime.getRuntime(); 
process = rt.exec("C:/cygwin/home/grec.exe"); 
InputStream is = process.getInputStream(); 

- 私は、文字列の出力を印刷していますしかし、私は取得しています

  BufferedReader in = new BufferedReader(is);   
      char[] ls = new char[s.available()]; 
      ls.read(ls); 
      String output = new String(ls); 

-

break [loc]  Add a breakpoint at [file:]line or template 
    callflow [val] Enable call flow tracing 
    next   Execute the over instruction, stepping over calls 
    over   Execute the current instruction hierarchy 

しかし、実際に出力は -

break [loc]  Add a breakpoint at [file:]line or template 
    callflow [val] Enable call flow tracing 
    next   Execute the over instruction, stepping over calls 
    over   Execute the current instruction hierarchy 
    print <xpath> Print the value of an XPath expression 
profile [val] Turn profiler on or off 
reload   Reload the script contents 
run    Restart the script 
step   Execute the next instruction, stepping into calls 
verbose   Turn on verbose (-v) output logging 
where   Show the backtrace of template calls 
quit   Quit debugger 

つまり、出力の一部が切り捨てられますが、コードによって例外はスローされません。 BufferedReaderのサイズを増やし、配列のサイズを増やしてみました。この現象の原因を見つけるために、私は紛失しています。これの原因となる可能性のあるヒントや指針は高く評価されます。

+0

あなたのコード例では、 'S'は何ですか?そしておそらく私は何か見落としましたが、どうでしょうか? 'OutputStream out = process.getOutputStream();バッファリングされたリーダーbuffereredOut =新しいBufferedReader(出力); ' – bpgergo

+0

実際にはまったく同じことをやっています。そして、これは私がやっていることです。 – user496934

+0

ここでは実際にsはInputStreamを表しています。つまり、 - InputStream = process.getInputStream(); – user496934

答えて

1

available()は、実際に利用可能なバイト数/文字が何通りあるかを間違えています。実際には、少なくとも、が利用可能であることを伝えます。それは見積もりであるため間違っている可能性があります。

BufferedReaderにラップした後にInputStreamにアクセスして問題を解決します。したがって、読者から読み取ることができる文字の数字をにする代わりに、まだバッファにまだ読み込まれていないバイトのの数を取得しています。


おそらく、単にreadLine()を使用して、一度にBufferedReaderラインからの読み取り方が良いです。

+0

こんにちはスティーブン、説明をありがとう。今私は自分のコードの間違いを理解しています。私は私のコードでBufferedReader.readLine APIを使用してみました。しかし、ここで私は別の問題に直面しています。私のプロセス出力は - sdbです:SLAXデバッガ(バージョン0.9.6) ヘルプ 'help'と入力してください (sdb) – user496934

+0

最後の行はです。この場合、readLineコールは何の例外も与えずにハングアップします。 – user496934

+0

プロセス出力には最終出力として常にが含まれます。すべての行が正しく取得されますが、lastlineでは常にハングし、readLineへの最後の呼び出しからは戻りません。 – user496934

1

ループを使用してすべての情報を処理し、ストリームの終わりまで読み取ります。

Inputstream.availableは()あなたが期待何をしていません。

がによってをブロックせずにこの入力ストリームから読み取ることができる(またはスキップできる)バイト数のを推定返します。この入力ストリームのメソッドの次の呼び出し。

http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html#available%28%29

関連する問題