1. 메모장 파일의 내용을 엔터 단위로 가져오기(BufferedReader)
이전 게시글에서는 메모장 파일의 내용을 모두 가져오는 작업을 하였다.
이번에는 메모장 파일의 내용을 엔터 단위로 가져오는 작업을 해보려 한다.
이 때 사용하는 것이 BufferedReader이다.
여기서 버퍼란 우리가 흔히 쓰는 버퍼링의 그 버퍼가 맞다.
여기서 잠시 버퍼에 대해 이해를 살짝 하고 가보자.
키보드는 입력할 때마다 프로그램에 입력이 되기 마련이다.
하지만 버퍼를 사용해서 입력을 할 때는 버퍼가 가득 차거나 특정한 개행 문자가 나타나면 버퍼의 내용을 한번에 전송시키는 방식을 취한다.
어찌 보면 키보드로 프로그램에 다이렉트로 입력하는 것이 더 빠를 것 같지만 버퍼 방식이 훨씬 더 빠르다.
그 이유로는 원래 데이터 입출력은 시간이 많이 소요되는 작업이다. 그래서 키보드가 눌릴 때마다 눌린 문자의 정보를 목적지로 바로 이동시키는 것보다 중간에 메모리 버퍼를 둬서 데이터를 한데 묶어 옮기는 것이 보다 효율적이고 빠른 것이다.
흙들을 저 언덕에 버려야 하는데 한 번 삽질해서 왔다 갔다 하는 것보다 수레에 여러번 삽질 해서 흙을 한번에 옮기는 게 더 빠른 것과 같은 이치이다.
이런 이해를 바탕으로 BufferedReader는 엔터를 경계로 데이터를 인식하며, String 형태로 고정하여 데이터를 받는다.
그래서 데이터를 따로 가공해야할 경우가 많지만 속도가 굉장히 빠르다는 장점이 있다.
이제 전체 코드를 살펴보면서 사용하는 방법을 알아가보자.
2. BufferedReader 코드로 알아보기
package oop0920;
import java.io.BufferedReader;
import java.io.FileReader;
public class Test03_input {
public static void main(String[] args) {
// 3) 메모장 파일의 내용을 엔터 단위로 가져오기
String filename="C:\\java202207\\workspace\\basic01_java\\src\\oop0919\\Order.java";
FileReader fr = null;
BufferedReader br = null;
try {
// 1) 파일 가져오기
fr = new FileReader(filename);
// 2) 파일 내용 읽기
br = new BufferedReader(fr);
while(true) {
String line = br.readLine(); // 3) 엔터(\n)를 기준으로 한 줄씩 가져오기
if(line==null){ // 파일의 끝(End Of File)인지?
break;
} // if end
System.out.printf("%s\n", line);
} // while end
} catch (Exception e) {
System.out.println("파일 읽기 실패 : " + e);
} finally {
try {
if(br!=null) { br.close(); }
} catch (Exception e) { }
try {
if(fr!=null) { fr.close(); }
} catch (Exception e) { }
} // end
} // main() end
} // class end
이전 게시글에서 해보았던 FileInputStream이나 FileReader와 코드가 비슷하지만 조금 다른 부분이 있다.
우선 파일을 FileReader 클래스로 가져온 뒤 BufferedReader 클래스로 한번 더 내용을 읽어준다.
(BufferReader 클래스는 Reader 클래스의 하위 클래스이다)
그리고 이후 BufferReader 클래스로 만든 br 인스턴스로 반복문 작업을 해준다.
이 때는 String 값으로 받기 때문에 String형인 line 변수에 내용을 담아준 뒤 ReadLine() 메서드를 활용하여 엔터(\n)를 기준으로 한 줄씩 가져온다.
FileReader 에서는 바이트 형태였기에 파일의 끝(EOF)이 -1 값일 때였지만 지금은 스트링 형태이기 때문에 null 값을 입력해준다.
출력하면 정상적으로 출력이 된다.
여기서 출력을 할 때는 엔터를 기준으로 출력이 되기때문에 다시 엔터를 생성하여 보기 좋게 만들어줬다.
* 자원반납 할 때 순서 꼭 잘 지키기!!!
예외처리를 하면서 자원 반납을 할 때 반드시 먼저 수행되었던(하위에 있는) BufferReader부터 닫아주는 것도 명심하자.
'⁂ Java > : 기본 익히기' 카테고리의 다른 글
[JAVA] #10-3 입출력스트림 : 출력(Output) (0) | 2022.09.20 |
---|---|
[JAVA] #10-1 입출력스트림 : 입력(Input) - byte형과 char형 (0) | 2022.09.20 |
[JAVA] #9-6 File 클래스 (0) | 2022.09.19 |
[JAVA] #9-5 스레드(Thread) (0) | 2022.09.19 |
[JAVA] #9-4 제네릭(Generic) 이해하기 2 - 제네릭 (0) | 2022.09.16 |