「ストリーム」の概念は、UNIX のパイプの概念に由来しています。 UNIX では、パイプはプログラムやプロセス間の通信を実装したり、周辺デバイスや外部ファイルなどの読み書きに使用される中断のないバイト ストリームです。パイプは、実際の I/O デバイスでのデータ処理の詳細を保護します。 ストリームにはソースと宛先が必要です。これは、コンピューター メモリの特定の領域、ディスク ファイル、またはインターネット上の URL などです。 流れの方向は重要です。流れの方向に応じて、流れは入力フローと出力フローの 2 つのカテゴリに分けられます。実際、入出力はメモリ用です。実際、ストリームのソースと宛先は、単純にバイトのプロデューサーとコンシューマーとみなすことができ、ストリームからデータを読み取るだけであれば、ソースを気にする必要はありません。入力ストリームの場合 出力ストリームは、その宛先を認識せずに、単にデータをストリームに書き込むこともできます。
a. ストリーム: 順序付けられたデータ シーケンスのセット。
b バイト ストリーム: データ ストリーム内の最小データ単位はバイトです。
c. 文字ストリーム: データ ストリーム内の最小のデータ単位は文字です。
1. java.io パッケージのクラスは 2 種類のストリームに対応します
ストリームの 1 つのタイプは、指定された場所 (ディスク ファイルやメモリ領域など) から直接読み取りまたは書き込みを行います。このタイプのストリームはノード ストリームと呼ばれ、他のストリームはフィルター ストリーム (パッケージング ストリーム) と呼ばれます。
ストリームのフィルタリング: 一部のストリームはファイルなどからバイトを受信でき、他のストリームはバイトをより有用なデータ型に結合できます。既存のストリームを別のストリームに渡し、2 つのストリームを結合するコンストラクターは、フィルターされたストリームと呼ばれます。フィルター入力ストリームは、他の入力ストリームを入力ソースとして使用することが多く、フィルターまたは処理の後、新しい入力ストリームの形式でユーザーに提供されます。フロー オブジェクトの作成に単一のクラスを使用することはほとんどありませんが、代わりに複数のオブジェクト (つまり、デコレータ デザイン パターン) をオーバーレイすることで必要な機能を提供します。
Java で一般的に使用される入力ストリームと出力ストリームは、実際には次の 4 つの抽象クラスから継承されます。
シングルバイトのInputStream、OutputStreamクラスに基づく(バイト指向のI/O)
ダブルバイト Unicode コード単位に基づく Reader および Writer クラス (文字指向 I/O)
入力ストリームが開かれると、プログラムは入力ストリームからデータをシリアルに読み取ることができます。入力ストリームからのデータの読み取り/書き込みプロセスは一般に次のようになります: ストリーム チャネルを開く --> 情報の読み取り/書き込み --> ストリーム チャネルを閉じる。
Java プラットフォームでは、ローカル プラットフォームの文字エンコーディング タイプを取得する方法が 2 つあります。
(a) System.getProperty("file.encoding");
(b) Charset cs=Charset.defaultCharset();
すべての入力ストリームと出力ストリームは、バイト (入力、出力) ストリームと文字 (入力、出力) ストリームに分けることができます。バイトを処理するものは主に (OutputStream/InputStream) 系列であり、文字を処理するものは主に (Reader/Write) 系列です。 ) シリーズ
2. バイト指向の入力ストリーム (InputStream シリーズ)。これらのクラスを FileInputStream オブジェクトに接続して、便利なインターフェイスを提供できます。
ByteArrayInputStream: メモリ内のバッファをInputStreamとして使用します。
StringBufferInputStream (java1.1 で非推奨): String オブジェクトを InputStream として使用し、基になる実装では StringBuffer を使用します。
FileInputStream: ファイルを InputStream として使用して、ファイル読み取り操作 (ファイル名、ファイル、FileDescriptor オブジェクト) を実装します。
PipedInputStream: 主にスレッドで (複数のプロセスのデータ ソースとして) 使用されるパイプの概念を実装します。
SequenceInputStream: 複数のInputStreamを1つのInputStreamに結合します。
バイト指向の出力ストリーム (OutputStream シリーズ) を FilterOutputStream オブジェクトに接続して、便利なインターフェイスを提供できます。
ByteArrayOutputStream: メモリ内にバッファを作成し、メモリ内のバッファに情報を保存し、バッファ サイズを初期化します (オプション)
FileOutputStream: 情報をファイルに保存します (ファイル名、ファイル、FileDescriptor)
PipedOutputStream: 主にスレッドで使用されるパイプの概念を実装します (マルチスレッドのデータの宛先を指定します)。
3.対応する(リーダー/ライター)シリーズ:
Reader:InputStream、アダプタInputStreamReaderに対応
Writer: OutputStream に対応し、アダプターは OutputStreamWriter です。
FileReader: FileOutputStream に対応
FileWriter: FileOurputStream に対応します
StringReader: 対応するクラスがありません
StringWriter: ByteArrayInputStream に対応
CharArrayReader: ByteArrayOutputStream に対応
CharArrayWriter: ByteArrayOutputStream に対応
PipedReader: PipedInputStream に対応
PipedWriter: PipedOutputStream に対応
4. 2 つの無制限ストリーム間の変換 (アダプター クラスを使用)
InputStreamReader および OutputStreamReader: バイト指向のストリームを文字指向のストリームに変換します。
InputStreamReader は、バイト ストリームから文字ストリームへのブリッジです。指定された文字セットを使用してバイトを読み取り、文字にデコードします。使用する文字セットは、名前で指定することも、明示的に指定することも、プラットフォームのデフォルトの文字セットを受け入れることもできます。
OutputStreamWriter は文字ストリームからバイト ストリームへのブリッジです。ストリームに書き込まれる文字は、指定された文字セットを使用してバイトにエンコードできます。使用する文字セットは名前で指定することも、明示的に指定することもできます。それ以外の場合は、プラットフォームのデフォルトの文字セットが受け入れられます。
5. FilterInputStream を通じて、InputStream からデータを読み取ります。
DataInputStream: ストリームから基本型 (int、char、long など) データを読み取ります。
BufferedInputStream: バッファを使用して、毎回実際の読み取り操作を実行する必要がないようにします。
LineNumberInputStream: 入力ストリームの行数を記録し、getLineNumber() と setLineNumber(int) を呼び出します。
PushbackInputStream: ほとんど使用されませんが、通常はコンパイラ開発に使用されます。
FilterOutputStream を介して OutputStream に書き込みます。
DataIOutputStream: 基本型(int、char、longなど)のデータを移植方法に応じてストリームに出力できます。
BufferedOutputStream: バッファを使用して、データを送信するたびに実際の書き込みを回避します。
PrintStream: フォーマットされた出力を生成します。DataOutputStream はデータ ストレージを処理し、PrintStream は表示を処理します。
6.ストリームの動作を変更する
BufferedOutputStream は FilterOutputStream のサブクラスですが、BufferedWriter は FilterWriter のサブクラスではありません (FilterWriter は抽象クラスであり、サブクラスはありません)。
DataInputStream に対応するクラスはありません。 readLine() を使用する場合は、代わりに BufferedReader を使用しない限り、DataInputStream を使用してください。
BufferedReader: BufferedInputStream に対応
LineNumberReader: LineNumberInputStream に対応します
PushBackReader: PushbackInputStream に対応
BufferedWrite: BufferedOutStream に対応します
PrintWrite:PrintStreamに対応
7. 独立したクラス: RandomAccessFile
このクラスは、DataInput インターフェイスと DataOutput インターフェイスの実装に加えて (DataInputStream と DataOutputStream もこれら 2 つのインターフェイスを実装します)、RandomAccessFile と他の I/O タイプは本質的に独立したクラスです。さまざまな動作があり、ファイル内で前後に移動でき、オブジェクトから直接派生します。
ファイルの読み取りおよび書き込み操作は、RandomAccessFile オブジェクトを通じて完了できます。
オブジェクトを生成するときに、開くファイルの性質を指定できます。r、読み取り専用、w、書き込み専用。
ファイル内の指定した場所に直接ジャンプできます
RandomAccessFile のほとんど (すべてではない) 機能が nio ストレージ マッピング ファイルに置き換えられました。