无限循环使用bufferedreader

时间:2014-08-21 08:58:42

标签: java android

我有一个代码将日志文件存储到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
}

它正在运行无限循环。 任何帮助。

3 个答案:

答案 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
        }
        }