Scanner와 BufferedReader
둘 다 사용자(키보드)로부터 입력을 받을 수 있는 기능을 제공.
내장된 함수들도 차이가 있지만 가장 큰 차이점은 속도이다.
import java.util.Scanner;
public class Input {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Input {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine();
}
}
평균적으로
BufferedReader의 속도: 0.6585
Scanner의 속도: 4.8448
Scanner는 1KB 크기의 버퍼를 갖고, BufferedReader 8KB 크기의 버퍼를 갖기 때문에 속도에서 차이가 발생한다.
기능적 차이점
Scanner: int, short, long, float, double, String 구분하여 읽음
BufferedReader: String
Scanner: Space, Enter 모두 경계로 입력값을 인식
BufferedReader: Enter만을 경계로 입력값을 인식
//선언
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
//파일에서 입력받을 경우에는 new BufferedReader(new FileReader("ex.java"));
//라인단위로 입력받기(Enter를 경계로)
String str = bf.readLine();
//정수형 입력이라면, 형변환 필수!
int i = Integer.parseInt(bf.readLine());
//Space를 경계로 끊어야 할 때
String arr[] = str.split(" ");
//또는 StringTokenizer 클래스 이용)
출력 및 예외처리
출력에 관해서도 System.out.println("")을 사용하지만, 출력이 많아졌을 때를 고려해서 BufferWriter을 쓰는 것이 좋다.
BufferedWriter bw = new BufferedWriter(new
OutputStreamWriter(System.out)); // 선언
String s = "abcdefg"; // 출력할 문자열
bw.write(s+"\n");// 출력
bw.flush(); // 남아있는 데이터를 모두 출력시킴
bw.close(); // 스트림을 닫음
Scanner는 System.in을 생성시 내부에서 try-catch를 사용하여 예외처리를 함
BufferedReader는 throws IOException을 통해 예외처리를 해줘야 함
StringTokenizer
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class scratchPad {
public static void main(String []args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
StringTokenizer st = new StringTokenizer(s); //StringTokenizer 인자값에 입력 문자열 넣음
int a = Integer.parseInt(st.nextToken()); // 첫번째 호출
int b = Integer.parseInt(st.nextToken()); // 두번째 호출
System.out.println(a);
System.out.println(b);
}
}
BufferedReader의 데이터는 Line단위로 나누어 지므로, 공백을 기준으로 나누려면 StringTokenizer을 사용해야 한다.