코딩테스트/Java 문법 정리

[JAVA] "BufferedReader" VS "Scanner"

SK_MOUSE 2021. 5. 3. 17:16
반응형

BufferedReader와 Scanner 입력시간 비교

더보기

 숫자 100만개 입력을 받는 시간 측정

Scanner 시간측정 코드

import java.util.Scanner;
public class Main{
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int t;
		sc.nextLine();
		long st1 = System.currentTimeMillis();
		for(int i=0;i<1000000;i++){
			t = sc.nextInt();
		}
		System.out.println("소요시간 "+(System.currentTimeMillis() - st1)+"ms");
		sc.close();
	}
}

BufferedReader 시간측정 코드

import java.io.BufferedReader;
import java.io.InputStreamReader; //이 2개 import필수(java.io.*; 로 전부 받을수도 있다.)

public class Main {
    public static void main(String []args) throws Exception { //예외처리 필수
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        String s = br.readLine(); //입력받을값이 String일때
        int a = br.read(); //입력받을값이 int일때
        int b = Integer.parseInt(br.readLine()); //int값+엔터 까지 입력받을때
    }
}

 

위처럼 하여 입력받는 시간을 측정하면,

  Scanner BufferedReader
소요시간 2.5초 0.4초

 

Scanner VS BufferedReader

Scanner를 통해 입력을 받을경우 Space Enter를 모두 경계로 인식하기에 입력받은 데이터를 가공하기 매우 편리합니다. 

 

하지만 그에비해 BufferedReader는 Enter만 경계로 인식하고 받은 데이터가 String으로 고정되기때문에 입력받은 데이터를 가공하는 작업이 필요할경우가 많습니다.

 

https://jhnyang.tistory.com/92

 


입력 : BufferedReader

<Buffer을 이용한 입력값 받는 순서>

 

1. BufferedReader 한줄씩 받기

BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); //선언
String s = bf.readLine(); //String
int i = Integer.parseInt(bf.readLine()); //Int

버퍼는 한줄씩 받아내야한다.

 

 

2. Read한것을 가공 : 읽은 한줄을 자르기 ex)space 구분

StringTokenizer st = new StringTokenizer(s); //StringTokenizer인자값에 입력 문자열 넣음
int a = Integer.parseInt(st.nextToken()); //첫번째 호출
int b = Integer.parseInt(st.nextToken()); //두번째 호출

String array[] = s.split(" "); //공백마다 데이터 끊어서 배열에 넣음

두가지 방법

- StringTokenizer에 nextToken()함수를 쓰면 readLine()을 통해 입력받은 값을 공백단위로 구분하여 순서대로 호출할 수 있습니다. 

- String.split()함수를 활용하여 배열에 공백단위로 끊어서 데이터를 넣고 사용하는 방식입니다.

 

 


출력 : BufferedWriter

 BufferedWriter 

일반적으로 출력을할때 System.out.println(""); 방식을 사용하고는 합니다. 적은양의 출력일 경우 성능차이가 미미하겠지만 많은 양의 출력에서는 입력과 마찬가지로 Buffer를 활용해주시는것이 좋습니다.

 

BufferedWriter 사용법

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));//선언
String s = "abcdefg";//출력할 문자열
bw.write(s);//출력
bw.newLine(); //줄바꿈
bw.flush();//남아있는 데이터를 모두 출력시킴
bw.close();//스트림을 닫음

BufferedWriter 의 경우 버퍼를 잡아 놓았기 때문에 반드시 flush() / close() 를 반드시 호출해 주어 뒤처리를 해주어야합니다. 그리고 bw.write에는 System.out.println();과 같이 자동개행기능이 없기때문에 개행을 해주어야할 경우에는 \n를 통해 따로 처리해주어야합니다.

 

주요 Method

메서드명 

 기능

 BufferedReader(Reader rd)

 rd에 연결되는 문자입력 버퍼스트림 생성

 BufferedWriter(Writer wt) 

 wt에 연결되는 문자출력 버퍼스트림 생성​

 int read()

 스트림으로부터 한 문자를 읽어서 int 형으로 리턴

 int read(char[] buf)

 문자배열 buf의 크기만큼 문자를 읽어들임.  읽어들인 문자 수를 리턴

 int read(char[] buf, int offset, int length)

 buf의 offset위치에서부터 length 길이만큼 문자를 스트림으로부터 읽어들임​

 String readLine()

 스트림으로부터 한 줄을 읽어 문자열로 리턴​​

 void mark() 

 현재우치를 마킹, 차 후 reset() 을 이용하여 마킹위치부터 시작함

 void reset() 

 마킹이 있으면 그 위치에서부터 다시시각, 그렇지 않으면 처음부터 다시시작

 long skip(int n)

 n 개의 문자를 건너 뜀

 void close()

 스트림 닫음

 void write(int c)

 int 형으로 문자 데이터를 출력문자스트림으로 출력

 void write(String s, int offset, int length)

 문자열 s를 offset 위치부터 length 길이만큼을 출력스트림으로 출력

 void write(char[] buf, int offset, int length)

 문자배열 buf의 offset 위치부터 length 길이만큼을 출력스트림으로 출력​​​

 void newLine()

 줄바꿈 문자열 출력

 void flush() 

 남아있는 데이터를 모두 출력시킴.

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

반응형