コードを機能させるために必要な最小限の変更を加えようとしました。st0le は、ストリーム コピーのより適切なバージョンを提供するという点で優れた仕事をしました。
public class Test {
private static final String FORMAT = "UTF-8";
private static final int BUFFER_SIZE = 10; // for demonstration purposes.
public static void main(String[] args) throws Exception {
String string = "This is a test of the public broadcast system";
int clen = string.length();
ByteArrayInputStream in = new ByteArrayInputStream(string.getBytes(FORMAT));
OutputStream out = System.out;
int pos = 0, total_pos = 0;
byte[] buffer = new byte[BUFFER_SIZE];
while (pos != -1) {
pos = in.read(buffer, 0, BUFFER_SIZE);
if (pos > 0) {
total_pos += pos;
out.write(buffer, 0, pos);
setProgress((int) (total_pos * 100 / clen));
}
}
}
private static void setProgress(int i) {
}
}
- バッファを出力ストリームに書き出すときに、 posの値を無視していました。
- また、ファイルの末尾を読み取った可能性があるため、 posの値を再確認する必要があります。その場合、 total_posをインクリメントしません(ただし、おそらく 100% 完了したことを報告する必要があります)。
- 適切な場所で close() を使用して、リソースを正しく処理してください。
-編集- 配列をバッファとして使用する一般的な理由は、出力ストリームがより大きなデータセットでできる限り多くの作業を実行できるようにするためです。
コンソールへの書き込みには大きな遅延はないかもしれませんが、書き込み中のネットワーク ソケットまたはその他の遅いデバイスである可能性があります。JavaDocの状態として
OutputStream の write メソッドは、書き出されるバイトごとに 1 つの引数の write メソッドを呼び出します。サブクラスは、このメソッドをオーバーライドして、より効率的な実装を提供することをお勧めします。
Buffered Input/Output Stream を使用する場合にこれを使用する利点は、おそらく最小限です。