Scanner.hasNext()返回false

我有一个包含许多文件的目录 – 每个文件包含800多行。 Hovewer,当我尝试使用Scanner阅读它时,它似乎是空的。

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工作原理似乎更加奇怪。

由于Scanner的默认分隔符是空格,这意味着你的a.txt只包含空格 – 它有800行空白吗? ;)

你试过以下吗?

 new Scanner(new BufferedReader(new FileReader("a.txt"))); 

今天我在使用Scanner阅读文件时遇到了类似的问题。 我指定了文件的编码类型,它解决了问题。

 scan = new Scanner(selectedFile,"ISO-8859-1"); 

这也发生在我今天。 我正在从一个Windows系统中的某些应用程序编写的Linux系统中读取一个纯文本文件, Scanner.hasNextLine()总是假的,甚至很难有Windows行分隔符和所有行。 正如猎犬所说,通过使用

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

它就像一个魅力。 FileReader或BufferedReader似乎正确识别并使用某些文件特征。

检查扫描仪的exception可能表示无法读取文件。

 ... System.out.println(in.hasNext()); // return false; IOException ex = in.ioException(); if (ex != null) ex.printStackTrace(System.out); ... 

File.getTotalSpace()函数的行为与您的预期不符。 它返回这些特定文件所在分区的大小。

您想使用File.length()。

请参考您使用linux的文件地址,请参考您的名字,可能有一些波兰语或捷克语字符,请参阅下面的链接,扫描仪不喜欢linux上的非utf-8字符:)

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

这可能不能回答OP的问题,但是对于其他任何遇到“我的迭代器的hasNext()总是假的人来说!” – 如果你有一堆带有.next()的手表,你的IDE或其他什么是实际上每个推进光标位置。 这给我带来了很多麻烦。 小心迭代器和手表。