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

标签 java stream io buffer

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

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/

相关文章:

python - 如何使用 Python 从 Firestore 批量删除特定文档

java - spring ehcache 没有这样的方法报错

ffmpeg - 使用 FFMPEG 将 MJPEG RTP 流转换为 MP4 RTP 流 - 如何?

java - 当使用 ObjectOutputStream/ObjectInputStream 传输自定义对象时,变量将被重置

node.js - 如何在不使用阻塞 stdio 的情况下从 node.js 中的子进程传输/流式传输大数据?

Java:使用文本文件

java - 使用 toString 逐行打印到文本文件

java - 使用 Gson 将 LinkedTreeMap 解码为属性?

java - 将特定图像转换为 Base64 字符串不正确

java - 如果没有 Web 层并因此没有 HTTP session ,CDI 是否有意义?