5

我试图显示已经发送的数据的大小,OutputStreamWriter但似乎该write方法有点像异步,这意味着如果文件为 60M,上传速率为 200K/s,输出仅显示一行“数据已发送:61210K "(或任何大的数字)而不是应该的(每秒的小数字)

我错过了什么?

代码段:

Writer writer = new OutputStreamWriter(out, POST_ENCODING);
char[] buf = new char[1024];
int read = 0;
long bytes = 0;
while ((read = reader.read(buf)) >= 0) {
    bytes += read;
    if (System.currentTimeMillis() - lastMsgTimeStamp > 1000) {
        lastMsgTimeStamp = System.currentTimeMillis();
        System.out.println("Data sent: " + (bytes / 1024) + " K");
    }
    writer.write(buf, 0, read);
}
writer.flush();
4

1 回答 1

0

假设readerInputStreamReader,您正在跟踪读取/发送的字符数,而不是字节数。如果您实际上没有在读/写之间处理文本,那么您可以使用标准InputStream/OutputStream来监视字节数。

另外,lastMsgTimeStamp没有声明,它是否被设置System.currentTimeMillis()在您的示例之外的某个地方?

在任何一种情况下,OutputSteamWriter以及java.io.*包的其余部分都会阻塞。所以当write被调用时,你的线程会停止,直到它完成。然而,有一些缓冲正在进行,由StreamEncoderinOutputStreamWriter和 return by 的OutputStream实现URLConnection。两者都没有缓冲如此大量的数据,因此您的问题可能出在其他地方。

于 2013-05-03T21:18:23.483 回答