3

そのため、マップされたFileChannelを使用して非常に大きなファイルを読み込もうとしています。

ファイルが2GBを超えています。コードのスニペットは次のとおりです。

long fileSize = 0x8FFFFFFFL;
FileChannel fc = new RandomAccessFile("blah.huge", "rw").getChannel();
fc.map(FileChannel.MapMode.READ_WRITE, 0, fileSize);

これはエラーをスローします:

Exception in thread "main" java.lang.IllegalArgumentException: Size exceeds Integer.MAX_VALUE
   at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:789)

FileChannel.mapはlong、ファイルサイズとしてを取ります。では、このエラーは意味がありますか?なぜ彼らはそれよりも大きなファイルのサポートを提供しないのでしょうか?

4

2 に答える 2

4

この関数が使用するネイティブメソッドは、エラーを報告せずに長い値を取ります。リフレクションを使用して呼び出すことができます。ただし、システム上でそれらが機能するかどうかをテストし、このようにメモリマッピングを使用すると、有用以上に混乱する可能性があります。

最善のアプローチは、MappedByteBufferの配列を作成することです。たとえば、それぞれ1 GBのサイズで、この醜さを隠すラッパーを作成します。

技術的にはバグではありませんが、BAD(Broken As Designed)です。これが最初に行われた理由の一部は、32ビットJVMがこれをサポートできなかったためかもしれませんが、64ビットJVMがまだこの制限を持っている理由はわかりません。

于 2011-09-24T06:59:24.843 に答える
2

これはバグではありません。は、以下の引数FileChannel#mapを必要とするものとして文書化されています。これは、たとえば、パラメータに整数を使用するため、意味があります。sizeInteger.MAX_VALUEByteBuffer#getindex

于 2011-09-24T01:20:40.997 に答える