Java中的缓冲区大小

6

我对Java中缓存区大小有一个小问题。为什么我们要将缓存区大小设置为10242^n?例如:

    inputStream = file.getInputStream();
    File newFile = new File("C:/uploads/operators.xml");
    outputStream = new FileOutputStream(newFile);
    int read = 0;

    byte[] bytes = new byte[1024];
    while ((read = inputStream.read(bytes)) != -1) {
        outputStream.write(bytes, 0, read);
    }
    outputStream.close();
    inputStream.close();

outputStream.write(bytes, 0, read); 如何工作?我们为什么要使用 bytes 数组?

2个回答

2
为了避免对文件系统造成浪费,字节大小应该是文件系统扇区大小(例如512字节)的倍数。
同样适用于CPU L1缓存。大多数Intel 486 CPU具有1K L1缓存,因此值为1024。Pentium CPU至少具有8K L1缓存,因此通常使用8 * 1024。
最近的文件系统的扇区大小为4K,而最近的CPU至少具有64K L1缓存,因此64 * 1024也是一个选择。

这个回答更准确地回答了问题。实际上,文件系统不是一次读写一个字节,而是一次移动一块字节。 我试图回忆起我之前读到的内容,所以可能不正确,但我相信如果你选择了一个缓冲区大小为“508”,而系统每次移动“512”字节,那么你尝试保存的四个字节也不会被文件系统使用。 - Steve

1

你从文件流中读取了字节数组的长度bytes.length并将它们存储在字节数组bytes[]中。然后,你将bytes[]数组中的字节写入到outputStream中。如果需要更多信息,请阅读Java I/O文档。


但是为什么是 2^n?为什么不直接写成 1000 呢? - Tony
@Tony 因为 1024字节 == 1千字节 - Anton Dozortsev
那么为什么我们使用千字节? - Tony
@Tony 仅作为示例。 - Anton Dozortsev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接