启用换行符时扫描仪的缓冲区不代表整个文件
Scanner's buffer not representative of entire file when newlines enabled
基本上,我正在做的是写入一个文件,然后再读取它。有几次我在查看缓冲区,看到行 'cut off,' 并开始担心这是一个刷新问题。但是,我偶然发现了 this question,其中指出:
So, it appears scanner does not read the entire file at once...it reads file by buffer - which means in chunks.
而且我在我的扫描仪中看到了这一点。查看缓冲区大小,我看到大小为 1024。
但是!我将每个条目写成单独的一行,传递消息并在写入之前附加 \n
到它。去掉 \n
会产生一些有趣的结果。当 运行 没有换行符时,我发现缓冲区大小神奇地增加到 5,232 这样有趣的东西,我现在可以在缓冲区中看到文件的全部内容!
我制作 Scanner 的方式很简单 new Scanner(new FileInputStream("path.txt"))
,然后使用 Intellij 的变量检查来检查它(这就是我想切断的地方,我无法看到文件)
本质上,我的问题是:为什么添加换行符会强制缓冲区为固定大小并遵守规则,而不添加换行符(意味着整个文件只是一行)让缓冲区任意大小需要吗?
我建议,如果您只想读取文件,请使用 BufferedReader
而不是 Scanner
。有关详细信息,请参阅此 Stack Overflow post。
回答你的问题:
没错,默认的 Scanner 缓冲区大小是 1024 (as seen here)。
您的扫描仪缓冲区较大的问题是由于
扫描仪总是将最长的行读入其缓冲区,即使
如果它比默认的 1024 字节长。删除所有 \n
在你的文件中让扫描仪认为只有一行很长,
它必须缓冲。
如你所见here,缓冲区大小对效率几乎没有影响
当你正在阅读文件时。
希望能帮到你
基本上,我正在做的是写入一个文件,然后再读取它。有几次我在查看缓冲区,看到行 'cut off,' 并开始担心这是一个刷新问题。但是,我偶然发现了 this question,其中指出:
So, it appears scanner does not read the entire file at once...it reads file by buffer - which means in chunks.
而且我在我的扫描仪中看到了这一点。查看缓冲区大小,我看到大小为 1024。
但是!我将每个条目写成单独的一行,传递消息并在写入之前附加 \n
到它。去掉 \n
会产生一些有趣的结果。当 运行 没有换行符时,我发现缓冲区大小神奇地增加到 5,232 这样有趣的东西,我现在可以在缓冲区中看到文件的全部内容!
我制作 Scanner 的方式很简单 new Scanner(new FileInputStream("path.txt"))
,然后使用 Intellij 的变量检查来检查它(这就是我想切断的地方,我无法看到文件)
本质上,我的问题是:为什么添加换行符会强制缓冲区为固定大小并遵守规则,而不添加换行符(意味着整个文件只是一行)让缓冲区任意大小需要吗?
我建议,如果您只想读取文件,请使用 BufferedReader
而不是 Scanner
。有关详细信息,请参阅此 Stack Overflow post。
回答你的问题: 没错,默认的 Scanner 缓冲区大小是 1024 (as seen here)。
您的扫描仪缓冲区较大的问题是由于
扫描仪总是将最长的行读入其缓冲区,即使
如果它比默认的 1024 字节长。删除所有 \n
在你的文件中让扫描仪认为只有一行很长,
它必须缓冲。
如你所见here,缓冲区大小对效率几乎没有影响 当你正在阅读文件时。
希望能帮到你