プログラムの問題はリアルタイムで動作します。
例: getevent
しかし、プロセスから出てくるデータを読み込もうとすると、exec はそれらの部分に少なくとも 4096 バイトを与えます!
例えば:
- getevent が1000 バイトのテキストを 返した場合: stdout.available () == 0
- getevent が4000 バイトのテキストを 返した場合: stdout.available () == 0
- getevent が 4096 バイトのテキストを返した場合: stdout.available () == 4096
- getevent が 8192 バイトのテキストを返した場合: stdout.available () == 8192
- getevent が10000 バイトのテキストを 返した場合: stdout.available () == 8192
stdout.read() を使用する場合、関数は 4096*n バイトまで、または getevent が閉じられるまで待機します。
4096 バイトがダイヤルされるまで待つのではなく、リアルタイムでデータを読み取るにはどうすればよいですか?
Process p = Runtime.getRuntime().exec(new String[]{"su", "-c", "system/bin/sh"});
DataOutputStream stdin = new DataOutputStream(p.getOutputStream());
stdin.writeBytes("getevent\n");
InputStream stdout = p.getInputStream();
byte[] buffer = new byte[1];
int read;
String out = new String();
while(true){
read = stdout.read(buffer);
out += new String(buffer, 0, read);
System.out.println("MYLOG: "+(new String(buffer, 0, read)));
}
これはドキュメントでバフされていることがわかりました!
ストリームの最後に到達するまで、InputStream を OutputStream にコピーします。このメソッドは、4096 kbyte のバッファを使用します。
>>ドキュメント