Java: найти, если последняя строка файла пуста
У меня есть вопрос о школьном задании, мне нужно сделать это на Java. Мне нужно загрузить данные из файла и проверить наличие ошибок в этих файлах.
Я прочитал файл с bufferedReader
который прекрасно работает до конца файла: он игнорирует последнюю строку, если эта строка пуста.
Я знаю, как проверить наличие пустых строк, но последняя строка просто не дает никакого результата, используя readLine()
функция bufferedReader
,
Важно, чтобы я знал, если последняя строка пуста, как это должно быть. Если пустая строка не существует, она должна выдать ошибку.
Короче говоря, мне нужен способ определить разницу между следующими ситуациями (где CRLF
это конец строки):
Ситуация 1 (правильно):
line x CRLF
line y CRLF
Ситуация 2 (неправильно):
line x CRLF
line y
Обе эти ситуации вернут ноль на readline()
после строки y.
Я подсчитываю строки файла в пути, поэтому, если у меня есть счетчик строк (Примечание: этот счетчик должен учитывать и эту пустую строку, все найденные мной не подсчитывают их)
Файлы также содержат пустые строки, если это должно иметь какое-то значение для кода, который мне нужен (эти строки правильно определяются, как они должны быть EOF
не в этих строчках)
Обратите внимание, что программа работает с последней строкой или без нее, это просто то, что присваивание говорит мне, чтобы я выдал ошибку, если ее там нет.
4 ответа
Если вы хотите определить, есть ли в последней строке CRLF, вы можете прочитать с конца.
public static boolean lastLineisCRLF(String filename) {
RandomAccessFile raf = null;
try {
raf = new RandomAccessFile(filename, "r");
long pos = raf.length() - 2;
if (pos < 0) return false; // too short
raf.seek(pos);
return raf.read() == '\r' && raf.read() == '\n';
} catch (IOException e) {
return false;
} finally {
if (raf != null) try {
raf.close();
} catch (IOException ignored) {
}
}
}
Посмотри на java.util.Scanner
, Вы сможете перебирать, используя Scanner#hasNextLine()
а также Scanner#nextLine()
,
Scanner scanner = new Scanner(file, "UTF-8");
String currentLine = null;
while(scanner.hasNextLine()) {
currentLine = scanner.nextLine();
}
// last line
System.out.println(currentLine);
В вашей "ситуации 1" нет пустой строки. CRLF
принадлежит линии y и после этого ничего не происходит (что к чему readline()
тоже говорит) Просто в редакторе это CRLF
приказывает курсору перейти на одну строку вниз, чтобы он выглядел как новая пустая строка, но на самом деле это просто "оптическая иллюзия", вызванная редактором, интерпретирующим символы CR/LF
в качестве подсказки, чтобы показать курсор в новой строке.
while ((tmp = br.readLine()) != null) {
strLine = tmp;
}
String lastLine = strLine;
Это даст вам последнюю строку файла. Почему бы не проверить, если последняя строка пуста или нет?