「こんにちは、アミーゴ! 今日は入力/出力ストリームについて説明します。このトピックは数日前に取り上げましたが、今日は徹底的に調査します。入力/出力ストリームは 4 つのカテゴリに分類されます。」
1) ストリームは方向に従って分割されます:入力ストリームと出力ストリーム
2) ストリームは、データ型に応じて、バイトを扱うストリームと文字を扱うストリームに分類されます。
ここでは、これらの部門を表に示します。
入力ストリーム | 出力ストリーム | |
---|---|---|
バイトで動作します | 入力ストリーム | 出力ストリーム |
キャラクターを使った作品 | 読者 | ライター |
オブジェクトがInputStreamインターフェイスを実装している場合、オブジェクトからバイトを順次読み取る機能がサポートされます。
オブジェクトがOutputStreamインターフェイスを実装している場合、オブジェクトにバイトを順次書き込む機能がサポートされます。
オブジェクトがReaderインターフェイスを実装している場合、オブジェクトから文字 (char) を順番に読み取る機能がサポートされます。
オブジェクトがWriterインターフェイスを実装している場合、オブジェクトに文字 (char) を連続的に書き込む機能がサポートされます。
出力ストリームはプリンターのようなものです。ドキュメントをプリンターに出力できます。データを出力ストリームに出力できます。
入力ストリームは、スキャナー、あるいはコンセントにたとえることができます。スキャナーを使用すると、文書をコンピューターに取り込むことができます。あるいは、コンセントに差し込んでそこから電気を受け取ることもできます。入力ストリームからデータを受信できます。
「どこで使われているの?」
「これらのクラスは Java のあらゆる場所で使用されます。私たちのおなじみのSystem.in は、 Systemクラス内で名前が付けられた静的なInputStream変数です。」
「マジで?! ということは、これまでずっと InputStream を使ってきたのに、それに気づいていませんでした。System.out もストリームなのでしょうか?」
「はい、System.out はSystem クラスの静的なPrintStream ( OutputStreamの子孫) 変数です。」
「私がずっとストリームを使っていたのに、それすら知らなかったと言いたいのですか?」
「はい。それは、これらのストリームがいかに便利であるかを示しています。ただ 1 つ入手して使用するだけです。」
「しかし、System.in についてはそうは言えません。常に BufferedReader または InputStreamReader を追加する必要がありました。」
「そうなんです。でも、それには理由もあったんです」
データ型は数多くあり、それらを操作する方法も数多くあります。そのため、すべてをほぼ同じ方法で実行したにもかかわらず、標準 I/O クラスの数は急速に増加しました。この複雑さを回避するために、Java 開発者は抽象化の原理を使用し、クラスを多くの小さな部分に分割しました。
ただし、必要に応じて、これらの部分を一貫した方法で接続し、非常に複雑な機能を得ることができます。この例を見てください。
文字列をコンソールに出力します |
|
コンソール出力ストリームを別の変数に保存します。 文字列をストリームに出力します。 |
|
メモリ内に動的 (拡張型) バイト配列を作成します。 これを新しい出力ストリーム (PrintStream オブジェクト) に接続します。 文字列をストリームに出力します。 |
|
「正直に言うと、これはレゴのセットのようなものです。ただ、このコードが何をしているのかは私にはわかりません。」
「今は心配しないでください。すべては時が来れば解決します。」
これは覚えておいていただきたいことです。クラスが OutputStream インターフェイスを実装している場合、それにバイトを書き込むことができます。コンソールにデータを出力するのとほぼ同じです。それを使って何をするかがビジネスです。私たちの「レゴキット」では、個々のパーツの用途は気にしません。パーツの豊富な選択により、このような素晴らしいものを構築できるという事実を重視しています。
「わかりました。それではどこから始めましょうか?」
GO TO FULL VERSION