わかっていますが、われわれはストリームにデータを書き込むためのいくつかのツールをjavaに用意しています。
このサンプルコードでは、ランタイムでそれらを比較しました。
誰かが正確に説明できますか?ありがとう。PrintWriterとPrintStreamとOutputStreamWriterのタイムコード
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.io.PrintWriter;
public class IOtests
{
public static void main(String[] args) throws Exception
{
char[] chars = new char[100];
byte[] bytes = new byte[100];
for (int i = 0; i < 100; i++)
{
chars[i] = (char) i;
bytes[i] = (byte) i;
}
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(
"output.txt"));
long a = System.currentTimeMillis();
for (int i = 0; i < 100000; i++)
for (char j : chars)
out.write(j);
System.out.println("OutputStreamWriter writing characters: "
+ (System.currentTimeMillis() - a));
out = new OutputStreamWriter(new FileOutputStream("output.txt"));
a = System.currentTimeMillis();
for (int i = 0; i < 100000; i++)
for (byte j : bytes)
out.write(j);
System.out.println("OutputStreamWriter writing bytes: "
+ (System.currentTimeMillis() - a));
PrintStream out1 = new PrintStream("output.txt");
a = System.currentTimeMillis();
for (int i = 0; i < 100000; i++)
for (char j : chars)
out1.write(j);
System.out.println("PrintStream writing characters: "
+ (System.currentTimeMillis() - a));
out1 = new PrintStream("output.txt");
a = System.currentTimeMillis();
for (int i = 0; i < 100000; i++)
for (byte j : bytes)
out1.write(j);
System.out.println("PrintStream writing bytes: "
+ (System.currentTimeMillis() - a));
PrintWriter out2 = new PrintWriter("output.txt");
a = System.currentTimeMillis();
for (int i = 0; i < 100000; i++)
for (char j : chars)
out2.write(j);
System.out.println("PrintWriter writing characters: "
+ (System.currentTimeMillis() - a));
out1 = new PrintStream("output.txt");
a = System.currentTimeMillis();
for (int i = 0; i < 100000; i++)
for (byte j : bytes)
out2.write(j);
System.out.println("PrintWriter writing bytes: "
+ (System.currentTimeMillis() - a));
}
}
結果::
のOutputStreamWriter書き込み文字数:4141
のOutputStreamWriter書き込みバイト:3546行の
のPrintStream書き込み文字数:86516
のPrintStream書き込みバイト:70484
ここでは、コードですPrintWriter書き込み文字:938
PrintWriter書き込みバイト:2484
すべての時刻はミリ秒単位であることに注意してください。
出力を決して閉じることはできないので、すべてをバッファリングすることができます。さらに、ガーベジコレクションなどを実行していないJITウォームアップを提供していません。「PrintWriter writes bytes」は、*文字*のみを書き込むと誤解されます。暗黙的なバイトからintへの変換があります。さらに、一度に1バイトまたは1文字を書くことは、ほとんどの賢明なコードでは非現実的です。あなたは 'byte []'、 'char []'または 'String'を使ってオーバーロードを使います。 –
あなたのタイミング番号は非常に疑わしいです。 Javaで正しいベンチマークを書く方法については、[this thread](http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java)を参照してください。 –
@TedHoppこのアドバイスをすべて取っておけば、ディスク上のファイルに書き込むこと自体が予測不可能なプロセスです。 * nix上では、比較的予測可能なシンクとして '/ dev/null'を使うことができます。 Windowsでは、神は何を知っています。 –