본문 바로가기
자바웹프로그래밍/JAVA

[JAVA] BufferedReader / BufferedWriter 왜 사용할까? (분석)

by 디찌s 2024. 2. 28.
728x90
반응형

 

 

 

1. BufferedReader / BufferedWriter 란?

 

여러가지 입출력 관련 개발을 할때 아래와 같은 코드를 많이 사용한다.

 

BufferedWriter br = new BufferedWriter(new FileWriter(jsonFIle));

 

익숙한 개발자는 그냥 그러려니 넘어가지만 개발에 익숙하지 않은사람들은

 

너무 복잡해보인다. 왜 클래스안에 또클래스를 넣고 그러지?? 이런생각으로 왜 이렇게 하는지 궁금해할수도있고 그냥 

 

다들 이렇게 쓰니깐 나도 써야지 하고 넘어간다.

 

나 또한 그랬다. 선배개발자들이 써놓은 코드를 그대로 복사+붙여넣기 하면서 개발을 했기에 이유도 모른채 작성했다.

 

그래서 이참에 왜 이것을 써야하는지 그리고 실제로 예제를 통해 실험을해보면서 검증작업도 해볼려고한다.

 

2. BufferedReader / BufferedWriter 사용이유?

이유는 간단하다 입출력을 빠르게 하기위해서!! 그렇다면 왜 빨라지는걸까?

 

국내 블로그에서 대부분 예시로 말하는게 키보드 입출력이다.

 

키보드 입력을 할때 buffer로 모아서 한번에 출력하는것과 한번에 한글자씩 출력하는것은 당연히 모아서 출력하는것이 직관적으로 맞다고 생각든다.  

 

그렇다면 파일은?? 왜 Filewriter만 쓰는것보다 BufferdWriter를 혼합하여 사용하는것이 더 유리할까?

 

그것은 OS때문이다. 

 

??? 무슨말일까?

 

실제적으로 우리가 코드를 작성하고 코드를 실행하면 OS상에서 실행된다. 코드는 결국 OS에 영향을 받으며 코드내에서 저장 및 읽는 명령을 OS에 전달한다 . 그 작업 명령을할때 저장 및 읽는 데이터를 1바이트당 1024번 명하느냐 , 한번 요청할떄 1024바이트를 요청해서 저장 및 읽느냐떄문에 작업속도가 달라지는것이다.

 

그러므로 만약에 실제 OS나 메모리용량,cpu성능등이 낮아질수록 둘의 차이는 별로 나지않을것이다. (예측 확실하지않음 혹시 내 설명이 틀리면 댓글로 훈수좀 부탁드립니다.)

 

아래코드는 실제 FileWriter 와 BufferedWriter를 혼합하여 테스트한 결과이다.

 

public class TestJava {

    
    @Test
    public void test(){
        long beforeTime = System.currentTimeMillis(); // 코드 실행 전에 시간 받아오기
        

        StringBuilder stringBuilder = new StringBuilder();
        for(int i=0;i<200000000;i++){
            stringBuilder.append("a");
        }
        File jsonFIle = new File("TESTDATAREAD2.txt");
        try {
              
            BufferedWriter br = new BufferedWriter(new FileWriter(jsonFIle));
            br.write(stringBuilder.toString());
            br.close();

        } catch (Exception e) {
            // TODO: handle exception
        }

        // 측정하려는 코드...
                
        long afterTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기
        long diffTime = afterTime - beforeTime; // 두 개의 실행 시간
        System.out.println("실행 시간1(ms): " + diffTime); // 세컨드(초 단위 변환)


    }

    @Test
    public void test2(){
        StringBuilder stringBuilder = new StringBuilder();
        for(int i=0;i<200000000;i++){
            stringBuilder.append("a");
        }
         long beforeTime2 = System.currentTimeMillis(); // 코드 실행 전에 시간 받아오기
         
 
         File jsonFIle2 = new File("TESTDATAREAD3.txt");
         try {
               
             FileWriter br = new FileWriter(jsonFIle2);
             br.write(stringBuilder.toString());
            
             br.close();
 
         } catch (Exception e) {
             // TODO: handle exception
         }
 
         // 측정하려는 코드...
                 
         long afterTime2 = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기
         long diffTime2 = afterTime2 - beforeTime2; // 두 개의 실행 시간
         System.out.println("실행 시간2(ms): " + diffTime2); // 세컨드(초 단위 변환)

    }
}

 

 

속도 차이가 난다.

728x90
반응형

댓글