使用Java扫描程序读取文件

时间:2010-10-04 17:22:27

标签: java regex file-io java.util.scanner filereader

我试图理解的java文件中的一行如下所示。

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

根据java.util.regex.Pattern文档,该文件应返回“输入结束但最终终止符(如果有)”。但是,它只返回文件中的前1024个字符。这是正则表达式模式匹配器施加的限制吗?这可以克服吗?目前我正在使用文件阅读器。但我想知道这种行为的原因。

4 个答案:

答案 0 :(得分:5)

我自己,我无法重现这一点。但我想我可以说明发生的事情。

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

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

由于这个原因,我认为输入结束锚不适用于扫描仪。毕竟,它可能是从无限的流中读取的。

答案 1 :(得分:2)

尝试在file

中包装FileInputStream对象

答案 2 :(得分:1)

Scanner旨在从文件中读取多个基元。它实际上并不打算读取整个文件。

如果您不想包含第三方库,最好循环使用BufferedReader包裹FileReader / InputStreamReader文本或循环覆盖FileInputStream {1}}用于二进制数据。

如果你可以使用第三方库,那么Apache commons-io有一个FileUtils类,其中包含静态方法readFileToStringreadLines用于文本和{{ 3}}用于二进制数据..

答案 3 :(得分:0)

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

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

Java使用指定的字符集将从文件读取的字节转换为字符,如果没有给出(source),则该字符集是默认字符集(来自底层操作系统)。我仍然不清楚为什么Scanner只使用默认值读取1024个字节,而另一个则到达文件末尾。无论如何,它工作正常!