ホームページ  >  記事  >  Java  >  Java プログラミング IO フロー情報

Java プログラミング IO フロー情報

高洛峰
高洛峰オリジナル
2017-02-27 15:40:521148ブラウズ

この記事では、主に Java プログラミングの IO ストリーム情報の関連情報を詳しく紹介します。必要な友人は参照してください。

Java IO の詳細な説明:

Java ストリームの操作に関連するクラスまたはインターフェイス:

Java 编程之IO流资料

Java Stream クラス図の構造:

Java 编程之IO流资料

ストリームの概念と役割

ストリームとは、開始点と終了点を持つ連続したバイトの集合であり、データ送信の一般用語または要約です。つまり、2 つのデバイス間のデータ伝送はストリームと呼ばれます。ストリームの本質はデータ伝送であり、データ伝送の特性に応じて、より直感的なデータ操作を容易にするためにさまざまなカテゴリに抽象化されます。

IOストリームの分類

  • 処理されるデータのさまざまなタイプに従って、文字ストリームとバイトストリームに分けられます

  • 異なるデータフローの方向に従って、次のように分けられます:入力ストリームと出力ストリーム

キャラクターストリームとバイトストリーム

キャラクターストリームの起源: データエンコーディングの違いにより、文字に対して効率的な操作を実行するストリームオブジェクトが存在します。実際の本質は、バイトストリームに基づいて読み取るときに、指定されたコードテーブルをチェックすることです。 バイトストリームと文字ストリームの違い:

  • 読み取りと書き込みの単位が異なります。バイトストリームはバイト(8ビット)単位で、文字ストリームは文字単位で文字がコードに従ってマッピングされます。テーブルであり、一度に複数のバイトを読み取ることができます。

  • 処理オブジェクトは異なります。バイト ストリームはすべてのタイプのデータ (写真、avi など) を処理できますが、文字ストリームは文字タイプのデータのみを処理できます。

結論: プレーンテキストデータを扱っている限り、文字ストリームの使用を優先してください。 それ以外の場合は、バイト ストリームが使用されます。

入力ストリームと出力ストリーム

入力ストリームのみ読み取り可能、出力ストリームは書き込みのみ可能です。プログラムは、送信するデータのさまざまな特性に応じて異なるストリームを使用する必要があります。

Java IO ストリーム オブジェクト

1. 入力バイト ストリームInputStreamIO の入力バイト ストリームの継承図は、次のことがわかります。入力バイトストリームは抽象クラスです。

  1. ByteArrayInputStream、StringBufferInputStream、FileInputStream は、それぞれ Byte 配列、StringBuffer、ローカル ファイルからデータを読み取ります。 PipedInputStream は、他のスレッドと共有されているパイプからデータを読み取ります。Piped に関する知識は後ほど別途紹介します。

  2. ObjectInputStream と FilterInputStream のすべてのサブクラスは、デコレーション ストリーム (デコレーター パターンの主役) です。 2. 出力バイト ストリーム OutputStream

  3. IO における出力バイト ストリームの継承図を上の図に示します。

    OutputStream はすべての出力バイト ストリームの親クラスであり、次のとおりです。抽象クラス。 ByteArrayOutputStream と FileOutputStream は 2 つの基本的なメディア ストリームで、それぞれバイト配列とローカル ファイルにデータを書き込みます。 PipedOutputStream は、他のスレッドと共有されるパイプにデータを書き込みます。FilterOutputStream のすべてのサブクラスは装飾ストリームです。 3. バイトストリームの入出力の対応

写真の青い部分が主な対応部分、赤い部分が非対応部分です。

紫色の点線は、これらのストリームが通常一緒に使用されることを示します

。上の図からわかるように、Java IO のバイト ストリームは非常に対称的です。 「存在と合理性」 これらのバイト ストリーム内の非対称クラスのいくつかを見てみましょう。 Java 编程之IO流资料

1.LineNumberInputStream は主にストリームからのデータの読み込みを完了し、対応する行番号を取得します。いつどこで分岐するかはクラス変更によって能動的に決定され、元にはそのような行番号はありません。出力部分には対応する部分はありません。LineNumberOutputStream を自分で作成できます。最初に書き込まれるときは、改行が発生するたびに行番号が次の行に追加されます。大丈夫のようです。さらに不人気のようです。

2. PushbackInputStream の機能は、最後のバイトをチェックし、満たされていない場合はバッファーに入れることです。主にコンパイラの構文および字句解析部分で使用されます。出力部分の BufferedOutputStream もほぼ同様の機能を実装しています。

3.StringBufferInputStream は非推奨になっており、InputStream 部分に表示すべきではありません。これは、主に String が文字ストリームのスコープに属している必要があるためです。放棄されていますが、出力部分にはもちろん必要ありません。バージョンの下位互換性を維持するためだけに存在することも許可されています。

4.SequenceInputStreamは、2つ以上の入力ストリームを1つの入力ストリームとして順番に読み込むツールクラスと考えることができます。これは IO パッケージから完全に削除でき、IO パッケージの構造にはまったく影響しませんが、より「純粋な」、つまり純粋な Decorator モードになります。

5.PrintStream は補助ツールとして考えることもできます。主に他の出力ストリームまたは FileInputStream にデータを書き込むことができ、その内部実装は依然としてバッファリングされています。本質的に、これは他のストリームを包括的に適用するためのツールにすぎません。 IO パッケージをキックアウトすることもできます。 System.out と System.out は PrintStream のインスタンスです。

4. 文字入力ストリーム Reader

上の継承図からわかるように:

1.Reader はすべての入力文字ストリームの親クラスであり、抽象クラスです。

2.CharReader と StringReader は、それぞれ Char 配列と String からデータを読み取ります。 PipedReader は、他のスレッドと共有されているパイプからデータを読み取ります。

3.BufferedReader は明らかにデコレータであり、それとそのサブクラスは他の Reader オブジェクトを装飾する役割を果たします。

4.FilterReader は、すべてのカスタム固有の装飾ストリームの親クラスであり、そのサブクラス PushbackReader は Reader オブジェクトを装飾し、行番号を追加します。

5.InputStreamReaderは、バイトストリームと文字ストリームを接続するブリッジです。バイトストリームを文字ストリームに変換します。 FileReader はこの機能を実現するためによく使われるツールクラスと言えますが、そのソースコードでは明らかに FileInputStream を Reader に変換するメソッドが使用されています。このクラスから特定のトリックを得ることができます。 Readerの各クラスの目的や使用方法は基本的にInputStreamと同様です。 ReaderとInputStreamの間には後ほど対応関係が生まれます。 5. 文字出力ストリーム Writer

上記の関係図からわかるように:

1.Writer はすべての出力文字ストリームの親クラスであり、抽象クラスです。

2.CharArrayWriter と StringWriter は、それぞれ Char 配列と String にデータを書き込みます。 PipedWriter は、他のスレッドと共有されるパイプにデータを書き込みます。

3. BufferedWriter は、Writer にバッファリング機能を提供するデコレーターです。

4.PrintWriter と PrintStream は非常に似ており、機能と用途も非常に似ています。

5. OutputStreamWriter は、OutputStream から Writer への変換のブリッジです。そのサブクラス FileWriter は、実際にはこの関数を実装する特定のクラスです (詳細については、SourceCode を参照してください)。機能と使用法は OutputStream と非常に似ており、対応する図は後で示します。 6. 文字ストリームの入出力の対応

Java 编程之IO流资料

7. 文字ストリームとバイトストリームの変換

変換ストリームの特徴:

  1. 文字ストリームとバイトストリームの橋渡しです

  2. 読み取ったバイトデータを、指定したエンコーディングで文字に変換できます

  3. 読み取った文字データを、指定したエンコーディングでバイトに変換できます

変換ストリームはいつ使用しますか?

  1. バイトと文字の間の変換アクションがある場合;

  2. ストリーム操作のデータをエンコードまたはデコードする必要がある場合。

特定のオブジェクトの実施形態:

  1. InputStreamReader:バイトから文字へのブリッジ

  2. OutputStreamWriter:文字からバイトへのブリッジ

これらの 2 つのストリーム オブジェクトは文字システム メンバー内にあり、変換がある関数であり、それら自体が文字ストリームであるため、構築中にバイト ストリーム オブジェクトを渡す必要があります。

8.Fileクラス

Fileクラスは、ファイルシステム内のファイルとフォルダーをカプセル化するオブジェクトであり、オブジェクトの概念を通じてファイルとフォルダーを操作できます。 File クラスは、ファイル名、ファイル長、最終変更時刻、読み取り可能かどうか、現在のファイルのパス名の取得、指定されたファイルが存在するかどうかの判断、ファイル リスト内のファイル リストの取得など、ファイルまたはディレクトリのさまざまなメタデータ情報を保存します。現在のディレクトリ、ファイルやディレクトリの作成、削除など。

9.RandomAccessFile クラス

このオブジェクトは、バイト ストリームをカプセル化し、内部ポインタを使用して文字配列内の文字を操作するバッファ (文字配列) もカプセル化します。データ。 このオブジェクトの特徴:

このオブジェクトはファイルのみを操作できるため、コンストラクターは次の 2 種類のパラメーターを受け取ります。このオブジェクトは、ファイルの読み取りと書き込みの両方ができます。オブジェクトをインスタンス化するときに、操作モード (r、rw) を指定できます

注: このオブジェクトをインスタンス化するとき、操作対象のファイルが存在しない場合は、ファイルが存在します。ファイルが存在し、データを書き込む場所が指定されていない場合は、最初から書き込まれます。つまり、元のコンテンツが上書きされます。 マルチスレッドのダウンロードや、複数のスレッドによるファイルへのデータの同時書き込みに使用できます。

読んでいただきありがとうございます。お役に立てれば幸いです。このサイトをサポートしていただきありがとうございます。

Java プログラミングの IO フロー情報に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。