프로그램의 문제점은 실시간으로 작동합니다.
예 : getevent
그러나 프로세스에서 나오는 데이터를 읽으려고하면 exec는 최소한 4096 바이트를 제공합니다!Runtime.getRuntime()의 실시간 읽기 exec()
- getevent 반환 경우 1000 바이트의 텍스트 : getevent의 텍스트 4000 바이트 반환 0
- 경우 stdout.available() == 표준 출력 예
.available() == 0
- getevent가 4096 바이트의 텍스트를 반환하면 : stdout.available() == 4096 getevent 텍스트의 8192 바이트를 반환하는 경우 10
- 그 : 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)));
}
나는 이것을 문서에서 발견했습니다! 스트림이 끝날 때까지의 OutputStream에
가 복사되는 InputStream은 도달되었다. 이 방법은 4096k 바이트의 버퍼를 사용합니다.
[프로세스]에 대한 javadoc (http://developer.android.com/reference/java/lang/Process.html)은 1) 프로세스의'stdout'과'stderr' 스트림을 두 개의 쓰레드에서 동시에 읽거나 2) [redirectErrorStream (true)'] (http://developer.android.com/reference/java /lang/ProcessBuilder.html#redirectErrorStream(boolean))를 사용하여 스트림을 병합합니다. 만약 당신이 그 중 하나를하지 않으면 그 과정은 막을 수있다 :''이 스트림들이 읽히지 않으면, 버퍼 공간을 기다리는 동안 대상 프로세스가 차단 될 수있다. '''stderr'를 무시하면 실시간으로'stdout'를 읽지 못할 것입니다 ? 코드에서 – user113215
는'stdout'은 [항상 '0'반환]하는'InputStream' (http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html#이다 available())에서'available()'메소드를 호출한다. 또한 연결된 클래스는 공식적인 것이 아니며 4KB의 버퍼를 사용합니다. 1B의 버퍼를 사용합니다. –
@ user113215 선택됨. 도와주지 않았어. 4096 * n bytes ... – MixerOID