BufferedWriter перестает писать через некоторое время

Я работаю над функцией регистрации, в которой я записываю тексты, добавленные в очередь, из которой журналы записываются в файл. Вот метод для записи:

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);
    }

}

Некоторое время он работает нормально, затем внезапно прекращает запись в файл. Последний напечатанный журнал - всегда половина отправленного оригинального текста. Все вопросы в SO указывают на "сбрасывать", но, как вы можете видеть, я покраснел писатель. Что мне не хватает? Метод добавления текста в очередь и вызывающий метод writeLogs синхронизированы. Сначала я подумал, что это связано с многопоточностью, но система печатает log.e каждый раз, что означает, что буферизованная запись получает текст, но не может писать. Любая помощь?

Вот метод для печати содержимого файла:

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);
        }
    }
}

1 ответ

Это было действительно глупо. На самом деле "Log.e" имеет ограничение на количество символов, которые могут быть напечатаны за один раз. Это было исчерпано. Вот почему я видел только половину журнала.

Другие вопросы по тегам