2013-04-15 28 views
4

我試圖顯示OutputStreamWriter已經發送的數據的大小,但似乎write方法有點像異步,這意味着如果文件是60M,上傳速率是200K/s,輸出只顯示一行「數據發送:61210K「(或任何大數字),而不是應該是什麼(每秒小數)如何監視HttpURLConnection發送的數據的大小?

我錯過了什麼嗎?

碼片:

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(); 
+0

OutputStreamWriter包裝了什麼'out'?一個底層的'StreamEncoder'會寫入。 –

+0

它只是由java.net.URLConnection.getOutputStream()返回的OutputStream – NSF

回答

0

假設readerInputStreamReader,您正在跟蹤如何被讀取/發送,而不是字節數多的字符。如果您實際上沒有在讀/寫之間處理文本,則可以使用標準的InputStream/OutputStream來監控字節數。

另外,lastMsgTimeStamp沒有聲明,它是否被設置爲System.currentTimeMillis()在您的示例之外的某處?

無論哪種情況,OutputSteamWriter以及java.io.*包的其餘部分都處於阻塞狀態。因此,當調用write時,線程會停止,直到完成。但是有一些緩衝正在進行,由OutputStreamWriter中的StreamEncoder以及由URLConnection返回的OutputStream的執行。既不緩衝這麼多的數據,所以你的問題可能在別的地方。

相關問題