본문 바로가기
Programming/Java

[Java] 자바 빠른 입출력(BufferedReader, BufferedWriter)

by 서현 SEOHYEON 2022. 11. 14.

 

보통 자바를 사용할 때 입력은 Scanner, 출력은 System.out.println()을 많이 사용한다.

이것들은 사용하기 매우 쉽지만, 느리다는 단점이 있다.

코딩테스트 같이 빠른 속도를 요구하는 작업에서는 BufferedReader와 BufferedWriter를 사용하는 것이 좋다.

 

가운데 버퍼를 두고 사용하는게 더 느리지 않나? 라는 생각이 들겠지만

키보드를 누를 때 마다 프로그램으로 전송되는 거 보다

가운데 버퍼에 모아두고 프로그램으로 한 번에 전송하는 것이 더 빠르다.


💚 BufferedReader

Scanner와 달리 개행문자만 경계로 인식, 데이터가 String으로 고정 → 가공 필요

 

- 사용법

import java.io.BufferedReader;
import java.io.InputStreamReader;

 

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine(); // String으로 받아야함
int i = Integer.parseInt(br.readLine()); // 다른 데이터타입으로 원할시 가공

예외처리 필수. try catch문을 사용하거나 throws IOException 처리하기.

 

- 중요 메서드들

반환형 함수명 기능
String readLine() 한 줄 읽기
void close() 입력 스트림 닫기
int read() 한 글자만 읽어 정수로 반환(아스키코드)

 

 

 

💚 StringTokenizer

BufferedReader(개행문자로 구분)를 통해 읽어온 데이터(String)을 공백 단위로 가공해야 할 때 사용

 

- 사용법

import java.util.StringTokenizer;

 

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken()); // nextToken을 사용하여 순서대로 호출
int M = Integer.parseInt(st.nextToken());

 

 

 

💚 BufferedWriter

System.out.println()과 달리 개행을 해주지 않아서 newLine() 메서드를 사용해 주거나, write()메서드 안에서 "\n" 사용

반드시 사용후 flush()와 close()사용.

 

- 사용법

import java.io.BufferedWriter;
import java.io.OutputStreamWriter;

 

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String str = "Hello";

bw.write(s);
bw.newLine();
bw.flush(); // 남아있는 데이터 모두 출력
bw.close();

 

- 중요 메서드들

반환형 함수명 기능
void close() 스트림 닫기
void flush() 스트림 비우기. 닫기 전 실행
void newLine() 개행
void write(String s, int offset, int length) offset부터 length만큼 문자열 작성
문자열만 단독으로 넣어줘도 가능
버퍼에 작성한다는 의미.

 


백준 1000번 문제(A + B)를

버퍼 입/출력을 사용했을 때,(위)

Scanner와 System.out.println()을 사용했을 때(아래)

속도 차이

 

- 코드

import java.io.*;
import java.util.StringTokenizer;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        StringTokenizer st = new StringTokenizer(br.readLine());

        int a = Integer.parseInt(st.nextToken());
        int b = Integer.parseInt(st.nextToken());

        bw.write(String.valueOf(a + b));
        // bw.write(a + b + "\n"); // 이것도 정답처리

        br.close();
        bw.flush();
        bw.close();
    }

}

 

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int n1 = sc.nextInt();
        int n2 = sc.nextInt();

        System.out.println(n1 + n2);
    }
}

댓글