본문 바로가기
카테고리 없음

자바 입출력 정리 InputStreamReader BufferReader PrintWriter

by 위시우 2024. 1. 18.

기존에 알고 있었던 입출력 방식으로는 메모리 초과가 나서, 새로운 입출력 방식을 배우게 되었다.
Scanner 와 BufferReader 의 차이는 무엇인가?

먼저, BufferReader 란 버퍼를 사용하여 입력을 하는 객체이다.
버퍼를 사용하지 않는 입력은, 키보드의 입력이 키를 누르는 즉시 바로 프로그램에 전달된다.
반면 버퍼를 사용하는 입력은, 키보드의 입력이 있을 때마다 한 문자씩 버퍼로 전송한다. 버퍼가 가득 차거나 혹은 개행 문자가 나타나면 버퍼의 내용을 한 번에 프로그램에 전달한다.

키보드로 데이터를 입력 받을때마다, 데이터 입출력, 그리고 하드디스크에 쓰기 작업에 모두 시간이 소요되기 때문에 데이터 량이 많을 경우 시간 소요가 크다. 그래서 반드시 buffer 를 거쳐서 작업을 하게 된다.

Scanner 입력 받기

import java.util.Scanner;

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

        System.out.println("문자열을 입력하세요: ");
        String inputString = scanner.nextLine(); // 사용자로부터 한 줄의 문자열을 읽음
        System.out.println("입력된 문자열: " + inputString);

        System.out.println("정수를 입력하세요: ");
        int inputInt = scanner.nextInt(); // 사용자로부터 정수를 읽음
        System.out.println("입력된 정수: " + inputInt);

        scanner.close(); // Scanner 객체를 닫음
    }
}

그렇다면 우리가 가장 처음 배우는 입출력 객체인 Scanner 는 buffer를 사용하지 않는가?
그렇지 않다. 다만, buffer size 1024 로 작을 뿐이다.
다양한 method 를 제공해서, nextLine -> String , nextInt -> int 바로 전환이 되어 사용하기는 편리하지만, buffer size 가 작아서 데이터량이 많아질 경우, 속도가 나지 않는다.

BufferReader 입력 받기


import java.util.Objects;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.PrintWriter;

public class Main {
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 선언
        String s = br.readLine();
        int i = Integer.parseInt(br.readLine());
        }
    br.close();
    pw.flush();
    pw.close();
}
  • 입력 : readLine(); 으로 사용한다.
  • 여러 type 으로 받을 수 있는 Scanner 와 다르게 String으로 리턴 값이 고정되어 있기 때문에, 다른 타입으로 입력을 받고자 한다면 반드시 형변환이 필요하다.
  • Integer.parseInt를 통해 String -> int 로 형변환을 해준다.

공백을 기준으로 데이터를 나누어 받기

readline()은 개행을 기준으로 데이터를 나누어 받는다.
python에는 input().split() 이라는 함수가 있어서 입력 값을 공백 / 구분자를 기준으로 나누어 받을 수 있다.
Java 에는 이때 사용하는 것이 StringTokenizer나 String.split() 이다.

// StringTokenizer 
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());

StringTokenizer의 nextToken() 함수를 쓰면 readLine()을 통해 입력 받은 값을 공백 단위로 구분하여 순서대로 호출할 수 있다.
호출 할 값이 없는데 호출 할 경우 error 발생한다.

Python 의 input().split() 과 유사하다.

String.split()

// String.split() 함수
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
String[] strings = str.split(" ");

참고자료 : [Java] 빠른 입출력을 위한 BufferedReader, BufferedWriter, StringTokenizer, StringBuilder

댓글