16

私が理解しているように、データByteArrayInputStreamの読み取りに使用されbyte[]ます。単純ではなく使用する必要があるのはなぜですかbyte[](たとえば、DB から読み取るなど)。

それらの違いは何ですか?

4

3 に答える 3

11

入力が常にabyte[]である場合、その通りです。多くの場合、ストリームは必要ありません。また、必要ない場合は使用しないでくださいByteArrayInputStream のもう 1 つの利点は、バイトを読み取り専用にするつもりであることを非常に強力に示すものとして機能することです (ストリームはバイトを変更するためのインターフェイスを提供しないため)。それでもバイトに直接アクセスするため、セキュリティが懸念される状況では使用しないでください。

しかし、それがbyte[]、ファイル、ネットワーク接続などである場合は、「バイトのストリームであり、どこから来たのかは気にしない」ためのある種の抽象化が必要です。それが InputStream です。ソースがたまたまバイト配列である場合、ByteArrayInputStream は使用するのに適した InputStream です。

これは多くの状況で役立ちますが、具体的な例を 2 つ挙げます。

  • バイトを取得して何らかの方法で処理するライブラリを作成しています (たとえば、画像処理ライブラリなど)。ライブラリのユーザーは、ファイル、byte[]メモリ内、またはその他のソースからバイトを提供できます。したがって、を受け入れるインターフェースを提供しますInputStream— つまり、持っているものが である場合、byte[]それを ByteArrayInputStream でラップする必要があります。
  • ネットワーク接続を読み取るコードを書いています。しかし、そのコードを単体テストするために、接続を開く必要はありません。コードでいくつかのバイトを指定するだけです。したがって、コードは InputStream を受け取り、テストは ByteArrayInputStream を提供します。
于 2015-11-23T06:44:49.553 に答える
6
  • ByteArrayInputStream には、ストリームから読み取ることができるバイトを含む内部バッファーが含まれています。内部カウンターは、読み取りメソッドによって提供される次のバイトを追跡します。
  • ByteArrayInputStream は、基になる配列を外部からの変更から保護するラッパーのようなものです。
  • 高次読み込み、マーク、スキップ機能を搭載
  • ストリームには、すべてのバイトを同時にメモリに格納する必要がないという利点もあります。これは、データのサイズが大きく、小さなチャンクで簡単に処理できる場合に便利です。

    参照ドキュメント

  • 選択した場合と同様に、読み取り、スキップ、および現在のインデックスの追跡を明示的に行うためにホイールを生成するbyte[]必要があります

    byte data[] = { 65, 66, 67, 68, 69 }; // data
        for (int index = 0; index < data.length; index++) {
            System.out.print((char) data[index] + "   ");
        }
        int c = 0;
        ByteArrayInputStream bInput = new ByteArrayInputStream(data);
        while ((bInput.read()) != -1) {
            System.out.println(Character.toUpperCase((char) c));
        }
    
于 2015-11-23T06:56:02.340 に答える