☝️ 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() | 남아 있는 데이터를 모두 출력시킴 |