[Java]5. BufferedReader와 BufferedWriter

쟈니·2023년 10월 17일
0

JAVA

목록 보기
5/8

DFS와 BFS 알고리즘을 공부하던 중, 많은 사람들이 scanner보다 BufferedReader를 사용하여 입력 처리를 하고 있었다.
메모리 사용과 속도 측면에서 훨씬 좋은 방법인 BufferedReader에 대해 알아 보자!

Buffer

컴퓨터 구조에서 CPU>메모리>하드 디스크 순으로 속도가 빠르다.
속도가 느린 입출력 장치에서 입력 처리를 받을 때마다 데이터를 넘기면 전송하는 데이터는 작고 처리하는 횟수는 많아져 비효율적이다.
이 때, 버퍼두 장치의 속도 차이를 완화해주는 보조 장치이다.
버퍼가 다 찰때까지 데이터를 모아 한 번에 전송하면 효율적으로 데이터를 처리할 수 있다.

Scanner vs BufferedReader

Scanner

Scanner의 입력 처리 방식

기존에 자주 사용하던 입력 방식인 scanner는 버퍼를 사용하지 않은 입력 방식으로 키보드에 키가 입력되자마자 프로그램에 전달된다.
Scanner는 띄어쓰기와 개행문자로 경계 입력 값을 인식한다.
Scanner는 동기화가 되지 않는다. 멀티 쓰레드 환경에서 안전하지 않다.

BufferedReader

Buffer를 사용한 입력 처리 방식

버퍼를 사용하는 입력 방식인 BufferedReader는 키보드 입력이 있을 때 한 문자씩 버퍼로 전송한다. 버퍼가 가득 차거나 혹은 개행 문자가 나타나면 버퍼의 내용을 한 번에 프로그램에 전달한다.
BufferedReader는 개행 문자만 경계로 인식하고 입력받은 데이터가 String으로 고정된다.
BufferedReader는 동기화가 가능하다.

사용 방법

1. 예외 처리와 형 변환하기

import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
    public static void main(String[] args) throws IOException{
    //throws IOException를 통한 예외 처리
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String s = br.readLine();
        int i = Integer.parseInt(br.readLine());
//리턴 타입이 String이기 때문에 다른 타입 사용이 형변환 필요하다.
		}
    }
  • 리턴 타입이 String이기 때문에 다른 타입 사용이 형변환 필요하다.
  • 예외처리를 반드시 필요로 한다. readLine()시 마다 try/catch문으로 감싸거나 throws IOException 을 통한 예외 처리를 해야 한다.

2. 공백 단위 구분하기

	//StringTokenizer
	BufferedReader br = new BufferedReader(new 		InputStreamReader(System.in));
	StringTokenizer st = new StringTokenizer(br.readLine());
	int nodeCnt = Integer.parseInt(st.nextToken());
	int lineCnt = Integer.parseInt(st.nextToken());
    
    // String.split() 함수
    String s = br.readLine();
	String arr[] = s.split(" ");
  • readline()으로 입력 받은 것을 StringTokenizernextToken()를 통해 공백 단위로 구분할 수 있다.
  • String의 split(" ")으로 배열에 공백 단위로 구분하여 저장할 수 있다.

BufferedWriter

사용 방법

import java.io.BufferedReader;
import java.io.IOException;
import java.io.OutputStreamReader;
public class Main {
    public static void main(String[] args) throws IOException{
    //throws IOException를 통한 예외 처리
        BufferedWriter bw = new BufferedWriter(new outputStreamReader(System.out));
		String str = "abcdef"; // 출력할 문자열
		bw.write(str); // 출력
		bw.newLine(); // 줄바꿈
		bw.flush(); // 남아있는 데이터 모두 출력
		bw.close();
		}
    }
  • BufferedWriter는 System.out.println() 처럼 출력과 개행을 동시해 해주지 않는다.
  • newLine() 혹은 bw.write("\n")로 개행 처리를 해야한다.
  • 버퍼를 사용한 후에, flush() 또는 close()를 해주어야 한다.
  • close()는 출력 스트림 종료한다.
  • 여러 줄을 출력은 flush()를 사용하면 된다.

참고

https://rlakuku-program.tistory.com/33

profile
시작은 미미하나 끝은 쥬쥬하다.

0개의 댓글