"안녕하세요, 아미고! 이제 InputStreamOutputStream 이라는 두 가지 인터페이스에 대해 말씀드리겠습니다 . 그것들은 추상 클래스로 선언되지만 자세히 살펴보면 본질적으로 인터페이스라는 것을 알 수 있습니다 . 거의 모든 메서드는 추상입니다. 예외는 다음과 같습니다. 몇 가지 중요하지 않은 방법이 있습니다. 이전에 고려한 " 경호원 " 과 매우 유사합니다 ."

이들은 매우 흥미로운 인터페이스입니다. 지금은 의도적으로 그것들을 인터페이스 라고 부르겠습니다 . 왜 우리가 그것들이 필요한지 이해하실 것입니다. 그런 다음 이들이 실제로 추상 클래스인 이유에 대해 이야기하겠습니다.

"좋아요. 그렇다면 이 인터페이스는 무엇입니까?"

"더 고민하지 않고 말씀드리겠습니다."

Java에는 « 스트림 »이라는 흥미로운 기능이 있습니다. 스트림은 매우 단순한 엔터티입니다. 그리고 그 단순성은 데이터를 교환하는 매우 강력한 방법의 핵심입니다. 스트림에는 읽기용 스트림과 쓰기용 스트림 의 두 가지 유형이 있습니다 .

이미 짐작하셨겠지만 쓰기를 위해 데이터를 스트림 에 쓸 수 있습니다 . 이를 위한 쓰기 방법 이 있습니다 . 읽기 위해 스트림 에서 데이터를 읽을 수 있습니다 . 이를 위한 read () 메서드 가 있습니다 .

InputStream  은 읽기를 지원하는 스트림의 인터페이스입니다. 그것은 다음 능력을 정의합니다: «나에게서 바이트를 읽을 수 있습니다».

마찬가지로 OutputStream 은 쓰기를 지원하는 스트림의 인터페이스입니다. 그것은 다음 능력을 정의합니다: «bytes can be write to me».

"그게 다야?"

"대단히 그렇습니다. 하지만 요점은 Java에 InputStreamOutputStream 과 함께 작동할 수 있는 많은 클래스 가 있다는 것입니다. 예를 들어 디스크에서 파일을 읽고 그 내용을 화면에 표시하려고 합니다. 이보다 더 쉬울 수는 없습니다."

디스크의 파일에서 데이터를 읽기 위해 InputStream 인터페이스를 구현하는 특수 FileInputStream 클래스가 있습니다 . 이 데이터를 다른 파일에 쓰시겠습니까? 이를 위해 OutputStream 인터페이스를 구현하는 FileOutputStream 클래스가 있습니다 . 다음 코드는 한 파일에서 다른 파일로 데이터를 복사하기 위해 수행해야 하는 작업을 보여줍니다.

암호
public static void main(String[] args) throws IOException
{
 InputStream inStream = new FileInputStream("c:/source.txt");
 OutputStream outStream = new FileOutputStream("c:/result.txt");

 while (inStream.available() > 0)
 {
  int data = inStream.read(); //read one byte from the input stream
  outStream.write(data); //write that byte to the other stream.
 }

 inStream.close(); //close the streams
 outStream.close();
}

클래스를 작성하고  여기에 InputStream  및  OutputStream 기능을 추가했다고 상상해 보십시오.

이러한 인터페이스를 제대로 구현했다면 이제 클래스의 인스턴스를 파일에 저장하거나 파일에서 읽을 수 있습니다. read 메서드를 사용하여 내용을 읽기만 하면 됩니다 . 또는 개체를 만들고 write 메서드를 사용하여 파일 내용을 작성하여 파일에서 로드할 수 있습니다.

"예를 들어?"

"확신하는."

암호 설명
class MyClass
{
private ArrayList<Integer> list;
}
간단히 하기 위해 우리 클래스에 정수를 포함하는 ArrayList라는 하나의 개체가 포함되어 있다고 상상해 보십시오.

이제 읽기 및 쓰기 메서드를 추가합니다.

암호 설명
class MyClass
{
private ArrayList<Integer> list;
public void write(int data)
{
list.add(data);
}
public int read()
{
int first = list.get(0);
list.remove(0);
return first;
}

public int available()
{
return list.size();
}
}
이제 우리 클래스는 list 의 전체 내용을 순차적으로 읽을 수 있도록 하는 read 메서드를 구현합니다 .

그리고 목록에 값을 쓸 수 있는 write 메소드가 있습니다.

물론 이것은 InputStream 및 OutputStream 인터페이스의 구현은 아니지만 매우 유사합니다.

"예, 알겠습니다. 그러면 그러한 개체의 내용을 파일에 어떻게 저장합니까?"

"예를 들어 보겠습니다."

파일에 MyClass 객체 쓰기
public static void main(String[] args)
{
 MyClass myObject = new MyClass();
 OutputStream outStream = new FileOutputStream ("c:/my-object-data.txt");

 while (myObject.available() > 0)
 {
  int data = myObject.read(); //read one int from the input stream
  outStream.write(data); //write that int to the other stream.
 }

 outStream.close();
}
파일에서 MyClass 객체 읽기
public static void main(String[] args)
{
 InputStream inStream = new FileInputStream("c:/my-object-data.txt");
 MyClass myObject = new MyClass();

 while (inStream.available() > 0)
 {
  int data = inStream.read(); //read one int from the input stream
  myObject.write(data); //write that int to the other stream.
 }

 inStream.close(); //close the streams
}

"이런 몰리! 정말 InputStream/OutputStream으로 작업하는 것과 매우 유사합니다. 스트림이 훌륭합니다!"

"다음 몇 가지!"