Java Scanner hasNextLine возвращает false

Вероятно, это связано скорее с тем, что я не знаком с кодом, чем с чем-либо еще, но у меня по-прежнему возникает следующая проблема:

У меня есть текстовый файл с пустыми строками и сканер, который просматривает файл.

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

Но разве он не должен возвращать true независимо от того, есть ли в строках текст или нет?


person Justin    schedule 15.07.2011    source источник
comment
Мой хрустальный шар говорит, что вы делаете что-то не так в коде, но тогда мои способности ясновидения слишком слабы, чтобы заметить точную ошибку без кода, извините :p   -  person Voo    schedule 15.07.2011


Ответы (3)


Да, должно.

Попробуй это:

public static void main(String[] args){
    Test t = new Test();
    t.testHNL(new File("test.txt"));
}

public void testHNL(File f){
    try {
        Scanner s = new Scanner(new FileInputStream(f));
        while(s.hasNextLine()){
            System.out.println("There is another line!  :: "+s.nextLine());
        }
        System.out.println("There are no more lines :'(");
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
}

Убедитесь, что файл "text.txt" существует и в нем просто возвращается каретка. Тогда запустите это.

person MirroredFate    schedule 15.07.2011

используйте метод .hasNext() вместо метода .hasNextLine(). У вас проблемы, потому что метод .hasNextLine() возвращает true, только если в следующей строке есть какой-то контент. Принимая во внимание, что метод .hasNext() возвращает true, даже если в следующей строке есть какой-либо токен (здесь токен \n для следующей строки)

person Ishan Kothari    schedule 01.10.2013

Взято из источника для SUN (оракулов?) 1.5 JDK, все, что соответствует следующему регулярному выражению, рассматривается как «строка». Сюда входят пустые строки под Windows или linux/unix.

private static final String LINE_SEPARATOR_PATTERN = 
    "\r\n|[\n\r\u2028\u2029\u0085]"

Таким образом, он должен возвращать true, даже если строки пусты, за исключением возврата каретки.

person Tim Jones    schedule 15.07.2011