☝️ Java에는 외부(클라이언트)에게서 값을 입력받을 수 있는 대표적인 방법이 두가지가 있다. 첫번째는 Scanner, 두번째는 BufferedReader! Scanner 방식도 최근에서야 백준 알고리즘 문제를 풀면서 익숙해지고 있는 참이었는데
15552번a문제가 BufferedReader 방식을 사용하라기에 어쩔 수 없이 학습해보려고 한다.
: java.util 패키지 내에 포함된 클래스
💡 토큰(Token)
공백 문자(스페이스바, 엔터, 탭 등)으로 구분되는 요소
그러나 String값을 입력할 때에는 사용되는 메서드가next()와nextLine()의 따라서 입력값의 경계가 달라질 수 있다.
X()주로 nextX()의 형태를 이루며 X의 자리에는 입력 받을 데이터의 타입을 적어준다.
💡String 타입의 데이터를 입력받는 메서드
String을 입력 받는 메서드는nextString()이 아닌next()와nextLine()이다. 이 둘의 차이는 다음과 같다.
next() : 띄어쓰기를 입력할 경우, 띄어쓰기 뒷 부분은 다음 입력 메서드에 저장된다.
netxLine() : 띄어쓰기를 포함하는 한줄을 의미하며Enter입력 시 종료된다.
X()nextX()메서드와 마찬가지로 X의 자리에 데이터의 타입을 작성한다. 해당 메서드는 boolean값을 반환하며 Scanner를 통해 입력 받은 값(X와 같은 타입)이 있으면 true를 반환한다.
X(A)A에 포함된 내용을 입력 받은 값에서 찾아 일치하는 패턴을 반환시켜준다. 일치하지 않으면 null이 반환된다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
long a = s.nextLong();
int b = s.nextInt();
String str = s.nextLine();
String str2 = s.next();
}
}
: InputStreamReader에 버퍼링 기능이 추가된 클래스
☝️ InputStreamReader
문자열을 입력받았을 때, Character단위로 읽는다. -> 비효율적! 보완하고자 나온 것이 BufferedReader
Enter만으로 경계를 인식한다. try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// String
String s = br.readLine();
// int
int num = Integer.parseInt(br.readLine());
// 공백 구분 방법 1
StringTokenizer st = new StringTokenizer(s); // StringTokenizer 인자 값에 입력 문자열이 들어감
int a = Integer.parseInt(st.nextToken()); // 첫번째 호출
int b = Integer.parseInt(st.nextToken()); // 두번째 호출
// 공백 구분 방법 2
String array [] = s.split(" "); // 공백마다 데이터 끊어서 배열에 넣음
br.close(); // 입출력이 끝난 후 닫기
} catch (IOException e) { // 예외처리 필수
e.printStackTrace();
System.out.println(e.getMessage());
}
flush()와 close()를 호출해 종료해줘야 한다. BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); //선언
String s = "abcdefg"; //출력할 문자열
bw.write(s); //출력
bw.newLine(); //줄바꿈
bw.flush(); //남아있는 데이터를 모두 출력시킴
bw.close(); //스트림을 닫음
| 메서드 | 설명 |
|---|---|
| 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() | 남아 있는 데이터를 모두 출력시킴 |
