5

によって既に送信されたデータのサイズを表示しようとしましたOutputStreamWriterが、write方法は非同期のようなものであるようです。つまり、ファイルが 60M でアップロード速度が 200K/s の場合、出力には「Data sent: 61210K」の 1 行のみが表示されます。 " (または任意の大きな数) であるはずの (1 秒あたりの小さな数) の代わりに

私は何か見落としてますか?

コード片:

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が呼び出されると、完了するまでスレッドが停止します。StreamEncoderただし、 inによって、および返されたOutputStreamWriterby の実装によって、いくらかのバッファリングが行われています。どちらもそれほど大量のデータをバッファリングしないため、問題は別の場所にある可能性があります。OutputStreamURLConnection

于 2013-05-03T21:18:23.483 に答える