태그 보관물: FileWriter

BufferedWriter vs BufferedOutputStream 성능차이..

로그 데이터를 파일에 저장하기 위해서 BufferedWriter 클래스를 사용하다가, 갑자기 BufferedOutputStream으로 처리하는 것과의 성능상 차이에 대해서 확인하고 싶어서, 동일한 데이타를 파일에 저장해 봤다. 두 클래스의 성능 차이는 별로 없어 보이지만 그래도 확인 해 보자. 아래의 BufferWriterTest, BufferOutputStream 클래스의 buffersize는 1024로 동일하다.

– BufferWriterTest.java

import java.util.*;
import java.text.*;
import java.io.*;

public class BufferWriterTest {
	//
	static DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");

	static String txt = "가나다라마바사아자차타파하가나다라마바사아자차타파하가나다라마바사아자차타파하"
			+ "가나다라마바사아자차타파하가나다라마바사아자차타파하가나다라마바사아자차타파하가나다라"
			+ "가나다라마바사아자차타파하가나다라마바사아자차타파하가나다라마바사아자차타파하"
			+ "가나다라마바사아자차타파하가나다라마바사아자차타파하가나다라마바사아자차타파하"
			+ "가나다라마바사아자차타파하가나다라마바사아자차타파하가나다라마바사아자차타파하가나다라마바사아자차타파하가나다라마바사아자차타파하가나다라마바사아자차타파하가나다라마바사아자차타파하가나다라마바사아자차타파하"
			+ "가나다라마바사아자차타파하가나다라마바사아자차타파하" + "가나다라마바사아자차타파하가나다라마바사아자차타파하"
			+ "가나다라마바사아자차타파하마바사아자차타파하";

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Date start = new Date();
		System.out.println("s – " + df.format(start));

		BufferedWriter bufferWriter;

		try {
			bufferWriter = new BufferedWriter(new FileWriter("c:\\BufferedWriter.txt", true), 1024);
			for (int i = 0; i < 5000000; i++) {
				bufferWriter.write(BufferWriterTest.txt);
				bufferWriter.newLine();
			}

			bufferWriter.flush();
			bufferWriter.close();
		} catch (IOException e) {
			e.printStackTrace();
		}

		Date end = new Date();
		System.out.println("e – " + df.format(end));
	}
}

결과(3.15G 파일 쓰기)

s – 2009-06-19 15:55:00:968
e – 2009-06-19 15:55:48:280

– BufferOutputStreamTest.java

import java.io.IOException;
import java.io.FileOutputStream;
import java.io.BufferedOutputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class BufferOutputStreamTest {
	//
	static DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
	static String txt = "가나다라마바사아자차타파하가나다라마바사아자차타파하가나다라마바사아자차타파하"
			+ 	"가나다라마바사아자차타파하가나다라마바사아자차타파하가나다라마바사아자차타파하가나다라"
			+	"가나다라마바사아자차타파하가나다라마바사아자차타파하가나다라마바사아자차타파하"
			+ 	"가나다라마바사아자차타파하가나다라마바사아자차타파하가나다라마바사아자차타파하"
			+	"가나다라마바사아자차타파하가나다라마바사아자차타파하가나다라마바사아자차타파하" 
			+ "가나다라마바사아자차타파하가나다라마바사아자차타파하가나다라마바사아자차타파하"
			+ "가나다라마바사아자차타파하가나다라마바사아자차타파하가나다라마바사아자차타파하"
			+ "가나다라마바사아자차타파하가나다라마바사아자차타파하가나다라마바사아자차타파하" 
			+ 	"가나다라마바사아자차타파하마바사아자차타파하";

	/**
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		Date start = new Date();
		System.out.println("s – " + df.format(start));

		BufferedOutputStream bufferedOutput;
		try {
			bufferedOutput = new BufferedOutputStream(new FileOutputStream("c:\\BufferedStream.txt", true), 1024);

			for (int i = 0; i < 5000000; i++) {
				bufferedOutput.write(txt.getBytes());
				bufferedOutput.write("\n".getBytes());
			}
			bufferedOutput.close();
		} catch (IOException e) {
			e.printStackTrace();
		}

		Date end = new Date();
		System.out.println("e – " + df.format(end));
	}
}

결과(3.15G 파일 쓰기, )

s – 2009-06-19 15:56:41:889
e – 2009-06-19 15:58:19:825

위 결과를 보면, 비슷한 사이즈의 파일을 추가할 경우에 꽤 성능차이가 난다. 느낌에는 비슷한 성능을 낼 것으로 생각이 드는데, 스트링 처리는 Reader/Writer 시리즈가 더 적합하다는 것인가? 혹시 아래의 구조 때문에 그럴까요? 아시는 분은 조언을..

BufferedWriter BufferedOutputStream
java.lang.Object
– java.io.Writer
– java.io.BufferedWriter
java.lang.Object
– java.io.OutputStream
– java.io.FilterOutputStream
– java.io.BufferedOutputStream

File에 내용 추가하기..

간단하게 아래의 코드로 File에 내용을 추가한다.

		try {
			// ask user for file name to write to
			FileWriter out = new FileWriter("out.txt", true);
			BufferedWriter writer = new BufferedWriter(out, 64); // buffersize를 줘서 성능을 높이자..
			writer.write("fooooooooooooooooooooooo~~");
			writer.newLine();
			writer.flush();
			writer.close();
		} catch (IOException e) {
			e.printStackTrace();
		}

위의 FileWriter out = new FileWriter(“out.txt”, true); 에서 out.txt 파일이 없는 경우에 파일은 생성한다. FileWriter 생성자에서 true 인자를 사용해서 파일에 추가하고, BufferedWriter는 buffersize를 설정해서 성능을 높일 수 있다. ^^