Java中的缓冲区大小

Java中的缓冲区大小,java,file,io,buffer,Java,File,Io,Buffer,我有一个关于Java中缓冲区大小的小问题。为什么要将缓冲区大小设置为1024或2^n。例如: inputStream = file.getInputStream(); File newFile = new File("C:/uploads/operators.xml"); outputStream = new FileOutputStream(newFile); int read = 0; byte[] bytes = new byte[1024];

我有一个关于Java中缓冲区大小的小问题。为什么要将缓冲区大小设置为
1024
2^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(字节,0,读取)有效吗?为什么要使用
字节
数组?

从文件流中选择
字节长度的字节。长度
,并将它们存储在字节数组
字节[]
。然后以outputStreem形式创建字节
字节[]
数组。有关详细信息,请阅读文档。

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

这同样适用于CPU一级缓存。 大多数Intel 486 CPU都有1K一级缓存,因此值
1024
。 奔腾CPU至少有8K一级缓存,因此也经常使用
8*1024


最近的文件系统的扇区大小为
4K
,而最近的CPU至少有64K的一级缓存,因此
64*1024
也是一种选择。

但为什么
2^n
?为什么不仅仅是
1000
?@Tony因为。那么为什么我们要使用KB呢?@Tony举个例子。这正确地回答了更多问题。实际上,文件系统不会一次读取或写入一个字节。它一次移动字节块。我试图回忆一下我不久前读到的关于此的内容,因此可能不正确,但我相信如果您选择的缓冲区大小为
508
,并且系统一次移动
512
字节,那么您试图保存的四个字节无论如何都不会被文件系统使用。