[Java] 입출력

2024. 1. 21. 15:25Algorithm/with Java

1. 입력

 

 

입력 속도 비교

여러가지 언어와 입력 방법을 이용해서 시간이 얼마나 걸리는지 비교해 보았습니다. 방법: 첫째 줄에 정수의 개수 N (= 10,000,000), 둘째 줄부터 N개의 줄에 한 개의 자연수(10,000 이하)가 적힌 파일

www.acmicpc.net

 

가. Scanner

import java.util.Scanner;

public class Test1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        String[] foods = new String[num];
        for(int i=0; i<num; i++){
            foods[i] = sc.next();
        }
        for(String food : foods){
            System.out.println(food);
        }
        sc.close();
    }
}

가장 쉽고 간편한 방법.

 

하지만 느리다.

 


나. BufferedReader

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;

public class Test2 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int num = Integer.parseInt(st.nextToken());
        String[] foods = new String[num];

        for(int i=0; i<num; i++){
            st = new StringTokenizer(br.readLine());
            foods[i] = st.nextToken();
        }

        for(String food : foods){
            System.out.println(food);
        }
        br.close();
    }
}
  • BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    : 데이터를 버퍼에 저장해 두었다가 전달.
    : 입력받는 데이터의 수가 커질 수 록 속도면에서 빠르고 효율적.
  • new InputStreamReader(System.in)
    : 입력을 바이트 단위로 읽어서 문자 단위로 반환하는 클래스
  • import java.io.IOException;, throws IOException
    : BufferedReader에서 던지는 에러가 있기 때문에 필요함.
  • st = new StringTokenizer(br.readLine());
    : 줄이 바뀔 때마다 새로운 StringTokenizer 생성해야함.
  • st.nextToken();
    : 다음 문자열 토큰 반환.
  • int num = Integer.parseInt(st.nextToken());
    : 정수를 입력받는 방법.

 


1) StringTokenizer

 

 

StringTokenizer (Java Platform SE 8 )

Constructs a string tokenizer for the specified string. All characters in the delim argument are the delimiters for separating tokens. If the returnDelims flag is true, then the delimiter characters are also returned as tokens. Each delimiter is returned a

docs.oracle.com

 

  • 생성자

  • 메서드

 


2. 출력

 

 

출력 속도 비교

여러가지 언어와 출력 방법을 이용해서 시간이 얼마나 걸리는지 비교해 보았습니다. 방법: 총 N개의 줄에 1부터 10,000,000까지의 자연수를 한 줄에 하나씩 출력하는 시간을 측정. 10번 측정해서 평

www.acmicpc.net

 

가. System.out.println()

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;

public class Test2 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int num = Integer.parseInt(st.nextToken());
        String[] foods = new String[num];

        for(int i=0; i<num; i++){
            st = new StringTokenizer(br.readLine());
            foods[i] = st.nextToken();
        }

        for(String food : foods){
            System.out.println(food);
        }
        br.close();
    }
}

출력할 데이터가 많으면 System.out.println가 시간을 많이 사용한다.

 


나. BufferedWriter

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;

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

public class Test2 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));        

        int num = Integer.parseInt(st.nextToken());
        String[] foods = new String[num];

        for(int i=0; i<num; i++){
            st = new StringTokenizer(br.readLine());
            foods[i] = st.nextToken();
        }

        for(String food : foods){
            bw.write(food);
            bw.newLine();
        }
        br.close();
        br.flush();
        br.close();
    }
}
  • BufferedWriter : 버퍼를 사용하여 쓰기.
  • OutputStreamWriter : 문자 스트림을 바이트 스트림으로 변환한다.
  • bw.write(food + "\n"); : 출력.
  • bw.newLine(); : 개행.
  • bw.flush(); : 버퍼 사용 시 flush() 습관화.

 


다. StringBuilder

import java.lang.StringBuilder;

...

StringBuilder sb = new StringBuilder();
for(int i = 0 ; i < n; i++) {
    sb.append(data[i] + " ");
}

System.out.println(sb.toString());

BufferedWriter랑 크게 차이가 없음.

 

Java의 String은 immutable한 객체이기 때문에 수정하면 성능이 저하된다.

 

이에 문자열을 빈번하게 수정하는 경우 StringBuilder를 활용한다.

 

(Single thread에선 StringBuilder, multi thread에선 StringBuffer 사용하자)