ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] BufferedWriter , BufferedReader
    JAVA 2012. 2. 9. 16:46
    헤드퍼스트 자바에선 버퍼를 마트에서 쓰는 카트에 비교한다.
    카트없이 장을 보면 손에들고 왔다갔다 해야하는 불편함이 있는데,
    BufferedWriter, BufferedReader 를 사용하면 쓰거나 읽을때 임시저장공간을 활용할 수 있어 편리하다.

    아래와 같이 리스트에 있는 항목들을 구분자를 추가하여 파일에 바로 쓰고자할때 아래와 같이 하면된다.
       BufferedWriter writer = new BufferedWriter(new FileWriter(file));
       
       for(QuizCard card:cardList){ // 리스트에 있는 항목들을 하나씩 읽어
        writer.write(card.getQuestion() + "/"); // 구분자 추가하여 버퍼를 통해 파일에 쓴다.
        writer.write(card.getAnswer() + "\n");
       }
       writer.close();

    궁금한 것이 하나 있는데.. 위와 같이 하면 파일 I/O가 자주 일어나서 느려지지 않을까 우려된다.
    버퍼에 다 담고 나서 파일에 한꺼번에 쓰면 좋을텐데;;

    말이 나온김에 찾아보내 BufferedWriter에 append와 flush를 이용하니 원하는대로 버퍼에 쌓아 두었다가 한번에 파일에 쓸수 있었다. (역시 구하면 얻게 되는군..ㅎㅎ)
       BufferedWriter writer = new BufferedWriter(new FileWriter(file));
       
       for(QuizCard card:cardList){
        writer.append(card.getQuestion() + "/");
        writer.append(card.getAnswer() + "\n");
       }
       writer.flush();  // 버퍼가 차지 않아도 그냥 디스크에 써버려!
       writer.close();

    아... 위 두 방법 모두 파일i/o는 최소한으로 일어나는구나...(아래 헤드퍼스트 내용 참고..)
    버퍼의 가장 큰 장점은 버퍼를 쓰지 않을 때에 훨씬 더 효율적이라는 것입니다. FileWriter만 가지고도 write(soneString) 같은 식으로 메소드를 호출하여 파일에 대해 쓰기 작업을 할 수 있지만 매번 문자열을 전달할 때마다 파일에 대해 쓰기 작업을 해야 합니다. 하지만 그런 과부하를 원하는 프로그래머는 별로 없을 것입니다. 메모리 내에서의 데이터 조작에 비하면 디스크에 기록하는 작업은 엄청나게 느리기 때문이죠. FileWriter에 BufferedWriter를 연쇄시키면 BufferedWriter의 버퍼가 꽉 찰 때까지 기다리게 됩니다. 따라서 버퍼가 꽉 찬 후에만 FileWriter에서 디스크에 있는 파일로의 쓰기 작업이 진행됩니다.
    오호... 안심하고 그냥 쓰면됨...알아서 버퍼를 사용하여 디스크 쓰기 횟수를 최소한으로 해줌..

    여튼 이렇게 버퍼를 통해 쓴 내용을 읽을 땐 아래와 같이 한다. 쓸때와 달리 한번에 버퍼에 담아와 while문으로 한줄씩 읽어와 잦은 파일 i/o 문제는 없겠다.
       BufferedReader reader = new BufferedReader(new FileReader(file)); // 파일내용을 버퍼리더 reader로 몽창 읽어옴
       String line = null;
       while((line = reader.readLine()) != null) { // reader로 몽창 읽어온내용을 개행을 구분자로 makeCard()호출
        makeCard(line);
       }
       reader.close();


    끝.
Designed by Tistory.