我试图理解的 java 文件中的一行如下。
return new Scanner(file).useDelimiter("\\Z").next();
根据 java.util.regex.Pattern 文档,该文件预计将返回到“输入的结尾,但对于最终终止符,如果有的话”。但发生的情况是它只返回文件中的前 1024 个字符。这是正则表达式模式匹配器施加的限制吗?这可以克服吗?目前我正在使用文件阅读器。但我想知道这种行为的原因。
我试图理解的 java 文件中的一行如下。
return new Scanner(file).useDelimiter("\\Z").next();
根据 java.util.regex.Pattern 文档,该文件预计将返回到“输入的结尾,但对于最终终止符,如果有的话”。但发生的情况是它只返回文件中的前 1024 个字符。这是正则表达式模式匹配器施加的限制吗?这可以克服吗?目前我正在使用文件阅读器。但我想知道这种行为的原因。
我自己,我无法重现这个。但我想我可以阐明正在发生的事情。
在内部,扫描程序使用 1024 个字符的字符缓冲区。默认情况下,扫描程序将从您的可读 1024 个字符中读取(如果可能),然后应用该模式。
问题出在您的模式中……它将始终与输入的结尾匹配,但这并不意味着您的输入流/数据的结尾。当 Java 将您的模式应用于缓冲数据时,它会尝试查找第一次出现的输入结尾。由于缓冲区中有 1024 个字符,因此匹配引擎将位置 1024 称为分隔符的第一个匹配项,并将其之前的所有内容作为第一个标记返回。
由于这个原因,我认为输入结束锚点不适用于扫描仪。毕竟,它可能是从无限流中读取的。
file
尝试将对象包装在FileInputStream
Scanner
旨在从文件中读取多个原语。它真的不打算读取整个文件。
如果您不想包含第三方库,则最好循环遍历BufferedReader
包含FileReader
/InputStreamReader
的文本,或循环遍历FileInputStream
二进制数据的 a。
如果您可以使用第三方库,Apache commons-io有一个FileUtils
包含静态方法readFileToString
以及readLines
文本和readFileToByteArray
二进制数据的类。
您可以使用 Scanner 类,只需在打开扫描仪时指定一个字符集,即:
Scanner sc = new Scanner(file, "ISO-8859-1");
Java 使用指定的字符集将从文件读取的字节转换为字符,如果没有给出任何内容(源),这是默认字符集(来自底层操作系统)。我仍然不清楚为什么 Scanner 仅读取 1024 字节的默认字节,而另一个它到达文件末尾。无论如何,它工作正常!