Суть в следующем: Читаю файл построчно с помощью 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). Подскажите, как избавиться от потери строк.
Если при прочтении очередной строки (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());
}
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Подскажите пожалуйста, нужно прочитать последнюю строку в тхт файлеНашел такой пример, но он не выводит юникод(вместо него кракозябры), можно...
Есть следующая проблема: Необходимо настроить возможность в билде запускать тесты по одному/выбрав несколько конкретных