3 분 소요

[Java] Java의 입출력 방법

Java의 BufferedReader에 대하여 알아보자.

BufferedReader, BufferedWriter란

버퍼를 사용하여 읽기와 쓰기를 하는 함수.

버퍼를 사용하는 입력은 키보드의 입력이 있을 시 한 문자씩 버퍼로 전송한 뒤, 버퍼가 가득 차거나 개행 문자가 나타나면 버퍼의 내용을 한 번에 프로그램에 전달한다.

속도가 빠르고 버퍼 사이즈가 Scanner보다 크기 때문에 많은 입력을 필요로 할 경우에 사용하면 좋다.

BufferedReader는 개행문자만 경계로 인식하며, 입력받은 데이터는 String 타입이 된다.

BufferedReader와 Scanner 비교

BufferedReader Scanner
- 지원하는 메소드가 비교적 많음
입력받은 문자는 String타입으로 고정됨 int, char, String 등 다양한 타입 입력 가능
입력받은 데이터를 원하는 타입으로 가공하는 작업이 필요할 수 있음 입력받은 데이터를 따로 가공할 필요가 없어 편리함
버퍼 사이즈 8192char 버퍼 사이즈 1024char
개행문자만 경계로 인식함 띄어쓰기와 개행문자를 경계로 인식함
속도가 비교적 빠름 속도가 비교적 느림
동기화가 되므로 멀티쓰레드 환경에서 안전함 동기화가 되지 않으므로 멀티쓰레드 환경에서 안전하지 않음
입력 시 한 문자씩 버퍼로 전송한 뒤, 버퍼가 가득 차거나 개행 문자가 나타나면 버퍼의 내용을 한 번에 프로그램에 전달 입력 시 즉시 그 내용을 프로그램에 전달

BufferedReader 사용법

아래와 같이 선언하여 사용함.

BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 이와 같이 선언하여 사용
// BufferedReader, InputStreamReader라는 두 개의 보조 스트림을 사용하여 입력 개체를 생성해준 것임
String str = br.readLine(); // 입력은 readLine();이라는 메소드 사용. 입력 내용을 str이라는 이름의 변수에 저장
int i = Integer.parseInt(br.readLine()); // 입력받은 내용을 int 타입으로 변환하고 싶을 때
br.close(); // 입력 스트림 닫기

이처럼, String 타입이 아닌 다른 타입으로 입력 내용을 저장하려면 반드시 형변환을 해줘야 한다.

또한, 예외처리를 반드시 필요로 한다.

예외처리 방법

1) readLine() 마다 try ~ catch 문으로 감싸주기

2) throws IOException 사용
메인함수에 throws IOException을 추가하여 간단히 사용할 수 있음

데이터 가공 방법

  • 입력받은 데이터를 공백 단위로 나누고자 하는 경우

    1) StringTokenizer 사용

       import java.io.BufferedReader;
       import java.io.InputStreamReader;
       // import java.io.* // 위 두 줄 대신 이렇게 작성해도 된다
         
       BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
       StringTokenizer st1 = new StringTokenizer(br.readLine()); // StringTokenizer 생성자에 입력받을 문자를 넣은 후
       int n = Integer.parseInt(st.nextToken()); // nextToken() 메소드로 문자를 하나씩 가져와 사용할 수 있음
       int m = Integer.parseInt(st.nextToken());
       // 이처럼 StringTokenizer 생성자에 인자를 하나(입력받을 문자) 넣어주면 입력받은 데이터를 공백을 단위로 구분하여 순서대로 호출 가능
       StringTokenizer st2 = new StringTokenizer(br.readLine(), "자를문자");
       // 이처럼 StringTokenizer 생성자의 두 번째 인자로 자를 문자를 추가로 넣어주면 해당 문자를 기준으로 입력 내용을 자를 수 있음
    

    2) String.split() 메소드 사용

       String arr[] = s.split(" ");
       // 입력받은 데이털르 공백 단위로 끊어 배열에 저장
       // split() 메소드의 인자로 특정 문자를 입력하면 해당 문자를 기준으로 입력 내용을 자를 수 있음
    

BufferedReader의 주요 메소드

  • read() : 한 글자만 읽어 정수형으로 반환함. 반환값 타입은 int.
  • readLine() : 입력 내용 한 줄을 읽음. 반환값 타입은 String.
  • ready() : 입력 스트림이 사용할 준비가 되었는지 확인하는 메소드. 반환값 타입은 boolean이며, 반환값이 1일 경우 사용 준비 완료되었다는 뜻.
  • mark(int, readAheadLimit) : 스트림의 현재 위치를 마킹함. 반환값은 없음(void).
  • close() : 입력 스트림을 닫고 사용이 끝난 자원을 반환. 반환값은 없음(void).

BufferedWriter

일반적으로 출력 시 System.out.println() 을 사용하는데,

출력해야 하는 데이터의 양이 많을 경우, 버퍼를 사용하는 BufferedWriter를 사용할 수 있다.

BufferedWriter와 System.out.println() 비교

BufferedWriter System.out.println()
버퍼를 사용함 버퍼를 사용하지 않음
많은 양의 출력 시 효율적인 방법 적은 양의 출력 시 편리하게 사용할 수 있음
개행(줄바꿈)을 하려면 별도로 newLine(); 또는 bw.write(“\n”);을 사용해야 함 출력과 개행(줄바꿈)을 동시에 해줌
사용 후 flush(); 와 close();를 통해 스트림을 비우고 닫아줘야 함 -

BurreredWriter 사용법

아래와 같이 선언하여 사용함.

import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
// import java.io.* // 위 두 줄 대신 이렇게 작성해도 된다

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // 이와 같이 선언
String str = "이 문자열을 출력해보겠습니다"; // 출력할 문자열
bw.write(str); // write() 메소드를 이용하여 출력
bw.newLine(); // newLine() 메소드를 이용하여 줄바꿈
bw.write("\n"); // 이렇게 줄바꿈을 해줄 수도 있음
bw.flush(); // flush() 메소드를 이용하여 남아있는 데이터를 모두 출력
bw.close(); // 출력 스트림 닫기

BufferedWriter의 주요 메소드

  • write(int c) : 한 글자 쓰기. 반환값은 없음(void).
  • write(String s, int offset, int length) : 문자열의 offset부터 일정 길이(length)만큼 쓰기. 반환값은 없음(void).
  • write(char[] buf, int offset, int length) : 버퍼의 offset부터 일정 길이(length)만큼 쓰기. 반환값은 없음(void).
  • newLine() : 줄바꿈(개행문자 역할). 반환값은 없음(void).
  • flush() : 스트림을 비움. 반환값은 없음(void).
  • close() : 출력 스트림을 닫고 사용이 끝난 자원을 반환. 반환값은 없음(void).

이제 상황에 따라 입출력 방법을 달리 해볼 수 있겠다.

댓글남기기