我有一个代码将日志文件存储到android中的SD卡。以下是代码。
process = Runtime.getRuntime().exec("logcat "+ LOG_TAG +":D *:S");
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
StringBuilder log = new StringBuilder();
String line;
while ((line = bufferedReader.readLine()) != null) {
//do something over here
}
它正在运行无限循环。 任何帮助。
答案 0 :(得分:1)
由于logCat永远不会结束,您可能会尝试在InputStream.available() == 0
时强制结束。
我使用将原始InputStream包装在ImpatientInputStream中来完成此操作。
由于非阻塞特性,第一次启动时可能为0,因此无论是否已读取内容,您都可以添加标记。
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(
new ImpatientInputStream(process.getInputStream())
));
public class ImpatientInputStream extends InputStream {
private final InputStream in;
private boolean eof;
public ImpatientInputStream(InputStream in) {
this.in = in;
}
@Override
public int read() throws IOException {
if (eof) {
return -1;
}
if (available() == 0) {
eof = true;
return -1;
}
return in.read();
}
}
答案 1 :(得分:0)
logcat
永不停止,它等待显示下一行,因此readLine()
在等待进程的下一个输入时阻塞。
然而,您可以使用-f filename
直接重定向命令的输出,如here所述。
This回答包含您需要的一切。
答案 2 :(得分:0)
您可以在while
循环中提供时间戳/时间段。下面的示例将使这更加清晰
示例:
while (System.currentTimeMillis() < end_time) {
//do your stuffs here
while ((line = bufferedReader.readLine()) != null) {
//do something over here
}
}