Java :: I/O :: 4. 문자기반 스트림

김병철·2022년 9월 19일
0

Java

목록 보기
15/20

4. 문자기반 스트림

문자 데이터를 다룬다는 것 말고는 바이트기반 스트림과 거의 비슷하다.

4.1 Reader Writer

문자기반 스트림의 조상은 Reader / Writer이다.
바이트 스트림과 다르게 byte[]대신 char[]를 사용한다.


# Reader의 메서드

  • abstract void close()
    -> 입력스트림을 닫음으로써 사용하고 있던 자원을 반환한다.

  • void mark(int readlimit)
    -> 현재위치를 표시해 놓는다. 후에 reset()에 의해 표시해 놓은 위치로 다시 돌아갈 수 있다.

  • boolean markSupported()
    -> mark()와 reset()을 지원하는지 알려준다.

  • int read()
    -> 입력소스로부터 하나의 문자를 읽어 온다. char의 범위인 0~65535범위의 정수를 반환하며, 입력스트림의 마지막 데이터에 도달하면, -1을 반환한다.

  • int read(char[] c)
    -> 입력소스로부터 매개변수로 주어진 배열 c의 크기만큼 읽어서 배열 c에 저장한다. 읽어 온 데이터의 개수 또는 -1을 반환한다.

  • abstract int read(char[] c, int off, int len)
    -> 입력소스로부터 최대 len개의 문자를 읽어서, 배열 c의 지정된 위치(off)부터 읽은 만큼 저장한다. 읽어 온 데이터의 개수 또는 -1을 반환한다.

  • int read(CharBuffer target)
    -> 입력소스로부터 읽어서 문자버퍼(target)에 저장한다.

  • boolean ready()
    -> 입력소스로부터 데이터를 읽을 준비가 되었는지 알려준다.

  • void reset()
    -> 입력소스에서의 위치를 마지막으로 mark()가 호출되었던 위치로 되돌린다.

  • long skip(long n)
    -> 현재 위치에서 주어진 문자 수(n)만큼 건너뛴다.


# Writer의 메서드

  • Writer append(char c)
    -> 지정된 문자를 출력소스에 출력한다.

  • Writer append(CharSequence c)
    -> 지정된 문자열(CharSequence)을 출력소스에 출력한다.

  • Writer append(CharSequence c, int start, int end)
    -> 지정된 문자열(CharSequence)의 일부를 출력소스에 출력(CharBuffer, String, StringBuffer가 CharSequence를 구현)

  • abstract void close()
    -> 출력스트림을 닫음으로써 사용하고 있던 자원을 반환한다.

  • abstract void flush()
    -> 스트림의 버퍼에 있는 모든 내용을 출력소스에 쓴다.
    (버퍼가 있는 스트림에만 해당됨)

  • void write(int b)
    -> 주어진 값을 출력소스에 쓴다.

  • void write(char[] c)
    -> 주어진 배열 c에 저장된 모든 내용을 출력소스에 쓴다.

  • abstract void write(char[] c, int off, int len)
    -> 주어진 배열 c에 저장된 내용 중에서 off번째부터 len길이만큼만 출력소스에 쓴다.

  • void write(String str)
    -> 주어진 문자열(str)을 출력소스에 쓴다.

  • void write(String str, int off, int len)
    -> 주어진 문자열(str)의 일부를 출력소스에 쓴다.
    (off번째 문자부터 len개 만큼의 문자열)


문자 기반 스트림은 단순히 2byte로 스트림을 처리한다는 것만을 의미하지는 않는다.
문자 데이터를 다루는데 필요한 또 하나의 정보는 인코딩(encoding) 이다.

문자 기반 스트림의 자손들은 여러 종류의 인코딩과 자바에서 사용하는 유니코드(UTF-16)간의 변환을 자동적으로 처리해 준다.

4.2 FileReader와 FileWriter

FileReader/FileWriter는 파일로부터 텍스트를 읽고, 파일에 출력하는데 사용된다.
FileInputStream/FileOutputStream과 다르지 않다.

# FileInputStream과 FileReader의 차이점 예제

같은 내용의 파일(text.txt)를 FileInputStream과 FileReader로 각각 읽어서 화면에 출력하여 비교한다.

다음 예제에서의 test.txt파일은 UTF-8형식으로 저장하였다.

  • 코드 :
import java.io.*;

public class Ex15_16 {
	public static void main(String[] args) {
		try {
			String fileName = "D:\\studySpace\\test.txt";
			FileInputStream fis = new FileInputStream(fileName);
			FileReader fr = new FileReader(fileName);
			
			int data = 0;
			
			while((data=fis.read()) != -1) {
				System.out.print((char)data);
			}
			fis.close();
			System.out.println();
			
			
			while((data=fr.read()) != -1) {
				System.out.print((char)data);
			}
			fr.close();
			System.out.println();
		} catch(IOException e) {
			e.printStackTrace();
		}
	}//main
}
  • 출력 결과 :
Hello, 안녕하세요?
Hello, 안녕하세요?

InputStream을 사용한 출력 첫 줄의 내용은 다 한글이 다 깨져있고,
Reader를 사용한 출력 두번째 줄은 정상적으로 출력되었다.

profile
keep going on~

0개의 댓글