-
[JAVA] BufferedReader / BufferedWriter 왜 사용할까? (분석)자바웹프로그래밍/JAVA 2024. 2. 28. 14:59728x90반응형
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반응형'자바웹프로그래밍 > JAVA' 카테고리의 다른 글
jvm 클래스 로더 작동방식 (0) 2024.07.11 java에서의 동시성 이슈 제어방법 (0) 2024.07.10 Reader,Writer(문자 기반 스트림) with java (0) 2024.02.27 InputStream,OutputStream 입출력 방식 분석 with java (0) 2024.02.27 maven을 통한 jar 생성할때 dependency(의존성) library 포함 후 jar 생성방법 (0) 2023.01.09