Super Kawaii Cute Cat Kaoani [Java] BufferedReader, BufferedWriter, StringTokenizer를 통한 빠른 입출력
728x90
SMALL
⚡️ Scanner
평소 Scanner를 통해 입출력을 진행하였는데, 복잡한 알고리즘을 풀면 시간초과가 발생하는 경우가 많았다. 
시간 초과를 해결하기 위해 알아보다가 BufferedReader를 사용한다는 것을 알고 정리해보려한다

 

📌 Buffer

임시 저장 공간이라고 생각할 수 있다.

어떤 데이터가 전송 될 때, 일시적으로 저장되는 메모리 영역이다.

BufferedReader / BufferedWriter는 버퍼를 사용하여 읽기와 쓰기를 진행하는 함수이다.

 

버퍼를 사용하지 않고 입력하면 입력하자마자 바로 프로그램에 전달된다.

버퍼를 사용해서 입력하면 입력할 때마다 한 문자씩 버퍼로 전달한다.

➡️ 버퍼가 가득 차거나 혹은 개행 문자가 나타나면 버퍼의 내용을 한 번에 프로그램에 전달한다.

 

입력받자마자 바로바로 전달하는 것보다는, 버퍼를 통해 한꺼번에 보내는 것이 더 효율적이다.

 

📌 BufferedReader

  • Scanner :  입력을 받으면 바로바로 엔터가 나오자마자 전달된다.
    • 띄어쓰기 개행문자를 경계로 하여 입력 값을 인식하기 때문에 따로 가공할 필요가 없어 편리하다.
    • 버퍼 사이즈가 1024 char이라 성능상 좋지 않다.
    • 동기화가 되지 않기 때문에 멀티 쓰레드 환경에서 안전하지 않다. 
  • BufferedReader : 버퍼를 통해 임시로 저장되어있다가 한꺼번에 전달된다
    • Enter(개행문자)만 경계로 인식하고 입력 받은 데이터가 String으로 고정되기 때문에 데이터를 가공하는 작업이 필요할 경우가 많다.
    • 버퍼 사이즈가 8192 char(16,384byte) 이기 때문에 성능상 좋다
    • 동기화 되기 때문에 멀티 쓰레드 환경에서 안전하다.
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); 
String s = bf.readLine(); //String
int i = Integer.parseInt(bf.readLine()); //Int
  • String으로 리턴 값이 고정되어 있어서 다른 타입으로 입력을 받고싶다면 형변환을 해줘야 한다
  •  readLine을 할때마다 예외처리를 해주는 것이 좋음
    • try & catch를 활용하거나 throws IOException을 통하여 예외처리
    • 주로 throws IOException 사용

 

✅ 데이터 가공

// StringTokenizer 
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());

// String.split() 함수
String arr[] = s.split(" ");

BufferedReader를 통해 읽어온 데이터는 개행문자 단위(Line 단위)로 나누어지기 때문에 공백 단위로 데이터를 가공하고자 하면 따로 작업을 해주어야 함

  • StringTokenizer
    • nextToken()함수를 쓰면 readLine()을 통해 입력받은 값을 공백단위로 구분하여 순서대로 호출할 수 있음
  • String.split() 
    • 배열에 공백단위로 끊어서 데이터를 저장하는 방식

 

📌 BufferedWriter

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // 선언
String str = "abcdef"; // 출력할 문자열
bw.write(s); // 출력
bw.newLine(); // 줄바꿈
bw.flush(); // 남아있는 데이터 모두 출력
bw.close(); //스트림을 닫음
  •  System.out.println("");
    • 적은 양의 출력에서는 편리하고, 그렇게 큰 성능 차이 없이 사용할 수 있음
  • BufferedWriter :
    • 양이 많을 경우 입력과 동일하게 버퍼를 사용하는 것이 좋음
    • 자동개행기능이 없기때문에 개행을 해주어야할 경우에는 newLine(); 혹은 \n을 사용하면 됨
    • 버퍼를 잡아 놓았기 때문에 반드시 사용한 후에, flush()/ close()를 해주어야 함
      • close()를 하게되면, 출력 스트림을 아예 닫아버리기 때문에 한번 출력후, 다른 것도 출력하고자 한다면 flush()를 사용하면 됨

 

 

Reference

 

BufferedReader를 알고 쓰자

Java를 처음 시작하면서 입력을 받을 땐 항상 Scanner를 사용했다

velog.io

 

[Java] 빠른 입출력을 위한 BufferedReader, BufferedWriter, StringTokenizer, StringBuilder

BufferedReader / BufferedWriter BufferedReader와 BufferdWriter는 버퍼를 사용하여 읽기와 쓰기를 하는 함수이다. 버퍼를 사용하지 않는 입력은, 키보드의 입력이 키를 누르는 즉시 바로 프로그램에 전달된다.

rlakuku-program.tistory.com

 

[Java] BufferedReader, BufferedWriter를 활용한 빠른 입출력

BufferedReader/BufferedWriter는 Buffer에 있는 IO 클래스입니다. 입력된 데이터가 바로 전달되지 않고 중간에 버퍼링이 된 후에 전달되됩니다. 출력도 마찬가지로 버퍼를 거쳐서 간접적으로 출력장치로

coding-factory.tistory.com

 

728x90
LIST

'Language > Java' 카테고리의 다른 글

[JAVA] PriorityQueue 란? / 사용법  (0) 2024.05.12
[JAVA] Stack과 Queue  (0) 2024.05.02
[JAVA] Deque 덱 이란?  (0) 2024.05.02
[JAVA] 자바란 ? 자바의 특징  (0) 2024.01.20

BELATED ARTICLES

more