「こんにちは、アミーゴ! 次に、2 つのインターフェイスについて説明します。InputStreamOutputStreamです。これらは抽象クラスとして宣言されていますが、より深く掘り下げると、本質的にインターフェイスであることがわかります。これらのメソッドのほとんどすべては抽象です。いくつかの重要ではない方法。それらは、以前に検討した「ボディガード」に非常によく似ています。

これらは非常に興味深いインターフェースです。現時点では、これらを意図的にインターフェースと呼ぶことにします。そうすることで、なぜそれらが必要なのかが理解できるでしょう。次に、それらが実際に抽象クラスである理由について説明します。

「わかりました。それで、これらのインターフェイスは何ですか?」

「早速お話します。」

Java には「ストリーム」と呼ばれる興味深い機能があります。ストリームは非常に単純なエンティティです。そしてそのシンプルさが、データを交換する非常に強力な方法の鍵となります。ストリームには、読み取り用のストリームと書き込み用のストリームの 2 種類があります。

おそらくすでにご想像のとおり、書き込み用のストリームにデータを書き込むことができます。これには書き込みメソッドがあります。読み取り用のストリームからデータを読み取ることができます。これにはread () メソッドがあります。

InputStream は 、読み取りをサポートするストリームのインターフェイスです。これは次の能力を定義します: «バイトを読み取ることができます»。

同様に、OutputStream である OutputStream は、書き込みをサポートするストリームのインターフェイスです。これは、「バイトを私に書き込むことができる」という能力を定義します。

"それでおしまい?"

「ほぼそのとおりです。しかし、重要なのは、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 という 1 つのオブジェクトが含まれていると想像してください。

次に、読み取りメソッドと書き込みメソッドを追加します。

コード 説明
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();
}
}
これで、クラスはreadメソッドを実装し、 listの内容全体を順番に読み取ることができるようになります。

そして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 の操作と非常によく似ています。ストリームは素晴らしいです!」

"そしてその後、いくつかの!"