3

ファイルを処理する前にファイル全体をメモリに読み込む 3 つの方法を次に示します。

アプローチ A:

fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
dis = new DataInputStream(bis);

アプローチ B:

ByteArrayInputStream bi =
    new ByteArrayInputStream(
        org.apache.commons.io.FileUtils.readFileToByteArray(file))

アプローチ C:

File file = new File(yourFileName);
RandomAccessFile ra = new RandomAccessFile(yourFileName, "rw"):
byte[] b = new byte[(int)file.length()];
try {
    ra.read(b);
} catch (Exception e) {
    e.printStackTrace();
}

あるアプローチを別のアプローチよりも好むのはなぜですか?
あるアプローチを別のアプローチよりも必要とする特定のユースケースはありますか? 代わりに
固定長を使用しないのはなぜですか?byte[]

4

1 に答える 1

3

機能 (ランダム アクセスなど) に関して特別なことが必要でない限り、BufferedInputStream にラップされた InputStream は、ストリーミング機能を提供するあらゆる種類のデータ ソースから順次読み取るための一般的な選択肢です。

これにより、(バッファリングによって) 妥当なパフォーマンスが得られます。コードは、任意のストリームを処理できるという点で汎用的であり、また非常に重要です。処理可能なストリームのサイズは、このイディオムによって利用可能なヒープ メモリによって制限されません。

そのため、特別なケースの API に対してコーディングする非常にやむを得ない理由がない限り、標準の InputStream を使用し、必要に応じてラップします。


編集: @IUnknown によるコメントでの質問への回答:

  1. ランダムアクセスの場合のアプローチは何ですか - その場合でも BufferedInputStream が好ましい解決策だと思いましたか?

ランダム アクセス用の汎用インターフェイスはありません。あなたは間違って考えました。少なくとも基本の基本を勉強するのはとても礼儀正しいかもしれません: http://docs.oracle.com/javase/tutorial/essential/io/

  1. 処理可能なストリームのサイズは、使用可能なヒープ メモリによって制限されません。バッファには制限が必要です。読み取り中にいっぱいになると、内部配列のサイズが自動的に変更されるということですか?

繰り返しますが、それは基本でカバーされています (上記を参照)。ByteArrayInputStream では、ストリーム全体を保持するために byte[] が必要です。メモリによって制限されないのはなぜですか?(さらに悪いことに、最大配列サイズによってハードキャップされています)。

  1. Buffered ストリームと ByteArray ストリームの間でバッファ動作に違いはありますか - 同様のバッファ動作によってバックアップされていると思いました

私は何を言うべきかわかりません。あなたは間違って考えました。基本的な事実はさておき、どちらも InputStream を拡張し、何らかの方法で内部的にバイト配列を使用します (技術的には、配列を使用せずに実装することができます。これが最も自然な方法です)。彼らには共通点がありません。BufferedStream は、別のストリームの小さな動的部分を保持します。ByteArrayInputStream は 2 でカバーされました。

アドバイス:ここにいる人々は、どのツールをどのジョブに使用するかについて喜んでアドバイスします。しかし、スプーンで食べられるとは思わないでください。少し努力してください。stackoverflowは個人指導サイトではありません。「考える」のをやめて「学習」を始めましょう - チュートリアルはそこにあり、言語の黎明期から存在しています。

于 2013-08-17T17:06:47.933 に答える