Как избавиться от потери строк Buffered Reader/Writer

170
27 февраля 2019, 03:30

Суть в следующем: Читаю файл построчно с помощью BufferedReader

BF = new BufferedReader(new InputStreamReader(new FileInputStream(file)));

Затем обрабатываю строки (удаляю неугодные символы/слова) И записываю обратно

PrintWriter PW = new PrintWriter(new OutputStreamWriter(new FileOutputStream(Filenew)));
String C;
long lineCounter = 0L;
while (((C=BF.readLine())!=null)) {
    C = CensorLine(C);
    if (C == null) {
        PW.flush();
        PW.close();
        BF.close();
        break;
    }
    String censored = CensorOr(C);
    PW.println(censored);
    //PW.append('\n');
    if (lineCounter % 500L == 0L) {
        PW.flush();
    }
    ++lineCounter;
}

Проблема в том, что когда я заканчиваю читать файл if (C == null)

Я останавливаю и запись в файл, и как следствие - теряю несколько последних строчек файла (около 10). Подскажите, как избавиться от потери строк.

Answer 1

Если при прочтении очередной строки (C = BF.readLine()) переменная C будет равна null, то тело while-а не выполнится.
Соответственно, в теле цикла C не равна null, поэтому CensorLine(C) также не вернёт не null (исходя из комментариев к вопросу).
В итоге условие if (C == null) всегда ложно. Это приводит к тому, что PW не закрывается (так как после while его закрытия нет), что чревато потерей результатов.

Нужно добавить закрытие ресурсов после цикла. А для избежания подобных проблем можно пользоваться конструкций try-with-resources:

try (BufferedReader reader = new BufferedReader(new FileReader(fileName));
        PrintWriter writer = new PrintWriter(newFileName))
{
    String line;
    int lineCounter = 0;
    while ((line = reader.readLine()) != null)
    {
        String censored = cencorOr(cencorLine(line));
        writer.println(censored);
        lineCounter++;
        if (lineCounter == 500)
        {
            writer.flush();
            lineCounter = 0;
        }
    }
}
catch (Exception e)
{
    System.out.println(e.getMessage());
}
READ ALSO
Убрать значение в периоде

Убрать значение в периоде

Как можно убрать значение в периоде в строке? те

191
Прочитать последнюю строку в тхт файле

Прочитать последнюю строку в тхт файле

Подскажите пожалуйста, нужно прочитать последнюю строку в тхт файлеНашел такой пример, но он не выводит юникод(вместо него кракозябры), можно...

169
Spring кириллица в аргументах get запросов

Spring кириллица в аргументах get запросов

Есть проект, к которому подключен Spring 32

201
Выбор тестов для запуска в Jenkins

Выбор тестов для запуска в Jenkins

Есть следующая проблема: Необходимо настроить возможность в билде запускать тесты по одному/выбрав несколько конкретных

172