【问题标题】:Buffer size in JavaJava中的缓冲区大小
【发布时间】:2014-02-09 19:06:05
【问题描述】:

我有一个关于 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数组?

【问题讨论】:

    标签: java file io buffer


    【解决方案1】:

    为避免对文件系统造成浪费,字节大小应为文件系统扇区大小的倍数(例如 512 字节)。

    同样适用于 CPU L1 缓存。 大多数 Intel 486 CPU 具有 1K L1 高速缓存,因此值为 1024。 Pentium CPU 至少有 8K L1 缓存,因此8 * 1024 也经常使用。

    最近的文件系统的扇区大小为4K,最近的 CPU 至少有 64K L1 Cache,因此64 * 1024 也是一个选择。

    【讨论】:

    • 这可以正确回答更多问题。实际上,文件系统不会一次读取或写入一个字节。它一次移动字节块。我试图回忆一下我不久前读到这个的时候,所以可能是不正确的,但我相信如果你选择了508 的缓冲区大小并且系统一次移动512 字节,那么你试图移动的四个字节save 无论如何都不会被文件系统使用。
    【解决方案2】:

    read来自文件流的bytes.length字节长度并将它们存储在字节数组bytes[]中。然后你 write 字节在 outputStreem 形式 bytes[] 数组中。更多信息请阅读Java I/O 文档。

    【讨论】:

    • 但是为什么2^n?为什么不只是1000
    • 那么我们为什么要使用千字节呢?
    • @Tony 举例。
    猜你喜欢
    • 2018-05-15
    • 2011-02-08
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    相关资源
    最近更新 更多