PrintWriter의 쓰기 메소드가 너무 많다. 경우에 따라 적절히 써야겠지만 일일히 일단 한 번 다 돌려보고 메모해 놓는다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
public class printWriterTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
PrintWriter pw = null;
try {
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("text.txt", true));
pw = new PrintWriter(bufferedWriter, true);
//printWriter.println
long time1 = System.currentTimeMillis ();
for(int i=0;i<1000000;i++)
pw.println("우리 집에 왜 왔니?println\n");
long time2 = System.currentTimeMillis ();
//printWriter.printf
long time3 = System.currentTimeMillis ();
for(int i=0;i<1000000;i++)
pw.printf("%s", "우리 집에 왜 왔니?printf\n");
long time4 = System.currentTimeMillis ();
//printWriter.append
long time5 = System.currentTimeMillis ();
for(int i=0;i<1000000;i++)
pw.append("우리 집에 왜 왔니?append\n");
long time6 = System.currentTimeMillis ();
//printWriter.print
long time7 = System.currentTimeMillis ();
for(int i=0;i<1000000;i++)
pw.print("우리 집에 왜 왔니?print\n");
long time8 = System.currentTimeMillis ();
//printWriter.write
long time9 = System.currentTimeMillis ();
for(int i=0;i<1000000;i++)
pw.write("우리 집에 왜 왔니?print\n");
long time10 = System.currentTimeMillis ();
System.out.println ("test end");
System.out.println ("println: " + ( time2 - time1 ) / 1000.0 );
System.out.println ("printf: " + ( time4 - time3 ) / 1000.0 );
System.out.println ("append: " + ( time6 - time5 ) / 1000.0 );
System.out.println ("print: " + ( time8 - time7 ) / 1000.0 );
System.out.println ("write: " + ( time10 - time9 ) / 1000.0 );
} catch (Exception e) {
e.printStackTrace();
}finally {
pw.flush();
pw.close();
}
}
}
실험 코드의 BufferedWriter와 PrintWriter의 append, auto flush 인자에 따라 결과가 다르다. 각 bool 값이
true, true
true false
false true
false false
PrintWriter의 autoflush를 true로 주면 버퍼 flush가 자주 일어나서 printf, println의 경우 지연이 10배 이상 난다. 버퍼를 한 번에 많이 쓰는 경우가 아닐 경우 되도록 autoflush를 끄거나 append, print, write를 이용하자.
BufferedWriter의 write와 append
실험 코드
//bufferedWriter.append long time13 = System.currentTimeMillis (); for(int i=0;i<1000000;i++) bufferedWriter.append("우리 집에 왜 왔니?print\n"); long time14 = System.currentTimeMillis ();
인자는 true false