Java BufferedReader.readLine () не может прочитать всю строку файла - PullRequest
0 голосов
/ 24 октября 2018

наша внутренняя программа читает текстовый файл и обрабатывает что-то построчно.

для чтения файла построчно, использует bufferedReader.readLine.

, но иногда, раз в квартал, bufferedReader не может прочитать всю строку.

, если на самом деле существует 1000 строковый файл, readLine() просто прочитайте 1 ~ 530.

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

этот файл загружен через FTP и пакет средства просмотра файлов для обнаружения файла запущен.

ниже указан код:

String fromFilePath = "/DATA/EXAMPLE.TXT"; //upload filepath example
String toFilePath = "/DATA/PROC/EXAMPLE.TXT";  //filepath to move

//read file after moving to another directory, to avoid catching file by file watcher and file in target path never exist. 
Files.move(Paths.get(fromFilePath), Paths.get(toFilePath), java.nio.file.StandardCopyOption.REPLACE_EXISTING, java.nio.file.StandardCopyOption.ATOMIC_MOVE);

BufferedReader br = new BufferedReader((new InputStreamReader(new FileInputStream(toFilePath, "UTF-8")));
int fileRowCount = 0;
String readLineResult = null;

while(readLineResult = br.readLine() != null){
  fileRowCount++;

  doBusinessLogic(readLineResult);

}

log.info("file log count {}", fileRowCount);

//confirm process to solve this problem. 
br = new BufferedReader((new InputStreamReader(new FileInputStream(toFilePath, "UTF-8")));
int assertCount= 0;

while(br.readLine() != null){
  assertCount++;
}

//it always print 'true' when occuring error, although BufferedReader is initialized newly 
log.info("assert {}", assertCount==fileRowCount);

fileRowCount не может печатать весь номер строки.конечно, doBusinessLogic также выполняется частично.

ОС: redhat 7.4

Java-версия: 1.7.0_181

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

используйте (readLineResult = br.readLine()) != null в цикле while. Также полезно использовать блок try catch при чтении файла.Для справки вы можете посетить здесь .

0 голосов
/ 24 октября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...