ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] BufferedReader / BufferedWriter 왜 사용할까? (분석)
    자바웹프로그래밍/JAVA 2024. 2. 28. 14:59
    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
    반응형
Designed by Tistory.