[JAVA] 문자 Stream : InputStreamReader / OutputStreamWriter
문자 Stream : InputStreamReader / OutputStreamWriter
Stream은 바이트 단위는 바이트 단위로 연결하고 캐릭터 단위는 캐릭터 단위로 연결하는 것이 원칙이다. 하지만 캐릭터는 결국 바이트 2개가 모여서 구성한 데이터로 볼 수 있다. 따라서 두 가지 서로 다른 기준을 호환할 수 있는 통로가 제공되어야 한다.
이 두 클래스는 Stream 이라는 말고 Reader/Writer 라는 말을 동시에 가지고 있다.
결론적으로 이 두 클래스는 둘 사이의 연결을 담당한다고 볼 수 있다.
Stream : 바이트 단위의 입출력
Reader/Writer : 캐릭터 단위의 입출력
InputStreamReader / OutputStreamWriter는 바이트 스트림에서 문자 스트림으로, 또는 문자 스트림에서 바이트 스트림으로의 변환을 제공하는 입출력 스트림이다. 바이트를 읽어서 지정된 문자 인코딩에 따라 문자로 변환하는데 사용한다.
문자로 변환하는 경우 인코딩 방식은 특정 방식으로 지정할 수도 있고 경우에 따라서는 플랫폼의 기본 인코딩을 이용하기도 한다.
* InputStreamReader / OutputStreamWriter 의 생성자
InputStreamReader의 생성자 | 설 명 |
InputStreamReader(InputStream in) | 주어진 입력 바이트 스트림 in에 대해 기본 인코딩을 사용하는 객체를 생성한다. |
InputStreamReader(InputStream in, Charset cs) | cs 문자 집합의 인코딩을 사용해 in을 문자스트림으로 변환 객체를 생성 한다. |
InputStreamReader(InputStream in, CharsetDecoder dec) | dec 문자 집합의 디코더를 사용해 in을 문자스트림으로 변환 객체를 생성 한다. |
InputStreamReader(InputStream in, String charsetName) | charsetName을 명명하는 인코딩을 사용하는 객체를 생성한다. |
OutputStreamWriter의 생성자 | 설 명 |
OutputStreamWriter(OutputStream out) | 주어진 출력 바이트 스트림 out에 대해 기본 인코딩을 사용하는 객체를 생성한다. |
OutputStreamWriter(OutputStream out, Charset cs) | cs 문자 집합의 인코딩을 사용해 out을 바이트스트림으로 변환 객체를 생성 한다. |
OutputStreamWriter(OutputStream out, CharsetDecoder dec) | dec 문자 집합의 디코더를 사용해 out을 바이트스트림으로 변환 객체를 생성 한다. |
OutputStreamWriter(OutputStream out, String charsetName) | charsetName을 명명하는 인코딩을 사용하는 객체를 생성한다. |
[JAVA] ByteStream : InputStream / OutputStream
* InputStreamReader 의 메소드
InputStreamReader의 메소드 | 설 명 |
void close() | InputStreamReader를 닫는다. |
String getEncoding() | 현재 사용하고 있는 문자 인코딩의 표준 이름을 얻는다. |
int read() | 문자하나를 읽는다. (없을 경우 -1 반환) |
int read(char[] cbuf, int offset, int length) | cbuf의 버퍼에 offset 부터 length 길이만큼의 문자를 읽는다. |
boolean ready() | InputStream에서 문자가 있는지 읽을 수 있는지 여부를 확인한다. |
* OutputStreamWriter 의 메소드
OutputStreamWriter의 메소드 | 설 명 |
void close() | OutputStreamWriter를 닫는다. |
void flush() | OutputStreamWriter의 버퍼를 비운다. (출력한다.) |
String getEncoding() | 현재 사용하고 있는 문자 인코딩의 표준 이름을 얻는다. |
void write(char[] cbuf, int off, int len) | cbuf의 버퍼에 off 부터 len 만큼을 담아 문자를 쓴다. |
void write(int c) | c개의 문자를 쓴다. |
void write(String str, int off, int len) | 문자열 str 의 off부터 len 만큼을 쓴다. |
* InputStreamReader 사용 예제
import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; public class ReaderWriter { public static void main(String[] args) { // InputStreamReader//OutputStreamWriter를 선언 InputStreamReader isr = null; OutputStreamWriter osw = null; try { // System.in 으로 콘솔에서 입력하는 문자를 문자 스트림으로 변환하는 객체 생성 // System.out 으로 콘솔에 출력하는 OutputStreamWriter 객체 생성 isr = new InputStreamReader(System.in); osw = new OutputStreamWriter(System.out); int i = 0; // InputStreamReader에서 한문자씩 읽으면서 Loop를 돈다. while((i=isr.read()) != -1){ // OutputStreamWriter에 읽은 문자 하나를 쓴다. osw.write((char)i); } } catch (IOException e) { e.printStackTrace(); }finally{ // InputStreamReader/OutputStreamWriter 를 닫아준다. if(isr != null) try{isr.close();}catch(IOException e){} if(osw != null) try{osw.close();}catch(IOException e){} } } } |
- System.in 으로 입력받은 데이터를 문자열 스트림으로 변환하는 InputStreamReader 선언한다.
- 입력받은 문자를 바이트 스트림으로 변환하여 System.out에 출력하는 OutputStreamWriter를 선언한다.
- InputStreamReader에서 한 문자씩 읽어서 출력한다.
- InputStream/OutputStream은 1바이트씩 입력하고 출력하여 2바이트 이상인 한글의 경우 정상적으로 입출력이 일어나지 않았다.
- InputStreamReader 와 OutputStreamWriter는 문자(Character) 단위로 입출력을 하기 때문에 한글 처리도 문제가 없다.
InputStreamReaderOutputStreamWriter.zip
출처: https://hyeonstorage.tistory.com/247?category=578560 [개발이 하고 싶어요]
'JAVA > Java IO' 카테고리의 다른 글
[JAVA] I/O Char 와 Encoding (0) | 2019.08.07 |
---|---|
[JAVA] I/O 입출력 클래스의 종류 (0) | 2019.08.07 |
[JAVA] 문자 Stream : BufferedReader / BufferedWriter (파일 복사 예제) (0) | 2019.08.07 |
[JAVA] 문자 Stream : FileReader / FileWriter (0) | 2019.08.07 |
[JAVA] 문자 Stream : Reader / Writer (0) | 2019.08.07 |
[JAVA] ByteStream : DataInputStream / DataOutputStream (0) | 2019.08.07 |
[JAVA] ByteStream : BufferedInputStream / BufferedOutputStream (파일 복사 예제) (0) | 2019.08.07 |
[JAVA] ByteStream : FilterInputStream / FilterOutputStream (0) | 2019.08.07 |