2010-10-04 214 views
6

我想了解的java文件中的一行是如下。使用Java扫描器读取文件

return new Scanner(file).useDelimiter("\\Z").next(); 

该文件有望重返高达“输入的目的,而是最后的终结者,如果有”每java.util.regex.Pattern中的文档。但是会发生什么,它只返回文件的前1024个字符。这是由正则表达式匹配器强加的限制吗?这可以克服吗?目前我正在使用文件读取器进行。但我想知道这种行为的原因。

+0

永远不要使用扫描仪!真的,你会遇到很多麻烦。 – 2010-10-04 18:17:42

+8

@Martijn Courteaux - 谨慎提供扫描仪为什么不好的细节。 – whaley 2010-10-06 13:52:31

回答

2

尝试包裹file对象在FileInputStream

+0

你能否编辑你的答案来解释为什么这会有所帮助,以及潜在的问题是什么?就目前而言,这仅仅是一条评论。 – 2017-02-05 21:05:09

5

我自己,我无法重现这一点。但我认为我可以阐明发生了什么。

在内部,扫描仪使用1024个字符的字符缓冲区。如果可能的话,扫描仪将默认从可读的1024个字符中读取数据,然后应用该模式。

问题出现在你的模式中......它总是会匹配输入的结尾,但这并不意味着输入流/数据的结束。当Java将您的模式应用于缓冲数据时,它会尝试查找输入结束的第一个匹配项。由于1024个字符在缓冲区中,因此匹配引擎将调用位置1024作为分隔符的第一个匹配项,并将其作为第一个标记符返回之前的所有内容。

因为这个原因,我不认为在扫描器中使用输入结束锚点是有效的。毕竟,它可能是从无限的流中读取的。

+0

嗨马克,我认为这是扫描仪不工作的正确原因。我正在投票答复。使它正常工作的方法是标明正确的方法。谢谢您的回答。 – Sharmila 2010-10-04 17:55:05

1

Scanner旨在从文件中读取多个基元。它确实无意读取整个文件。

如果你不希望包括第三方库,你最好不要循环在BufferedReader换行的文本FileReader/InputStreamReader,或循环在FileInputStream二进制数据。

如果使用第三方库就好了,阿帕奇commons-ioFileUtils类,包含静态方法readFileToStringreadLines文字和readFileToByteArray二进制数据..

0

您可以使用扫描仪类,打开扫描仪时,只需指定一个字符集,即:

Scanner sc = new Scanner(file, "ISO-8859-1"); 

的Java转换从文件中读取字节到使用指定的字符集,这是默认的(从底层OS)如果没有被赋予字符(source )。目前还不清楚为什么Scanner只用默认的一个读取1024个字节,而另一个则到达文件的末尾。无论如何,它工作正常!