要回答你的直接问题:(1)文件系统倾向于使用2的幂,所以你想要做同样的事情. (2)工作缓冲区越大,误差小的影响就越小.

如你所说,如果你分配4100并且实际的块大小是4096,你需要两次读取来填充缓冲区.相反,如果你有一个1,000,000字节的缓冲区,那么一个块高或低并不重要(因为它需要245个4096字节的块来填充该缓冲区).此外,较大的缓冲区意味着OS具有更好的订购读取的机会.

也就是说,我不会使用NIO.相反,我会使用一个简单的BufferedInputStream,我的read()可能有1k缓冲区.

NIO的主要好处是将数据保留在Java堆之外.例如,如果您正在读取和写入文件,则使用InputStream意味着操作系统将数据读入JVM管理的缓冲区,JVM将其复制到堆内缓冲区,然后再将其复制到堆外缓冲区,然后操作系统读取堆外缓冲区以写入实际的磁盘块(通常添加自己的缓冲区).在这种情况下,NIO将消除该本机堆副本.

但是,要计算哈希值,您需要拥有Java堆中的数据和Mac SPI will move it there.因此,您无法获得NBI保持数据堆外的好处,而IMO“旧IO”更容易来写.

只是不要忘记InputStream.read()不能保证读取你要求的所有字节.