Scanner.hasNext () возвращает false - PullRequest
4 голосов
/ 14 декабря 2011

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

File f1 = new File("data/cityDistances/a.txt"),
     f2 = new File("data/cityDistances/b.txt");
System.out.println(f1.exists() && f2.exists()); //return true
System.out.println(f1.getTotalSpace() > 0 && f2.getTotalSpace() > 0); //return true
Scanner in = new Scanner(f1);
System.out.println(in.hasNext()); // return false;
System.out.println(in.hasNextLine()); //return false;

Почему он может так себя вести?


Мне удалось сделать это с помощью BufferedReader.Тем не менее, кажется еще более странным, что BufferedReader работает, а Scanner - нет.

Ответы [ 7 ]

7 голосов
/ 14 декабря 2011

Поскольку в качестве разделителя по умолчанию для Сканера используется пробел, это означает, что ваш a.txt содержит только пробел - имеет ли он 800 строк пробела? ;)

Вы пробовали следующее?

new Scanner(new BufferedReader(new FileReader("a.txt")));
6 голосов
/ 11 мая 2013

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

scan = new Scanner(selectedFile,"ISO-8859-1");
3 голосов
/ 16 сентября 2013

Это также случилось со мной сегодня. Я читаю простой текстовый файл из системы Linux, написанный каким-либо приложением в окне Windows, и Scanner.hasNextLine() всегда ложно, даже если есть строки с разделителем строк Windows и все. Как сказал Hound Dog, используя

Scanner scanner = new Scanner(new BufferedReader(new FileReader(file))); 

это сработало как шарм. FileReader или BufferedReader, похоже, правильно идентифицируют и используют некоторые характеристики файла.

1 голос
/ 14 декабря 2011

Проверка исключения сканера может показать, что файл не может быть прочитан.

...
System.out.println(in.hasNext()); // return false;
IOException ex = in.ioException();
if (ex != null)
  ex.printStackTrace(System.out);
...
0 голосов
/ 05 сентября 2012

Это, вероятно, не отвечает на вопрос OP, но для любого другого, кто испытывает "hasNext () моего итератора всегда false!" - если у вас есть куча часов с .next () в них, ваша IDEили что бы то ни было фактически продвигает позицию курсора для каждого.Это доставило мне много хлопот.Будьте осторожны с итераторами и часами.

0 голосов
/ 14 декабря 2011

ссылается на адрес файла, который вы используете linux, ссылаетесь на ваше имя, возможно, есть какой-то польский или чешский символ и смотрите ссылку ниже, сканеру не нравятся символы не utf-8 на linux:)

http://karussell.wordpress.com/2008/09/04/encoding-issues-solutions-for-linux-and-within-java-apps/

0 голосов
/ 14 декабря 2011

Функция File.getTotalSpace () работает не так, как вы ожидаете. Он возвращает размер раздела, в котором находятся эти конкретные файлы.

Вы хотите использовать File.length ().

...