Java Возможная ошибка FileChannel.map - PullRequest
       16

Java Возможная ошибка FileChannel.map

2 голосов
/ 24 сентября 2011

Итак, я пытаюсь прочитать очень большой файл, используя сопоставленный FileChannel.

Файл превышает 2 ГБ.Фрагмент кода:

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 в качестве размера файла.Так имеет ли эта ошибка смысл?Почему бы им не обеспечить поддержку файлов большего размера, чем это?

Ответы [ 2 ]

4 голосов
/ 24 сентября 2011

Собственные методы, которые использует эта функция, принимают длинные значения без сообщения об ошибке. Вы можете позвонить им, используя отражение. Однако вы должны проверить, работают ли они для вас в вашей системе, и использование отображения памяти таким способом может сбить вас с толку, чем быть полезным.

Лучший подход заключается в создании массива MappedByteBuffers, например 1 ГБ каждый по размеру и создайте оболочку, которая скрывает это безобразие.

Хотя технически это не ошибка, это BAD (Broken As Designed). Первоначально причиной этого было то, что 32-битная JVM не могла это поддерживать, но я не понимаю, почему 64-битные JVM все еще этот предел.

2 голосов
/ 24 сентября 2011

Это не ошибка. FileChannel#map задокументировано как требующий аргумента size, не превышающего Integer.MAX_VALUE, что имеет смысл, например, например. ByteBuffer#get принимает целое число для параметра index.

...