ホームページ  >  記事  >  Java  >  Java の文字ストリームとバイト ストリームの違いの詳細な紹介

Java の文字ストリームとバイト ストリームの違いの詳細な紹介

黄舟
黄舟オリジナル
2017-03-25 10:33:322310ブラウズ

この記事では、Java の文字ストリームとバイト ストリームの違いを説明する関連情報を主に紹介します。必要な方は参考にしてください。

Java の文字ストリームとバイト ストリームの違い

1.ストリーム

Java のストリームはバイト シーケンスを抽象化したものです。水道管を想像できますが、水道管を流れる水はもはや水ではなく、バイト シーケンスです。水の流れと同様に、Java のストリームにも「流れの方向」があります。通常、バイトのシーケンスを読み取ることができるオブジェクトは入力ストリームと呼ばれ、バイトのシーケンスを書き込むことができるオブジェクトは入力ストリームと呼ばれます。 .出力ストリーム。

2. バイトストリーム

Java におけるバイトストリーム処理の最も基本的な単位は、通常、バイナリデータの処理に使用されます。 Java の 2 つの最も基本的なバイト ストリーム クラスは、InputStream と OutputStream で、それぞれ基本的な入力バイト ストリームと出力バイト ストリームを表します。 InputStream クラスと OutputStream クラスは両方とも

抽象クラス

ですが、実際の使用では、通常、Java クラス ライブラリ で提供される一連のサブクラスを使用します。 Java でバイト ストリームを紹介する例として、InputStream クラスを取り上げます。InputStream クラスは、バイト ストリームからバイトを読み取るための基本的なメソッド read を定義します。このメソッドの定義は次のとおりです。

public abstract int read() throws IOException;
これは抽象メソッドです。つまり、InputStream から派生した入力バイト ストリーム クラスは、このメソッドを実装する必要があります。このメソッドの機能は、バイト ストリームからバイトを読み取り、最後に達した場合は 1 を返し、そうでない場合は読み取ったバイトを返します。このメソッドについて注意する必要があるのは、読み取りバイトまたは -1 を返すまでブロックされるということです。さらに、バイト ストリームはデフォルトではキャッシュをサポートしていません。つまり、読み取りメソッドが呼び出されるたびに、オペレーティング システムはバイトの読み取りを要求され、多くの場合ディスク IO が伴うため、効率は比較的低くなります。バイト配列をパラメータとして受け取る、InputStream クラスの読み取りのオーバーロードされたメソッドは、頻繁なディスク IO を必要とせずに一度に複数バイトを読み取ることができると考える友人もいるかもしれません。では、これは本当にそうなのでしょうか?このメソッドのソース コードを見てみましょう:

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 コード要素の列) を、指定されたエンコード方式でバイト列に変換して書き込みます。ファイル内;

  1. 入力文字
  2. ストリーム: 指定されたエンコード方式に従って、読み込まれるバイト シーケンスを対応する文字シーケンス (実際には Unicode コード要素シーケンス) にデコードして、メモリ。

  3. このプロセスの理解を深めるために、サンプルコードは次のとおりです:

    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();
        }
      }
    }
  4. 上記のコードでは、FileWriter を使用して、demo.txt に 4 つの文字「demo」を書き込みます。 16 進数の
Editor

WinHex デモ.txt の内容を表示します:

上の図からわかるように、私たちが作成した「デモ」は「64 65 6D 6F」としてエンコードされていますが、エンコード方法は異なります。実際、これを指定しない場合、書き込む文字のエンコードにはオペレーティング システムのデフォルトの文字エンコード方法が使用されます。

文字ストリームは実際には、出力する前に Unicode コード要素シーケンスから対応するエンコード方式のバイト シーケンスへの変換を完了する必要があるため、メモリ バッファを使用して変換されたバイト シーケンスを保存し、変換が完了するまで待機します。 . ディスクファイルに一緒に書き込まれます。

4. 文字ストリームとバイトストリームの違い

上記の説明の後、バイト ストリームと文字ストリームの主な違いは次の点に反映されていることがわかります:

  • バイト ストリーム操作の基本単位はバイトです。文字ストリーム操作の基本単位は Unicode コードです。要素。

  • バイトストリームはデフォルトではバッファを使用しません。文字ストリームはバッファを使用します。

  • バイト ストリームは通常、バイナリ データを処理するために使用されます。実際、あらゆる種類のデータを処理できますが、Unicode コード要素の直接の書き込みや読み取りはサポートされておらず、通常はテキスト データを処理します。 Unicode コード要素を取得します。

以上がJava の文字ストリームとバイト ストリームの違いの詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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