"안녕하세요, Amigo! 오늘 우리는 InputStreamOutputStream이 어떻게 작동하는지 다시 한 번 파고들 것입니다 . 초기 설명은 실제로 약간 단순했습니다. 이들은 인터페이스가 아닙니다. 추상 클래스이며 몇 가지 구현된 메서드도 있습니다. 그들이 가지고 있는 방법을 살펴봅시다:"

InputStream 메서드 메서드가 수행하는 작업
int read(byte[] buff);
이 메서드는 버퍼가 가득 찰 때까지 또는 소스에 더 이상 읽을 바이트가 없을 때까지 즉시 바이트 블록을 버퍼 ( byte array ) 로 읽습니다. 이 메서드는 실제로 읽은 바이트 수를 반환합니다(배열 길이보다 작을 수 있음).
int read();
이 메서드는 1바이트를 읽고 반환합니다. 결과는 모양을 위해 int로 확장됩니다. 더 이상 읽을 바이트가 없으면 메서드는 -1을 반환합니다.
int available();
이 메서드는 읽지 않은(사용 가능한) 바이트 수를 반환합니다.
void close();
이 방법은 스트림을 «닫습니다». 스트림 작업을 마치면 이것을 호출합니다.
그런 다음 개체는 파일 등을 닫는 데 필요한 관리 작업을 수행합니다.
이 시점에서 스트림에서 더 이상 데이터를 읽을 수 없습니다.

"그래서 우리는 단일 바이트뿐만 아니라 전체 블록도 읽을 수 있습니까?"

"정확히."

"전체 블록도 작성할 수 있습니까?"

"예, 확인해 보세요."

OutputStream 메서드 메서드가 수행하는 작업
void write(int c);
이 메서드는 1바이트를 씁니다. int 유형은 바이트로 좁혀집니다. 여분의 부분은 단순히 버려집니다.
void write(byte[] buff);
이 메서드는 바이트 블록을 씁니다.
void write(byte[] buff, int from, int count);
이 메서드는 바이트 블록의 일부를 씁니다 . 바이트 배열이 완전히 채워지지 않은 경우에 사용됩니다.
void flush();
스트림이 아직 기록되지 않은 데이터를 내부적으로 저장하고 있는 경우 이 메서드는 데이터를 강제로 기록합니다.
void close();
이 방법은 스트림을 «닫습니다». 스트림 작업을 마치면 이것을 호출합니다.
그런 다음 개체는 파일 등을 닫는 데 필요한 관리 작업을 수행합니다. 더 이상 스트림에 데이터를 쓸 수 없으며 플러시가 자동으로 호출됩니다.

"단일 바이트가 아니라 한 번에 전체 블록을 읽는다면 파일 복사 코드는 어떻게 될까요?"

"흠. 이런 식으로:"

디스크에 파일 복사
public static void main(String[] args) throws Exception
{
 //Create a stream to read bytes from a file
 FileInputStream inputStream = new FileInputStream("c:/data.txt");
 //Create a stream to write bytes to a file
 FileOutputStream outputStream = new FileOutputStream("c:/result.txt");

  byte[] buffer = new byte[1000];
 while (inputStream.available() > 0) //as long as there are unread bytes
 {
  //Read the next block of bytes into buffer, and store the actual number of bytes read in count.
  int count = inputStream.read(buffer);
  outputStream.write(buffer, 0, count); //Write a block (part of a block) to the second stream
 }

 inputStream.close(); //Close both streams. We don't need them any more.
 outputStream.close();
}

"버퍼에 대한 모든 것을 이해하지만 이 카운트 변수는 무엇입니까?"

"파일에서 최신 데이터 블록을 읽을 때 예를 들어 1000바이트가 아닌 328바이트를 얻을 수 있습니다. 따라서 데이터를 쓸 때 전체 블록을 쓰는 것이 아니라 첫 번째 328바이트 바이트."

마지막 블록을 읽을 때 read 메서드는 실제로 읽은 바이트 수를 반환합니다. 328을 얻을 때 마지막 블록을 제외하고 블록을 읽을 때마다 1000입니다.

따라서 블록을 작성할 때 버퍼의 모든 바이트를 작성하지 않고 328(즉, count 변수에 저장된 값)만 작성해야 함을 나타냅니다.

"이제 모든 게 명확해졌어. 고마워, 엘리."