首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >BufferedWriter过了一段时间就停止写作了

BufferedWriter过了一段时间就停止写作了
EN

Stack Overflow用户
提问于 2018-07-26 13:03:23
回答 1查看 102关注 0票数 0

我正在开发一个日志功能,在这个特性中,我将日志文本添加到队列中,从队列中将日志写入文件。下面是编写以下内容的方法:

代码语言:javascript
运行
复制
private void writeLogs(File logFile, String logText) {
    try {
        if (logFile == null || !logFile.exists() || logText == null || logText.isEmpty()) {
            return;
        }
        synchronized (lock) {
            BufferedWriter buf = null;
            FileOutputStream fos = null;
            if (megabytesAvailable(logFile) > 5) {
                try {

                    buf = new BufferedWriter(new FileWriter(logFile, true));
                    buf.append(logText);
                    Log.e("writeLogs", logText);
                    buf.append("\r\n");
                    //buf.newLine();
                } catch (Exception e) {
                    Log.e("writeLog", "e", e);
                } finally {
                    buf.flush();
                    buf.close();
                }
            }
        }
    } catch (Exception ex) {
        Log.e("writeLogs1","E",ex);
    }

}

它可以正常工作一段时间,然后突然停止了对文件的写入。最后打印的日志总是发送给的原始文本的一半。所有的问题都指向“冲”,但正如你所看到的,我已经脸红了作家。我遗漏了什么?同步了向队列添加文本的方法和writeLogs的调用方法。起初,我认为这与线程死锁有关,但每次系统都会打印log.e,这意味着缓冲的写获得文本,但无法写入。有什么帮助吗?

下面是打印文件内容的方法:

代码语言:javascript
运行
复制
public void printLogFileContent(){ /** Only for testing purpose **/
    BufferedReader br = null;
    try {
        br = new BufferedReader(new FileReader(logFile.getAbsolutePath()));
        StringBuilder sb = new StringBuilder();
        String line = br.readLine();
        while (line != null) {
            sb.append(line);
            sb.append("\n");
            line = br.readLine();
        }
        Log.e("printLogFileContent",sb.toString());
    } catch (FileNotFoundException e) {
        Log.e("FileNoF","E",e);
    } catch (IOException e) {
        Log.e("IOE","E",e);
    } finally {
        try {
            br.close();
        } catch (IOException e) {
            Log.e("IOE2","E",e);
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2018-07-27 07:05:40

这是一件非常愚蠢的事。实际上,"Log.e“有一个字符限制,可以一次打印。已经精疲力竭了。这就是为什么我只看到一半的日志。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51539528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档