1. OutputStream클래스

우리는 최근에 입력 스트림을 탐색했습니다. 이제 출력 스트림에 대해 이야기할 시간입니다.

OutputStream클래스는 바이트 출력을 지원하는 모든 클래스의 상위 클래스입니다. 이것은 자체적으로는 아무 것도 수행하지 않는 추상 클래스이지만 모든 경우에 대한 하위 클래스가 있습니다.

매우 복잡하게 들립니다. 간단히 말해서 이 클래스는 예를 들어 문자나 다른 데이터 유형이 아닌 바이트에서 작동합니다. 그리고 그것이 추상적이라는 사실은 우리가 일반적으로 그것을 사용하지 않고 그 자손 클래스 중 하나를 사용한다는 것을 의미합니다. 예를 들어, FileOutputStream등등.

그러나 OutputStream수업으로 돌아갑니다. 이 클래스에는 모든 자손 클래스가 구현해야 하는 메서드가 있습니다. 주요 내용은 다음과 같습니다.

행동 양식 설명
void write(int b)
int스트림에 1바이트( 가 아님)를 씁니다 .
void write(byte[] buffer)
스트림에 바이트 배열을 씁니다.
void write(byte[] buffer, off, len)
바이트 배열의 일부를 스트림에 씁니다.
void flush()
버퍼에 저장된 모든 데이터를 스트림에 씁니다.
void close()
스트림을 닫습니다

를 상속하는 클래스의 개체를 만들 때 InputStream일반적으로 데이터를 읽는 소스 개체를 지정합니다 InputStream. 를 상속하는 클래스의 개체를 만들 때 OutputStream일반적으로 데이터가 기록될 대상 개체 또는 스트림도 지정합니다.

클래스의 모든 메서드를 간단히 살펴보겠습니다 OutputStream.

write(int b)방법

int이 메서드는 출력 스트림에 1바이트( 가 아님)를 씁니다 . 전달된 값은 바이트로 캐스팅되고 int의 처음 세 바이트는 버려집니다.

write(byte[] buffer)방법

지정된 바이트 배열을 출력 스트림에 씁니다. 그게 다야.

write(byte[] buffer, int offset, int length)방법

전달된 바이트 배열의 일부를 출력 스트림에 씁니다. 오프셋 변수는 배열의 첫 번째 요소의 인덱스를 나타내며 length기록할 부분 집합의 길이입니다.

flush()방법

flush()메서드는 현재 스트림에 잠재적으로 버퍼링된 모든 데이터를 대상 스트림에 기록하는 데 사용됩니다. 이는 버퍼링 및/또는 체인에 배열된 여러 스트림 개체를 사용할 때 관련이 있습니다.

close()방법

기록되지 않은 모든 데이터를 대상 개체에 씁니다. close()블록 을 사용하는 경우 메서드를 호출할 필요가 없습니다 try-with-resources.

파일 복사의 예

암호 메모
String src = "c:\\projects\\log.txt";
String dest = "c:\\projects\\copy.txt";

try(FileInputStream input = new FileInputStream(src);
FileOutputStream output = new FileOutputStream(dest))
{
   byte[] buffer = new byte[65536]; // 64Kb
   while (input.available() > 0)
   {
      int real = input.read(buffer);
      output.write(buffer, 0, real);
   }
}



InputStream파일에서 읽기
OutputStream위해 파일에 쓰기 위해

데이터를 읽을 버퍼
스트림에 데이터가 있는 한

버퍼로 데이터
읽기 버퍼에서 두 번째 스트림으로 데이터 쓰기

2. Writer클래스

클래스 는 클래스 Writer와 정확히 동일 OutputStream하지만 한 가지 차이점이 있습니다. char바이트 대신 문자( )로 작동합니다.

이것은 추상 클래스입니다. Writer클래스의 개체를 만들 수 없습니다. 주요 목표는 수백 개의 하위 클래스에 대한 공통 상위 클래스가 되고 문자 스트림 작업을 위한 공통 메서드를 제공하는 것입니다.

클래스 의 메서드 Writer(및 모든 하위 클래스):

행동 양식 설명
void write(int b)
int스트림에 하나의 문자( 가 아님)를 씁니다 .
void write(char[] buffer)
스트림에 문자 배열을 씁니다.
void write(char[] buffer, off, len)
문자 배열의 일부를 스트림에 씁니다.
void write(String str)
스트림에 문자열을 씁니다.
void write(String str, off, len)
문자열의 일부를 스트림에 씁니다.
void flush()
버퍼에 저장된 모든 데이터를 스트림에 씁니다.
void close()
스트림을 닫습니다

메소드는 클래스의 메소드와 매우 유사 OutputStream하지만 바이트 대신 문자로 작동합니다.

방법 설명:

write(int b)방법

이 메서드는 출력 스트림에 단일 문자( char— 아님 )를 씁니다. int전달된 값은 로 캐스트되고 char처음 두 바이트는 버려집니다.

write(char[] buffer)방법

지정된 문자 배열을 출력 스트림에 씁니다.

write(char[] buffer, int offset, int length)방법

전달된 문자 배열의 일부를 출력 스트림에 씁니다. 변수 offset는 배열의 첫 번째 요소의 인덱스를 나타내며 length기록할 하위 집합의 길이입니다.

write(String str)방법

주어진 문자열을 출력 스트림에 씁니다.

write(String str, int offset, int length)방법

주어진 문자열의 일부를 출력 스트림에 씁니다. 문자열은 문자 배열로 변환됩니다. 변수 offset는 배열의 첫 번째 요소의 인덱스를 나타내며 length기록할 하위 집합의 길이입니다.

flush()방법

flush()메서드는 현재 스트림에 잠재적으로 버퍼링된 모든 데이터를 대상 스트림에 기록하는 데 사용됩니다. 이는 버퍼링 및/또는 체인에 배열된 여러 스트림 개체를 사용할 때 관련이 있습니다.

close()방법

기록되지 않은 모든 데이터를 대상 개체에 씁니다. close()블록 을 사용하는 경우 메서드를 호출할 필요가 없습니다 try-with-resources.

텍스트 파일을 복사하는 프로그램의 예:

암호 메모
String src = "c:\\projects\\log.txt";
String dest = "c:\\projects\\copy.txt";

try(FileReader reader = new FileReader(src);
FileWriter writer = new FileWriter(dest))
{
   char[] buffer = new char[65536]; // 128Kb
   while (reader.ready())
   {
      int real = reader.read(buffer);
      writer.write(buffer, 0, real);
   }
}



Reader파일에서 읽기
Writer위해 파일에 쓰기 위해

데이터를 읽을 버퍼
스트림에 데이터가 있는 한

버퍼로 데이터
읽기 버퍼에서 두 번째 스트림으로 데이터 쓰기

StringWriter수업

Writer클래스를 상속하는 또 다른 흥미로운 클래스가 있습니다 StringWriter. 여기에는 변경 가능한 문자열인 StringBuffer객체가 포함됩니다. 그리고 개체에 무언가를 "쓸" 때마다 StringWriter텍스트는 단순히 내부 버퍼에 추가됩니다.

예:

암호 메모
StringWriter writer = new StringWriter();
writer.write("Hello");
writer.write(String.valueOf(123));

String result = writer.toString();
대상 문자 스트림( StringWriter)이 생성됩니다.
문자열이 내부 버퍼에 기록됩니다. StringWriter
문자열이 내부 버퍼에 기록됩니다. StringWriter

객체의 내용을 문자열로 변환합니다.

이 경우 StringWriter클래스는 기본적으로 클래스에 대한 래퍼 StringBuffer이지만 StringWriter클래스는 스트림 클래스의 후손 Writer이며 스트림 개체 체인에서 사용할 수 있습니다. 이것은 실제로 매우 유용한 속성입니다.