BufferedReader, BufferedWriter

오늘·2021년 3월 23일
0

Java

목록 보기
25/42

Buffer

  • 데이터를 한 곳에서 다른 한 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 임시 메모리 영역
  • 입출력 속도 향상을 위해 버퍼 사용
  • BufferedReader : 버퍼를 이용한 입력
  • BufferedWriter : 버퍼를 이용한 출력

BufferedReader

  • Scanner
    : 스페이스와 엔터 모두 입력의 경계로 인식
  • BufferedReader
    : 스페이스는 제하고 엔터만 경계로 인식
    : 받은 데이터는 String으로 타입이 고정되어있다(!)
    -> int 타입인 read()가 있긴한데.. 3을 '3'이라 읽어서 정수형인 (int)3을 리턴. 즉, 51이 반환되는.. 그렇다.
    : 예외처리는 필수

자바를 배우면서 사용자에게 입력을 받을 때 가장 먼저 사용법을 배우는 것은 Scanner 일것이다. 스캐너에 비해 BufferedReader은 다소 사용하기 불편할 수도 있지만, 많은 양의 데이터를 입력 받을 경우 작업속도에서 차이가 많이난다
-> 알고리즘에 효율적

버퍼리더 사용법

// 사용하기 위한 선언
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

// 버퍼리더는 기본적으로 String 으로 타입이 고정되어 있기 때문에
String s = br.readLine();
// 다른 타입으로 사용하려면 형변환이 필요하다
int i = Integer.parseInt(br.readLine());

readLine() 으로 입력받을 때 주의해야할 점이 있다면 예외처리를 꼭 해줘야한다는 것이다.

사용 모습 보기

  1. try-catch 문으로 예외처리를 해주었고,
    기본형이 String이기 때문에 String 타입은 변환없이 입력이 가능.
    int형은 형변환을 한번 거친 후 담아줘야 한다.
try {
	BufferedReader br = new BufferedReader (new
    				InputStreamReader(System.in));
			
	System.out.println("입력");
	String ss = br.readLine();
	int num = Integer.parseInt(br.readLine());
	// 입력 끝나면 닫아주기
	br.close();
			
} catch (IOException e) {
	e.printStackTrace();
	System.out.println(e.getMessage());
}
  1. 파일을 읽어올 때
try {
	BufferedReader br = new BufferedReader(new 
    				InputStreamReader(System.in));
			
	// 파일에서 입력 받을 경우
	FileReader fr = new FileReader("Array.java");
	BufferedReader br_f = new BufferedReader(fr);

	br.close();
			
	// 파일의 한 줄 한 줄 읽어서 출력
	String line = "";
	for(int i=1; (line = br_f.readLine()) != null; i++) {
		System.out.println(line);
	}
} catch (IOException e) {
	e.printStackTrace();
	System.out.println(e.getMessage());
}

Scanner처럼 공백단위로 데이터를 구분하고 싶어요!

String클래스를 보면 split 함수가 있다.

String[] 배열명 = 문자열.Split("구분할 특정 문자");

특정 문자를 기준으로 문자열을 잘라 배열에 삽입해주는 함수인데, 원하는 구분자로 자를 수 있어 여러 data에 유용히 활용 가능할 것 같다.

사용 예시는 아래와 같다.
1. 반점(,) 기준으로 자르기

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

System.out.println("입력 >>");
String str = br.readLine();
// 문자열을 반점(,) 기준으로 잘라 strArr 배열에 삽입
String[] strArr = str.split(",");
			
for (int i=0; i<strArr.length; i++) {
	System.out.println(strArr[i]);
}

아래 실행 결과를 보면 반점을 기준으로 문자가 구분되어 있는 모습을 확인할 수 있다.
strArr[0] = 내일은
strArr[1] = 내일의
strArr[2] = 해가
...
strArr[8] = 자자
이런식으로 잘려 들어가는 것이다

실행 결과

  1. 공백을 기준으로 자르기
String str = "언제나 건강이 가장 중요해요";
// 문자열을 반점(,) 기준으로 잘라 strArr 배열에 삽입
String[] strArr = str.split(" ");
	
for (int i=0; i<strArr.length; i++) {
	System.out.println(strArr[i]);
}

실행결과


또 다른 BufferedReader의 함수들


BufferedWriter

system.out.print("") 와 동일하게 사용 가능한 함수

write("출력할 문자열")
: 출력할 문자를 적어준다. \n 기능이 없기 때문에
  출력과 동시에 개행을 해주려면 \n을 넣어주어야 한다.

newLine()
: \n 기능을 해준다.

flush() : 남아있는 데이터가 있다면 모두 출력해준다
close() : 스트림을 닫아준다.

버퍼를 이용하는 것이기 때문에 사용을 다 한 뒤에는 버퍼를 클린하게 해줘야한다.

사용모습

public class Main{
	public static void main(String[] args) throws IOException {
		BufferedWriter bw = new BufferedWriter(new
        				OutputStreamWriter(System.out));

			String str = "안녕";
			
			bw.write(str);
			bw.newLine();
			// write에 개행을 넣어주지 않으면
			// 붙어 출력된다
			bw.write("hello");
			bw.write(" Hi \n");
			bw.write(str + "\n");
			
			bw.flush();
			bw.close();
	}
}


// ---------------------
// (출력모습)
// 안녕
// hello Hi 
// 안녕

0개의 댓글