java - 使用 Java 扫描器读取文件

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

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

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

根据 java.util.regex.Pattern 文档,该文件预计会返回到“输入的末尾,但对于最终终止符,如果有的话”。但实际情况是它只返回文件的前 1024 个字符。这是正则表达式模式匹配器强加的限制吗?这可以克服吗?目前我正在使用文件阅读器。但我想知道这种行为的原因。

最佳答案

我自己,我无法重现这个。但我想我可以阐明正在发生的事情。

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

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

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

关于java - 使用 Java 扫描器读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3857584/

相关文章:

python - 使用正则表达式使用反斜杠分割字符串

php - Mail.php 不适用于 .htaccess

java - 如何设计保存/打印文件?

java - 如何避免数据库死锁

java - 如果我的cacheResolver 发现没有缓存可以使用,我应该返回什么?

python - 组合多个正则表达式模式 1 用于匹配,其余用于排除

python - 如何检查 slurm 作业是否是数组中最后一个 **RUNNING**?

Python:根据第一个元素对数组中的元组进行排序

java - 预期位置参数计数 : 2, 实际参数:

java - 使用 JPA 选择前 1 个结果