문자 스트림 (JDK(TM) 1.1 으로부터 도입) - xrath.com 에서 번역됨

# 문자 스트림 (JDKTM 1.1 으로부터 도입)

버젼 1.1 의 JavaTM Development Kit 로부터,`java.io` 패키지로 「문자 스트림」이 지원되게 되었습니다.

1.1 보다 전의 JDK 의 표준 입출력 기능에서는,`InputStream` 및 `OutputStream` 클래스와 이러한 서브 클래스를 사용하는 바이트 스트림만이 지원되고 있었습니다. 문자 스트림은 바이트 스트림과 닮아 있습니다만, 문자 스트림에는, 8 비트 단위의 바이트는 아니고 16 비트의 Unicode 문자가 포함됩니다. 문자 스트림은,`Reader` 와 `Writer` 클래스, 및 이러한 서브 클래스에 의해 구현됩니다. `Reader` 및 `Writer` 에서는,`InputStream` 및 `OutputStream` 와 기본적으로 같은 조작이 지원됩니다. 다만, 바이트 스트림의 메소드가 바이트 또는 바이트 배열을 조작하는데 대해, 문자 스트림의 메소드는, 문자, 문자 배열, 또는 캐릭터 라인을 조작하는 점이 다릅니다.

바이트 스트림로 이용할 수 있는 기능의 대부분은, 문자 스트림에서도 이용할 수 있습니다. 문자 스트림 클래스와 바이트 스트림의 이름에도 같은 것을 말할 수 있습니다. 문자 스트림 클래스의 접두사에는, 일반적으로은 대응하는 바이트 스트림 클래스의 이름과 같은 것이 사용되고 있습니다. 예를 들어,`PushbackReader` 클래스에서는,`PushbackInputStream` 클래스로부터 바이트 스트림에 제공되는 기능은, 문자 스트림에도 제공됩니다.

### 문자 스트림을 사용하는 이유

문자 스트림을 사용하는 주된 이점은, 특정의 문자 인코딩에 의존하지 않는 프로그램을 간단하게 작성할 수 있기 (위해)때문에,국제화가 간단하게 되는 것입니다.

Java 에서는, 캐릭터 라인이 Unicode 로 포함됩니다. Unicode 는 국제 표준의 문자 인코딩으로, 각국의 대부분의 기술 용언어를 나타낼 수가 있습니다. 다만, 사용자가 읽을 수 있는 표준적인 파일에서는, Unicode 또는 ASCII 에 관련하지 않는 인코딩이 사용되고 있는 일이 있습니다. 인코딩에는, 다양한 방법이 있습니다. 문자 스트림 기능에서는, 바이트 스트림 및 문자 스트림의 변환을 실시하는 2 개의 클래스가 제공됩니다. 이 때문에, 인코딩 처리의 복잡함이 해소되고 있습니다. `InputStreamReader` 클래스에서는, 바이트 입력 스트림로부터 바이트를 읽어들여, 인코딩에 응해 문자로 변환하는 문자 입력 스트림이 구현됩니다. 같이`OutputStreamWriter` 클래스에서는, 인코딩에 응해 문자를 바이트로 변환해, 바이트 출력 스트림에 기입하는 문자 출력 스트림이 구현됩니다.

문자 스트림의 2 번째의 이점은, 바이트 스트림보다 효율적인 일입니다. Java 독자적인 바이트 스트림의 대부분의 구현에서는, read 및 기입해 조작이 한 번에 1 바이트 단위로 행해집니다. 이것에 대해, 문자 스트림 클래스에서는, read 및 기입해 조작이 한 번에 1 버퍼 단위로 행해집니다. 문자 스트림 클래스에서는, 이 이점과 보다 효율적인 락 방식에 의해, 인코딩 변환에 의해 추가된 오버헤드가 많은 경우 상쇄됩니다.

### API 의 개요

문자 스트림 클래스는,`java.io` 패키지의 기존의 바이트 스트림 클래스에 대응하도록(듯이) 설계되고 있습니다. 벌써 설명한 것처럼, 각 문자 스트림 클래스명은,`Reader` 또는 `Writer` 로 끝납니다. 또, 대응하는 바이트 스트림 클래스가 존재하는 경우는, 일반적으로, 그 바이트 스트림 클래스명과 같은 접두사가 됩니다. 다음의 겉(표)는, 새로운 클래스명의 일람입니다. 왼쪽의 열의 인덴트는, 서브 클래스의 관계를 나타내고 있습니다.

문자 스트림 클래스 | 설명 | 대응하는 바이트 클래스
--- | --- | ---
`Reader` | 문자 입력 스트림의 추상 클래스 | `InputStream`
`BufferedReader` | 입력을 버퍼에 포함해, 행을 구문 분석 한다 | `BufferedInputStream`
`LineNumberReader` | 행 번호를 추적한다 | `LineNumberInputStream`
`CharArrayReader` | 문자 배열로부터 읽어들인다 | ByteArrayInputStream
`InputStreamReader` | 바이트 스트림을 문자 스트림로 변환한다 | (없음)
`FileReader` | 파일의 바이트를 문자 스트림로 변환하는 | `FileInputStream`
`FilterReader` | 필터를 걸칠 수 있었던 문자 입력의 추상 클래스 | `FilterInputStream`
`PushbackReader` | 문자를 push back(되밀치는) 한다 | `PushbackInputStream`
`PipedReader` | `PipedWriter` 로부터 읽어들인다 | `PipedInputStream`
`StringReader` | `String` 로부터 읽어들인다 | `StringBufferInputStream`
`Writer` | 문자 출력 스트림의 추상 클래스 | `OutputStream`
`BufferedWriter` | 출력을 버퍼에 포함해, 플랫폼의 행 단락 문자를 사용한다 | `BufferedOutputStream`
`CharArrayWriter` | 문자 배열에 기입한다 | `ByteArrayOutputStream`
`FilterWriter` | 필터를 걸칠 수 있었던 문자 출력의 추상 클래스 | `FilterOutputStream`
`OutputStreamWriter` | 문자 스트림을 바이트 스트림로 변환한다 | (없음)
`FileWriter` | 문자 스트림을 바이트 파일로 변환한다 | `FileOutputStream`
`PrintWriter` | 값 및 객체를 `Writer` 에 출력한다 | `PrintStream`
`PipedWriter` | `PipedReader` 에 기입한다 | `PipedOutputStream`
`StringWriter` | `String` 에 기입한다 | (없음)

### 관련하는 변경

#### PrintStream

`PrintStream` 클래스는, 플랫폼의 디폴트의 문자 인코딩 및 플랫폼의 디폴트의 줄 끝 기호를 사용하도록(듯이) 변경되었습니다. 이 때문에, 각 `PrintStream` 에는,`OutputStreamWriter` 가 짜넣어졌습니다. 이 라이터를 개입시켜 모든 문자가 건네받아 출력용의 바이트가 생성됩니다. `println` 메소드에서는, 플랫폼의 디폴트의 줄 끝 기호가 사용됩니다. 이 줄 끝 기호는, 시스템의 `line.separator` 프로퍼티에 의해 정의됩니다만, 1 개의 개행 문자 (`「\n」`)일 필요는 없습니다. 기존의 `write` 메소드에 의해 출력된 바이트 및 바이트 배열은, 라이터 경유에서는 건네받지 않습니다.

`PrintStream` 클래스를 변경한 것에 의해, ASCII 이외의 로컬 인코딩이 사용되고 있는 플랫폼에서 Java 프로그램을 기술하고 있는 경우,`System.out` 및 `System.err` 가 사용하기 쉽게 되었습니다. 즉,`PrintStream` 는, 주로 디버그와 기존의 코드와의 호환성을 위해서(때문에) 제공되고 있습니다. 텍스트 출력을 생성하는 코드에서는, 새로운 `PrintWriter` 클래스를 사용할 필요가 있습니다. 새로운 `PrintWriter` 클래스에서는, 문자 인코딩을 지정하는 일도, 디폴트의 인코딩을 받아들일 수도 있습니다. `PrintWriter` 클래스에서는,`OutputStream` 객체를 받는 생성자 이 제공되어 디폴트의 인코딩을 사용하는 중간 `OutputStreamWriter` 객체가 작성됩니다.

#### 그 외의 클래스

다음의 생성자 및 메소드에서는, 바이트와 문자가 적절히 변환되지 않기 때문에, 사용하지 않는 것을 추천합니다.

`String` | `DataInputStream.readLine()`
`InputStream` | `Runtime.getLocalizedInputStream(InputStream)`
`OutputStream` | `Runtime.getLocalizedOutputStream(OutputStream)`
| `StreamTokenizer(InputStream)`
| `String(byte ascii[], int hibyte, int offset, int count)`
| `String(byte ascii[], int hibyte)`
`void` | `String.getBytes(int srcBegin, int srcEnd, byte dst[], int dstBegin)`

다음의 생성자 및 메소드가 추가되었습니다.

| `StreamTokenizer(Reader)`
`byte[]` | `String.getBytes()`
`void` | `Throwable.printStackTrace(PrintWriter)`

Copyright © 1997.1999 Sun Microsystems, Inc. All Rights Reserved. | Java Software