백준 문제를 푸는데 Scanner로 입력을 하니 시간초과라 떠서 찾아보니 BufferReader 와 BufferWriter을 사욜하면 된다고 하더라.
그럼 BufferReader 와 BufferWrite가 뭔지 알아보자.
BufferReader 와 BufferWriter
BufferReader 와 BufferWrite 는 이름처럼 버퍼를 이용해서 읽고 쓰는 함수이다.
이 함수는 버퍼를 이용하기 때문에 이용하면 입출력의 효율이 비교할수 없을 정도로 좋아진다.
한 번 거쳐가는데 왜 더 빠른가??
하드디스크 속도는 원래 매우 느리다. 하드 뿐 아니라 키보드나 모니터와 같은 외부장치와의 데이터 입출력은 생각보다 시간이 걸리는 작업이다. 버퍼링 없이 키보드가 눌릴 때마다 눌린 문자의 정보를 목적지로 바로 이동시키는 것보다 중간에 메모리 버퍼를 둬서 데이터를 한데 묶어서 이동시키는 것이 보다 효율적이고 빠르다.
그냥 전송하게 되면 CPU와 성능 갭이 많이 나서 비효율적이다.
즉, 모아뒀다가 한 번에 전송하는게 훨씬 효율적이다.
**BufferedReader
:Scanner와 유사.
Bufferedwriter
:System.out.println();과 유사
사용법
이 둘을 사용하려면 다음의 import가 추가적으로 필요하다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
BufferReader 사용
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); //선언
String s = bf.readLine(); //String
int i = Integer.parseInt(bf.readLine()); //Int
선언하는 방법이다.
입력은 readLine();이라는 메서드를 활용하는데, 여기서 반드시 주의해야할 점이 2가지가 있다.
첫번째는 readLine()시 리턴값을 String으로 고정되기에 String이 아닌 다른타입으로 입력을 받으려면 형변환을 꼭 해줘야 한다.
두번째는 예외처리를 꼭 해줘야 한다는 것이다. readLine을 할때마다 try&catch 를 활용하여 예외처리를 해줘도 되지만
보통 throws IOException을 통하여 작업한다.
throws 이용 시
- 클래스를 import 해줘야 한다.
import java.io.IOException;
- main 클래스 옆에 throws IOException를 작성한다.
public static void main(STring[] args) thorws IOException{}
tringTokenizer st = new StringTokenizer(s); //StringTokenizer인자값에 입력 문자열 넣음
int a = Integer.parseInt(st.nextToken()); //첫번째 호출
int b = Integer.parseInt(st.nextToken()); //두번째 호출
String array[] = s.split(" "); //공백마다 데이터 끊어서 배열에 넣음
Read한 데이터는 Line단위로만 나눠지기에 공백단위로 데이터를 가공하려면 따로 작업을 해줘야 하는데 위의 두가지 방법이 대표적이다.
첫번째는 StringTokenizer에 nextToken()함수를 쓰면 readLine()을 통해 입력받은 값을 공백 단위로 구분하여 순서대로 호출할 수 있다.
두번째 방법은 String.split()함수를 활용하여 배열에 공백단위로 끊어서 데이터를 넣고 사용하는 방식이다.
BufferWriter 사용
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); //할당된 버퍼에 값 넣어주기
String s = "abcdefg"; //출력할 문자열
bw.write(s+"\n"); //버퍼에 있는 값 전부 출력
bw.flush(); //남아있는 데이터를 모두 출력시킴
bw.close(); //스트림을 닫음
BufferWriter 의 경우 버퍼를 잡아 놓았기 때문에 반드시 flush()/close() 를 반드시 호출해 주어 뒤처리를 해줘야 한다.
그리고 bw.write에는 System.out.println();과 같이 자동개행기능이 없기때문에 개행을 해주어야 할 경우에는 \n을 통해 따로 처리해줘야 한다.
'Java' 카테고리의 다른 글
[자바] ArrayList 란? (0) | 2022.09.29 |
---|---|
[자바] 접근 제어자 (0) | 2022.09.28 |
[자바] 향상된 for문 (0) | 2022.09.26 |
[자바] 배열(array) (0) | 2022.09.26 |
[자바] hasNext() 와 next() 메서드의 차이는??? (1) | 2022.09.26 |