gpt4 book ai didi

java - 写入 OutputStream 时测量中间吞吐量 [或] 为什么 write() 会阻塞,而 read() 不会?

转载 作者:行者123 更新时间:2023-12-01 05:22:22 25 4
gpt4 key购买 nike

我需要测量上传和下载大文件的中间吞吐量(通过 FTP 使用 Apache Commons Net API )。

下载:(没有问题)

一切都可以下载,它使用如下代码:

InputStream is = ftp.retrieveFileStream(filePath);
byte[] buffer = new byte[256 * 1024];
int read;

while ((read = is.read(buffer, 0, buffer.length)) != -1) {
Log.v(TAG, "Read = " + read);
}

此处,缓冲区大小为 256 KB,正在下载的文件总大小为 1 MB。但每次单独调用 is.read() 仅返回大约 2 KB。在这种情况下,read() 不会阻塞,直到缓冲区已满。这使我能够测量中间下载吞吐量。到目前为止一切顺利。

上传:(有问题)

现在痛苦来了。当我分配类似大小的缓冲区来写入 OutputStream 时,对 write() 的调用会阻塞,直到写入整个 256 KB。

为什么只有 write() 会阻塞,而 read() 不会?

所以我尝试使用nio 。与Outputstream的write()不同,WritableByteChannel的write()方法返回实际写入的字节数。所以它一定是非阻塞的,对吗?没有这样的运气。这个write()也会阻塞,直到整个缓冲区被写入。这是代码:

byte[] buffer = new byte[256 * 1024];
new Random.nextBytes(byteArray);

OutputStream os = ftp.storeFileStream(filePath);
WritableByteChannel channel = Channels.newChannel(os);
ByteBuffer byteBuffer = ByteBuffer.wrap(byteArray);
int written = channel.write(byteBuffer);

那么当上传阻塞时如何测量中间吞吐量?

一种方法是使用 Android 的 TrafficStats API 。但它也有其自身的一系列挫折。根据文档,这些统计信息可能不适用于所有平台。它还需要处理整数计数器溢出(2GB之后)和counter reset bugs等场景。 on some platforms在 3G 和 Wifi 之间切换时。

有人可以告诉我一条出路吗?

最佳答案

Why does only write() block, whereas read() doesn't?

因为这就是底层操作系统的行为方式。

关于java - 写入 OutputStream 时测量中间吞吐量 [或] 为什么 write() 会阻塞,而 read() 不会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10179177/

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