この記事では、Java の文字ストリームとバイト ストリームの違いを説明する関連情報を主に紹介します。必要な方は参考にしてください。
Java の文字ストリームとバイト ストリームの違い
1.ストリーム
Java のストリームはバイト シーケンスを抽象化したものです。水道管を想像できますが、水道管を流れる水はもはや水ではなく、バイト シーケンスです。水の流れと同様に、Java のストリームにも「流れの方向」があります。通常、バイトのシーケンスを読み取ることができるオブジェクトは入力ストリームと呼ばれ、バイトのシーケンスを書き込むことができるオブジェクトは入力ストリームと呼ばれます。 .出力ストリーム。
2. バイトストリームJava におけるバイトストリーム処理の最も基本的な単位は、通常、バイナリデータの処理に使用されます。 Java の 2 つの最も基本的なバイト ストリーム クラスは、InputStream と OutputStream で、それぞれ基本的な入力バイト ストリームと出力バイト ストリームを表します。 InputStream クラスと OutputStream クラスは両方とも
抽象クラス ですが、実際の使用では、通常、Java クラス ライブラリ で提供される一連のサブクラスを使用します。 Java でバイト ストリームを紹介する例として、InputStream クラスを取り上げます。InputStream クラスは、バイト ストリームからバイトを読み取るための基本的なメソッド read を定義します。このメソッドの定義は次のとおりです。 public abstract int read() throws IOException;
public int read(byte b[]) throws IOException { return read(b, 0, b.length); }
これは、read オーバーロード メソッドの別のバージョンを呼び出しているので、フォローアップしてみましょう:
public int read(byte b[], int off, int len) throws IOException { if (b == null) { throw new NullPointerException(); } else if (off < 0 || len < 0 || len > b.length - off) { throw new IndexOutOfBoundsException(); } else if (len == 0) { return 0; } int c = read(); if (c == -1) { return -1; } b[off] = (byte)c; int i = 1; try { for (; i < len ; i++) { c = read(); if (c == -1) { break; } b[off + i] = (byte)c; } } catch (IOException ee) { } return i; }
上記のコードから、実際には read(byte[ ]) メソッドもあることがわかります。ループ内で read() メソッドを呼び出すことでバイト配列を「一度に」読み取るため、基本的にこのメソッドはメモリ バッファを使用しません。メモリ バッファを使用して読み取り効率を向上するには、BufferedInputStream を使用する必要があります。
3. 文字ストリームJava における文字ストリーム処理の最も基本的な単位は Unicode コード単位 (サイズ 2 バイト) で、通常はテキスト データの処理に使用されます。いわゆる Unicode コード要素は、0x0000 ~ 0xFFFF の範囲の Unicode コード単位です。上記の範囲の各数値は 1 つの文字に対応します。Java の String 型は、デフォルトで Unicode 規則に従って文字をエンコードし、メモリに格納します。ただし、メモリ内のストレージとは異なり、ディスクに保存されたデータには通常、さまざまなエンコード方式が使用されます。異なるエンコード方法を使用すると、同じ文字でも異なるバイナリ表現になります。実際、文字ストリームは次のように動作します:
出力文字ストリーム: ファイルに書き込まれる文字列 (実際には Unicode コード要素の列) を、指定されたエンコード方式でバイト列に変換して書き込みます。ファイル内;
このプロセスの理解を深めるために、サンプルコードは次のとおりです:
import java.io.FileWriter; import java.io.IOException; public class FileWriterDemo { public static void main(String[] args) { FileWriter fileWriter = null; try { try { fileWriter = new FileWriter("demo.txt"); fileWriter.write("demo"); } finally { fileWriter.close(); } } catch (IOException e) { e.printStackTrace(); } } }
WinHex デモ.txt の内容を表示します:
上の図からわかるように、私たちが作成した「デモ」は「64 65 6D 6F」としてエンコードされていますが、エンコード方法は異なります。実際、これを指定しない場合、書き込む文字のエンコードにはオペレーティング システムのデフォルトの文字エンコード方法が使用されます。文字ストリームは実際には、出力する前に Unicode コード要素シーケンスから対応するエンコード方式のバイト シーケンスへの変換を完了する必要があるため、メモリ バッファを使用して変換されたバイト シーケンスを保存し、変換が完了するまで待機します。 . ディスクファイルに一緒に書き込まれます。
4. 文字ストリームとバイトストリームの違い上記の説明の後、バイト ストリームと文字ストリームの主な違いは次の点に反映されていることがわかります:
バイト ストリーム操作の基本単位はバイトです。文字ストリーム操作の基本単位は Unicode コードです。要素。
バイトストリームはデフォルトではバッファを使用しません。文字ストリームはバッファを使用します。
バイト ストリームは通常、バイナリ データを処理するために使用されます。実際、あらゆる種類のデータを処理できますが、Unicode コード要素の直接の書き込みや読み取りはサポートされておらず、通常はテキスト データを処理します。 Unicode コード要素を取得します。
以上がJava の文字ストリームとバイト ストリームの違いの詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。