使用相同大小缓冲区的Java复制流

使用相同大小缓冲区的Java复制流,java,stream,Java,Stream,使用以下逻辑使用输入/输出流复制文件。使用BufferRedStreams真的有好处吗,因为它使用的是相同大小的字节缓冲区 int bufferSize = getDefaultBufferSize(); input = new BufferedInputStream(in, bufferSize); output = new BufferedOutputStream(out, bufferSize); byte[] buffer = new byte[bufferSize]; int numB

使用以下逻辑使用输入/输出流复制文件。使用BufferRedStreams真的有好处吗,因为它使用的是相同大小的字节缓冲区

int bufferSize = getDefaultBufferSize();
input = new BufferedInputStream(in, bufferSize);
output = new BufferedOutputStream(out, bufferSize);
byte[] buffer = new byte[bufferSize];
int numBytes = 0;
long totalBytes = 0L;
while ((numBytes = input.read(buffer)) != -1) {
    output.write(buffer, 0, numBytes);
    totalBytes += numBytes;
}
output.flush();
BufferedInputStream在这里对您没有任何好处


对于BufferedOutputStream,它不是那么清晰。底层输出设备可能支持有效传输大于输入流返回的块的块,因此删除BufferedOutputStream可能意味着您将进行更多的较小写入。

相同大小的块是什么?你到底在比较什么?是否要直接使用in和out?输入流/输出流/缓冲区的大小相同。不过,我不认为这些流是必要的,也不会提供任何性能提升,因为无论如何,在读写时都会使用阵列缓冲区。感谢您确认我的想法。在这种情况下,BufferredOutputStream难道不会有任何好处吗?由于数组缓冲区大小相同,并且我们正在使用缓冲区写入,因此无论是否使用BufferredOutputStream no?从输入流读取,底层输出设备问题都将适用,您将获得大小由输入设备确定的数据块。假设它通常是1kB。假设缓冲区大小为4kB。如果没有缓冲输出,您将在循环的每次运行中向输出设备写入1kB的块。使用缓冲输出,您将每运行4次写入4kB。很难说这是否是一个有意义的区别