gpt4 book ai didi

Java = 下载缓冲区未填满?冲洗/缓冲如何工作?

转载 作者:太空宇宙 更新时间:2023-11-04 08:33:37 27 4
gpt4 key购买 nike

我想监控下载数据的进度。我想在传输一定量的数据后进行记录。我的代码:

int contentLength = 0;
final int bufferSize = 1024*8;
byte[] buffer = new byte[bufferSize];
int length = 0;

while ( (length = bufferedInputStream.read(buffer) ) !=-1 ) {
contentLength = contentLength+length;

if ( (contentLength % (bufferSize*1024*4)) ==0 ) {
logger.debug(contentLength);
}
}

这似乎不起作用。缓冲区似乎并不总是满的,因此用作模数的缓冲区大小的倍数不匹配。

缓冲区未“满”的情况真的很常见吗?怎么会发生这种事呢?缓冲区被“刷新”的内部逻辑是什么? Java是否等待特定时间接收数据包然后刷新(如果缓冲区未满)?任何其内部工作原理的信息都将有助于理解它。

(我不需要解决方案,我已经实现了其他解决方案,只是想知道缓冲区从未完全读取是否常见?并且很想了解原因。)

非常感谢!延斯

最佳答案

套接字上的读取操作不会准确填充缓冲区是很常见的。发送方正在刷新各种长度的数据包。然后,它们会穿过应用程序、操作系统和网络层,从而可能将它们碎片化。典型的结果是部分缓冲区读取。

我通常调整读取缓冲区的大小以匹配 socket's read buffer,它充当最大大小,但我从不依赖它每次都被填满。

此外,您应该注意,当您执行批量读取(到字节数组中)时,使用 BufferedInputStream 的效率很低。它只是增加了将数据从一个数组复制到另一个数组的开销。也是上面提到的碎片来源之一。

关于Java = 下载缓冲区未填满?冲洗/缓冲如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6914930/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com