[JAVA] Scanner와 BufferedReader 차이와 BufferedReader, BufferedWriter 사용법 :: 매운코딩
728x90
300x250

 

https://algospot.com/forum/read/2496/

각 언어별 input method의 수행 시간에 대한 자료이다.

언뜻봐도 Scanner는 엄청난 시간이 걸린다는 것을 알 수 있다.

그에 반해 BufferedReader는 굉장히 신속하다.

Java를 처음 접하시는 분들이 주로 받는 입력방식은 Scanner입니다.
Scanner를 통해 입력을 받을경우 Space Enter를 모두 경계로 인식하기에 입력받은 데이터를 가공하기 매우 편리합니다. 하지만 그에비해 BufferedReader는 Enter만 경계로 인식하고 받은 데이터가 String으로 고정되기때문에 입력받은 데이터를 가공하는 작업이 필요할경우가 많습니다. Scanner에 비해 다소 사용하기 불편하죠. 하지만 많은 양의 데이터를 입력받을경우 BufferedReader를 통해 입력받는 것이 효율면에서 훨씬 낫습니다. 입력시 Buffer 메모리줌으로써 작업속도 차이가 많이납니다.

출처 - https://coding-factory.tistory.com/251

 

1. 버퍼스트림(BufferedReader, BufferedWriter)이란?

  • 버퍼스트림(Buffered Stream)이란 기본 입출력스트림에 버퍼기능을 추가하는 스트림을 의미한다. 즉, 입력된 데이터가 바로 프로그램으로 전달되지 않고 중간에 버퍼링이 된 후에 전달된다는 의미이다. 출력도 마찬가지로 버퍼를 거쳐서 간접적으로 출력장치로 전달된다.
  • 중간버퍼를 사용함으로써 시스템의 데이터처리 효율성을 높여준다.
  • 버퍼스트림은 이미 생성된 바이트스트림이나 문자스트림에 연결하여 사용한다.
  • 기본스트림에 비해서 프로그래밍에서는 줄단위 문자열(String) 처리가 가능하다는 편리함이 있다.​

    [출처] Java 문자 버퍼스트림(BufferedReader, BufferedWriter) |작성자 떠돌이돌

 

 

2. BufferedReader 사용법

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class SbTest {

	public static void main(String[] args) throws IOException {

		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		sb.append(br.readLine());
		
		//기본으로 들어오는 형태는 String 이므로 형변환을 원하면 따로 처리 해야함.
		int a = Integer.parseInt(br.readLine());

	}

}

import는 java.io.* 로 해주면 된다.

throws IOException 또는 Try Catch를 해줘야 에러가 나지 않는다.

 

br.readLine()은 Line단위(Enter단위)로만 끊어져서 나와서 한 line 안의 공백이나 이런걸 구분해서 받고자하면 데이터 가공처리가 필요하다. 가공은 StringTokenizer를 이용한다.

StringTokenizer를 생성하고, nextToken() 함수를 이용하면 공백단위로 데이터를 가져올 수 있다.

package algorithm;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class SbTest {

	public static void main(String[] args) throws IOException {

		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		sb.append(br.readLine());
		//ex. 1 2 3 4 5 가  한줄로 입력되는경우 숫자 하나씩 쪼개기 위한 방법
		StringTokenizer st = new StringTokenizer(sb.toString());
		int n1 = Integer.parseInt(st.nextToken());
		int n2 = Integer.parseInt(st.nextToken());
		int n3 = Integer.parseInt(st.nextToken());
		

	}

}

 

3. BufferedWriter 사용법

출력시에 System.out.println()을 많이 사용하는데, 많이 출력할 때는 BufferedWriter를 사용하면 성능이 더 좋다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class SbTest {

	public static void main(String[] args) throws IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		sb.append(br.readLine());
		//ex. 1 2 3 4 5 가  한줄로 입력되는경우 숫자 하나씩 쪼개기 위한 방법
		StringTokenizer st = new StringTokenizer(sb.toString());
		int n1 = Integer.parseInt(st.nextToken());
		int n2 = Integer.parseInt(st.nextToken());
		
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		bw.write(n1+"\n");
		bw.flush();
		bw.close();

	}

}

bw.write() : 출력 , 출력 작성

bw.flush() : 남아있는 데이터를 모두 출력시킴

bw.close() : 스트림을 닫음

이 3개를 모두 해줘야 출력이 된다.

728x90

+ Recent posts