20 May 2020

Stream을 이용한 문자열 입출력

CharacterStreams을 이용한 파일 입출력 개요.

StringStream


java.io패키지에서 여러 클래스들 중에서 위 그림과 같은 클래스 구조를 이용하면 Stream을 이용한 Character 입출력을 할 수 있습니다.

기존에는 character입출력을 Scanner 객체를 이용해서 스트림 입출력을 하는 경우가 많았다면 이제는 BufferedReadder, InputStreamReader, BufferedWriter, OutputStreamWriter을 이용해서 입출력을 배우는 것이 좋습니다.

가장 많이 쓰이는 코드는 아래와 같습니다.

package test;

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

public class Test {
	public static void main(String[] args) throws IOException {	
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	}
}
/*
what????   <-입력가능
*/


CharacterStream input 뜯어보기


이 코드를 뜯어보면서 CharacterStream을 어떻게 쓰는지 알아보겠습니다.

System

SystemInOut

우선 System클래스에서 in, out 필드를 확인 해보면 반환값이 InputStream, PrintStream인 것을 볼 수 있습니다.

in필드는 InputStream타입과 바인딩됐습니다. InputStream은 만들어지는 순간 입력데이터를 받게 준비를 하기 때문에 프로그램을 실행하면 콘솔창에서 키보드 입력을 받을 때까지 대기를 합니다.

표준입력스트림은 InputStream인스턴스는 InputStreamReader 생성자의 인자값으로 들어가게 됩니다.

InputStreamReader

InputStreamReader에서 Byte Stream이 Character Stream으로 변환이 됩니다.

InputStreamReader가 읽어들인 InputStream을 내부 메소드인 read()메소드로 읽으려면 조금 불편합니다. 왜냐하면 read()메소드는 아래와 같이 한글자만 읽거나 여분의 배열에 넣게 구현되어 있기 때문입니다.

InputStreamReaderRead

그래서 BufferedReader클래스를 만들어서 더욱 쓰기 편하게 만들었습니다.

BufferedReader

BufferdReader클래스는 character기반 input stream에서 텍스트를 읽고 버퍼에 저장합니다. 영어로는 buffering character이라고 표현돼있네요. 이렇게 버퍼에 저장해둠으로써 문자들, 배열, 라인을 더욱 효율적으로 읽을 수 있습니다.

BufferedReaderMethod

BufferedReader는 Reader클래스에서 상속받은 method에 추가로 여러 method들을 구현해놓았습니다. 그 중에 readLine()이라는 메소드는 inputStream에 있는 String을 라인별로 반환하는 메소드입니다. 그래서 이 메소드를 쓰면 위의 예시코드처럼 String값을 받아올 수 있습니다.

CharacterStream output 뜯어보기


package test;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Test {
	public static void main(String[] args) throws IOException {		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String str = br.readLine();
			
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		bw.write(str);
		bw.flush();
		bw.close();
	}
}


BufferdReader와 InputStreamReader을 통해 CharacterStream을 받아오면 이제 다시 BufferedWriter와 OutputStreamWriter로 CharacterStream을 출력할 수 있습니다.

BufferedWriter는 charactor-output stream에 텍스트를 출력합니다. 그래서 문자나 배열, 스트링을 효과적으로 출력할 수 있습니다.

OutputStreamWriter클래스는 character stream으로부터 byte stream으로 가는 통로역할을 합니다. 이 스트림에 입력되는 character들은 byte로 인코딩됩니다. 결과 byte들은 버퍼에 누적됩니다.

마지막으로 PrintStream을 통해 character들은 모두 byte로 출력하게 됩니다. System.out 필드는 PrintStream타입입니다.

PrintStream


package test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;

public class Test {
	public static void main(String[] args) throws IOException {		
		Reader br = new BufferedReader(new InputStreamReader(System.in));
		String str = ((BufferedReader) br).readLine();
		System.out.println(str);
	}
}

BufferedWriter대신에 간단하게 System.out.println(String)을 써도 됩니다.

System.out으로 PrintStream 클래스 인스턴스가 나오는데 내부메소드은 println(String)은 스트림에 문자열을 넣고 바로 출력합니다. 버퍼에 저장하지 않는다는 점이 BufferedWriter를 쓰는 것과의 차이입니다.


Tags:
0 comments