2

ファイルをバイト配列に読み込みたい。だから、私はそれを使って読んでいます:

    int len1 = (int)(new File(filename).length());
    FileInputStream fis1 = new FileInputStream(filename);
    byte buf1[] = new byte[len1];
    fis1.read(buf1);

しかし、それは本当に非常に遅いです。ファイルをバイト配列に読み込むための非常に高速なアプローチ(おそらく最良のアプローチ)を誰かに教えてもらえますか?必要に応じてJavaライブラリも使用できます。

編集:どちらが速いベンチマークはありますか(ライブラリアプローチを含む)。

4

2 に答える 2

16

それほど遅くはありませんが、少なくとも速くする方法はありません。しかし、それは間違っています。ファイルが十分に大きい場合、メソッドread()は最初の呼び出しからすべてのバイトを返しません。このメソッドは、読み取ることができたバイト数を戻り値として返します。

正しい方法は、このメソッドをループで呼び出すことです。

  public static void copy(InputStream input,
      OutputStream output,
      int bufferSize)
      throws IOException {
    byte[] buf = new byte[bufferSize];
    int bytesRead = input.read(buf);
    while (bytesRead != -1) {
      output.write(buf, 0, bytesRead);
      bytesRead = input.read(buf);
    }
    output.flush();
  }

これを次のように呼びます。

ByteArrayOutputStream baos = new ByteArrayOutputStream();
copy(new FileInputStream(myfile), baos);
byte[] bytes = baos.toByteArray();

FileUtils.readFileToByteArray()このようなものは、@ Andrew Borisov(+1)によって言及されているように、多くのパッケージに実装されています。

編集

あなたの場合の遅い理由は、あなたが非常に巨大な配列を作成しているという事実にあると思います。本当に必要ですか?デザインを考え直してみてください。このファイルを配列に読み込む必要はなく、データを段階的に処理できると思います。

于 2012-07-31T14:03:16.137 に答える
10

apache commons-io FileUtils.readFileToByteArray

于 2012-07-31T13:58:27.443 に答える