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); // 세컨드(초 단위 변환)
}
}
속도 차이가 난다.
'자바웹프로그래밍 > JAVA' 카테고리의 다른 글
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 |
java reflection 이용해서 private feild 불러오기 (0) | 2022.08.05 |
ImmutableMap이란? (2) | 2020.11.17 |
댓글