본문 바로가기

개념 정리/Java

[JAVA] 빠른 입출력 (BufferedReader, BufferedWriter, StringBuilder), 문자열 분리

· scanner / System.out.print 보다 속도 빠른  BufferedReader / BufferedWriter / StringBuilder

· 문자열을 분리해주는 StringTokenizer / split


scanner 을 이용한 입력 :

  • 입력시 바로 처리하는 방식 - 속도 느림.
  • 짧은 입력에 추천. 많은 입력에는 비추 (버퍼 사이즈가 1024byte임)
  • 공백개행문자 기준으로 읽음

■ BufferedReader 을 이용한 입력 :

>> BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

버퍼에 쌓아두고 한 번에 처리하는 방식

 

  • scanner보다 속도 빠름.
  • String 타입으로만 읽을 수 있음.
  • 예외처리 명시해야 함.(throws IOExeption 또는 try/catch문 사용)
  • java.io 패키지
  • 메모리 사용량 큼. 많은 입력에 추천 (버퍼사이즈 8192byte)
  • 개행문자 기준으로 읽음.
  • 스레드 간 동기화 가능
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public static void main(String [] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    
    String s = br.readLine();	// 문자열 읽어오기
    int n = Integer.parseInt(br.readLine());	// 읽어와서 데이터 가공
    br.close();
}

 

▷ readLine() 메소드 이용해 읽어옴

  close() 해주는게 좋음 

StringTokenizersplit 이용해 문자열 분리 


■ StringTokenizer 을 이용한 문자열 분리 :

- 문자열을 공백 단위(디폴트)로 분리.

- java.util 패키지 (java.util.StringTokenizer)

 

▽ StringTokenizer(String str) : 기본 구분자로 문자열 분리 

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


▽ StringTokenizer(String str, String delim) : 지정 구분자(delim)로 분리 

StringTokenizer st = new StringTokenizer(br.readLine(), "-");	// "-" 기준 분리

 

▽ StringTokenizer(String str, String delim, boolean tf) : true이면 구분자도 토큰으로 인식. (디폴트는 false)

StringTokenizer st = new StringTokenizer(br.readLine(), " ", true);
// ex) "Hello World!" --> "Hello", " ", "World!"

 

 

▽ 주요 메소드:

· nextToken() : 다음 토큰 리턴 

 

· countTokens() : 남은 토큰의 개수 리턴

 

· hasMoreTokens() : 리턴할 다음 토큰이 있는지 여부 리턴

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

public static void main(String [] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer st = new StringTokenizer(br.readLine());
    
    String s = st.nextToken();	// 다음 토큰 리턴
    int n = st.countTokens();	// 남은 토큰 개수 리턴
    boolean tf = st.hasMoreTokens();	// 남은 토큰 존재 여부 리턴
    
    br.close();
}

 


■ split 을 이용한 문자열 분리 :

- 문자열을 분리해 배열로 리턴함

 

▽ split(String delim) : 구분자(delim)로 문자열 분리

- 여러개의 구분자로 문자열 분리 : 대괄호로 구분자들 감싸기. ex) split("[$@#]") --> 구분자: $, @, #

String [] str = br.readLine().split(" ");	// 공백으로 문자열 분리
String [] str = br.readLine().split("[# %&]");	// #, 공백, %, &으로 문자열 분리

 

▽ split(String delim, int n) : 구분자(delim)로 문자열 분리. 단, n번만 분리

String [] str = br.readLine().split(" ",3);
// "1 2 3 4 5" --> "1", "2", "3 4 5"

 


System.out.print 를 이용한 출력:

  • 출력을 바로바로 처리 - 속도 느림

■ BufferedWriter 을 이용한 출력:

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

버퍼에 모아놨다가 한번에 처리

 

  • system.out.print보다 속도 빠름
  • 스레드 간 동기화 가능 - 멀티스레드에 적합
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.IOException;

public static void main(String [] args) throws IOException {
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    
    bw.write("Hello");
    bw.flush();
    bw.close();
}

 

△ write(String s, int off, int len) : 문자열 s를 off위치부터 len길이만큼 버퍼에 저장

* 버퍼에 저장되는 것이므로, 출력하려면 flush()해줘야 함

* 숫자 출력 시, String형으로 변환 후 출력하기 ex) bw.write(5 + "");

 

 newLine() : 줄바꿈문자 출력

 

 flush() : 남아있는 데이터 모두 출력시키기

 

 close() : 스트림 닫기


■ StringBuilder 을 이용한 출력:

>> StringBuilder sb = new StringBuilder();

- StringBuilder을 이용해 문자열 저장 후, System.out.print()를 이용해 한번에 출력하는 방법으로 시간절약을 할 수 있음.

 

- 기존 문자열에 더하는 방식으로 시간절약.(String에 문자열을 더하는 방식은 객체를 새로 만들어야 해서 시간소요 up)

 

- 스레드 간 동기화가 불가능해 단일 스레드에 적합.

 

- 메소드는 String클래스 메소드와 같음. (append, delete, insert, charAt, length...)

StringBuilder sb = new SringBuilder();
sb.append("abc");
sb.append("def").append("gh");
System.out.println(sb);