[JAVA] 빠른 입출력 : BufferedReader, BufferedWriter + StringBuilder

진예·2023년 9월 20일
0

JAVA

목록 보기
1/10
post-thumbnail

💡 입력

📒 Scanner

입력받은 데이터(바이트)를 다양한 타입으로 변환하여 반환하는 클래스 (java.util 패키지)

  • 띄어쓰기개행문자를 기준으로 입력 값 구분
  • nextInt(), nextLine(), ...원하는 타입의 데이터를 읽을 수 있음
  • 데이터를 입력받는 즉시 바로 프로그램에 전달 ➡️ 속도가 느리다!

✏️ 사용법

import java.util.Scanner;

public class Scanner_ {

	public static void main(String[] args) {
		
		Scanner s = new Scanner(System.in);
        
		System.out.print("값을 입력하세요. : ");
		int i = s.nextInt(); // 값 입력받음
        
	}

}

📒 BufferedReader

데이터를 한 번에 읽어와 버퍼에 보관한 후, 버퍼에서 데이터를 읽어오는 클래스 (java.io 패키지)

  • 개행문자를 기준으로 입력 값 구분
  • 데이터를 파싱하지 않고 무조건 String으로 가져옴 ➡️ 경우에 따라 형변환 수행
  • 예외 처리 필수
  • 버퍼가 가득 차거나, 개행문자가 나타나면 버퍼의 내용을 한 번에 프로그램으로 전달 ➡️ 속도 빠름! 많은 양의 데이터를 처리할 때 유리하다!

✏️ 사용법

import java.io.*;
public class Buffered {

	public static void main(String[] args) throws IOException {
		
		BufferedReader br = 
        		new BufferedReader(new InputStreamReader(System.in));
		
		String str = br.readLine();
		
        // 정수형 데이터가 필요한 경우, 파싱 필요
        int a = Integer.parseInt(str); 
		
	}
}

📝 split() 함수

String.split(" ") 함수를 통해, 입력받은 데이터를 공백 단위로 끊어서 배열에 저장 가능!

import java.io.*;
public class Buffered {

	public static void main(String[] args) throws IOException {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		String[] arr = br.readLine().split(" ");
		
		for(int i=0;i<arr.length;i++) {
			System.out.println(arr[i]); // 공백 기준 i번째 데이터
		}
        
	}
}

📝 StringTokenizer

StringTokenizernextToken() 함수를 통해, 입력받은 데이터를 공백 단위로 끊어서 호출 가능!

import java.io.*;
import java.util.StringTokenizer;
public class Buffered {

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

		StringTokenizer st = new StringTokenizer(br.readLine());
		
		System.out.println(st.nextToken()); // 공백 기준 첫번째 데이터
		System.out.println(st.nextToken()); // 공백 기준 두번째 데이터
		
	}
}


💡 출력

📒 BufferedWriter

System.out.println(); 과 동일 기능 수행 ➡️ 속도가 빠르고, 많은 양의 데이터 처리에 유리!

✏️ 사용법

import java.io.*;
public class Buffered {

	public static void main(String[] args) throws IOException {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw 
        		= new BufferedWriter(new OutputStreamWriter(System.out));
		
		String[] arr = br.readLine().split(" ");
		
		for(int i=0;i<arr.length;i++) {
			bw.write(arr[i]);
			bw.newLine(); // 개행
		}
		
		bw.close();
	}
}

✏️ : write() 함수는 개행을 수행하지 않기 때문에, 개행문자(\n)를 사용하거나, newLine() 함수를 통해 줄바꿈 가능

📝 메서드

  • close() : 스트림 닫음
  • flush() : 스트림 비움 ➡️ 버퍼를 사용 한 후에 반드시 닫거나 비워줘야 함!
  • newLine() : 개행
  • write() : 출력 ➡️ String 타입만 출력 가능 (정수 출력 시, String.ValueOf() 함수를 사용하거나, " "를 더해서 String 타입으로 변환)

📒 StringBuilder

문자열추가, 삭제, 변경할 수 있는 메서드 제공

  • 단일 스레드 환경일 경우만 사용 가능 ➡️ 멀티 스레드 환경에서 사용 불가
  • 속도 빠름! ➡️ 문자열 추가 연산많은 경우 유리

✏️ 사용법

import java.io.*;
public class Buffered {

	public static void main(String[] args) throws IOException {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringBuilder sb = new StringBuilder(); // 객체 생성
		
		String[] arr = br.readLine().split(" ");
		
		for(int i=0;i<arr.length;i++) {
			sb.append(arr[i]).append("! ");
		}
		bw.write(sb.toString());
		
		br.close();
		bw.close();
	}
}

📝 메서드

  • append(String s) : 문자열 뒤에 문자열 s를 붙임
  • delete(int start, int end) : 문자열의 start ~ end 인덱스까지 삭제
  • insert(int offet, any primitive of char[]) : 특정 인덱스에 문자 삽입
  • replace(int start, int end, String s) : start ~ end 인덱스의 문자열s로 치환
  • reverse() : 순서 뒤집음
  • setCharAt(int idx, char ch) : idx 인덱스의 문자ch로 치환
  • indexOf(String s) : s이 위치한 인덱스 확인
  • subString(int start, int end) : start ~ end 인덱스 사이의 값 추출
profile
백엔드 개발자👩🏻‍💻가 되고 싶다

0개의 댓글