Notice
Recent Posts
Recent Comments
Link
«   2026/07   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

어리바리 신입 개발자의 얼렁뚱땅 개발 기록 ✨

[ Java / 백준15552 ] BufferedReader & BufferedWriter 본문

Back - end/JAVA

[ Java / 백준15552 ] BufferedReader & BufferedWriter

낫쏘링 2023. 8. 31. 00:13
728x90

[ Scanner VS BufferedReader]

[ Scanner ]
- 간단한 입력 처리에 사용
- next(), nextInt(), nextDouble() 등 다양한 데이터 타입을 입력 받을 수 있음
- 한 글자 씩 읽고 처리함
- 띄어쓰기와 개행을 통해 입력 값을 인식
- 큰 데이터에 대한 처리가 느림

[ BufferedReader ] 
- String 타입으로만 데이터를 입력 받을 수 있음
- 입력 값을 모아뒀다가 한 번에 처리함
- 개행만을 통해 입력 값을 인식
- 큰 데이터를 읽을 때 Scanner에 비해 처리가 빠름
- IOException을 통해 예외 처리 필요

 

[ System.out.print() VS BufferedWriter]

[ System.out.print() ]
- 간단한 출력 처리에 사용
- 다양한 데이터 타입을 출력할 수 있음
- println으로 자동 개행 가능
- 큰 데이터에 대한 처리가 느림

[ BufferedWriter ]
- String 타입으로만 테이터를 출력할 수 있음
- 입력 값을 모아뒀다가 한 번에 처리함 - .write()를 통해 버퍼에 데이터를 저장하고 .flush()를 통해 한 번에 출력
- 개행을 따로 하지 않고 \n 또는 .newLine() 사용해야 함
- 큰 데이터를 출력할 때 System.out 보다 처리가 빠름
- IOException을 통해 예외 처리 필요

 

[ 사용 방법 ] 

[ 1. import ]
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;

// 콘솔로 입력 & 출력
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

// 파일로 입력 & 출력
import java.io.FileReader;
import java.io.FileWriter;

[ 2. 예외처리 & 생성자 ]
public class Main {
	// 예외 처리 throws IOException
    public static void main(String[] args) throws IOException{
        // 콘솔에서 입력 or 출력
        BufferedReader br = new BufferedReader (new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter (new OutputStreamWriter(System.out));

        // 파일로 입력 or 출력
        BufferedReader br = new BufferedReader (new FileReader("textFile.txt"));
        BufferedWriter bw = new BufferedWriter (new FileWriter("textFile.txt"));
    }
}


[3. 입력 & 출력]

// BufferedReader는 String 타입으로 값을 받아온다.
String inputData = br.readLine();

// 그래서 다른 데이터 타입으로 받고자 한다면 형변환 해줘야 함!
int inputInt = Integer.parseInt(br.readLine());
// 혹은 int inputInt = Integer.parseInt(inputData);

// BufferedWriter에 데이터 저장
bw.write(inputInt);
bw.write("\n"); // 개행1
bw.newLine(); // 개행2

// BufferedWriter는 String 타입으로 값을 출력한다.
// 그래서 다른 데이터 타입을 출력할 경우 먼저 String으로 형변환 해줘야 함!
int num = 122;
bw.write(num); // 오류 발생
bw.write(Integer.toString(num)); // 출력됨
bw.write(String.valueOf(num)); // 출력됨
// toString과 String.valueOf의 차이점
// toString에 null 값이 입력됐을 경우 NullPointerException 에러
// String.valueOf는 null 값이 입력됐을 경우 문자열 "null" 출력

// BufferedWriter에 저장되어있는 데이터 한 번에 출력하기
bw.flush();

// BufferedReader & Writer 종료
br.close();
bw.close();


[ readLine()으로 받은 문자열(String) 나누기 ] 

// BufferedReader는 Scanner와 다르게 공백을 제외한 개행만으로 데이터를 나눈다.
// 입력 받은 데이터가 공백 단위로 끊는 방법
// 입력 받은 데이터가 2 3 4 일 경우 각각 정수 2, 3, 4로 따로 담아주는 방법
// BufferedReader와 BufferedWriter의 사용 준비는 모두 이미 되어있다고 가정

-------------------------------------------------------------------------------------
// 1. StringTokenizer 사용

import java.util.StringTokenizer;

StringTokenizer strSlice = new StringTokenizer(inputData);
// 혹은 StringTokenizer strSlice = new StringTokenizer(br.readLine());

int num1 = Integer.parseInt(strSlice.nextToken());
int num2 = Integer.parseInt(strSlice.nextToken());
int num3 = Integer.parseInt(strSlice.nextToken());

-------------------------------------------------------------------------------------
// 2. split 사용

// split 문자열을 입력 받은 인수를 기준으로 나누어 배열로 반환한다.
// split(" ")는 공백을 기준으로 split("-")는 -를 기준으로 나눈다.
String[] strArr = inputData.split(" ");

int num1 = Integer.parseInt(strArr[0]);
int num2 = Integer.parseInt(strArr[1]);
int num3 = Integer.parseInt(strArr[2]);

-------------------------------------------------------------------------------------
// 3. charAt 사용

// 문자열을 문자열 하나 char로 떼어내 준다.
// 공백도 문자열에 포함되기 때문에 공백까지 떼어내 주기 때문에 인덱스를 하나 씩 넘겨야 함
// 입력 받은 문자열이 숫자일 경우 숫자 그대로 문자열로 만들어주지 않는다.
// 아스키코드로 변환하기 때문에 숫자 그대로 출력하고 싶으면 - '0' 해줘야 함
char num1 = inputData.charAt(0);
char num2 = inputData.charAt(2);
char num3 = inputData.charAt(4);

 

문자열을 끊는 방법 중 1번 StringTokenizer와 2번 split만 사용해서 풀어봤는데
StringTokenizer는 속도 880m/s 길이 905B
split는 속도 1200m/s 길이1042B 나왔다. 
728x90