Android NIO - java.io.IOException: слишком большое значение для определенного типа данных - PullRequest
0 голосов
/ 30 марта 2012

Я пытаюсь записать очень большой файл в другой очень большой файл. Я получаю эту ошибку в строке записи файлового канала и не знаю почему. Я думал, что это потому, что я выходил за пределы типа данных long, но long может подняться до 9,223,372,036,854,775,807, а я только до 5,372,896,745 максимум Есть идеи, почему это происходит? Есть ли какой-то предел, который имеет MappedByteBuffer? Это не происходит для небольших файлов, и я не сталкивался с какими-либо проблемами при использовании того же кода в настольном приложении Java. (Происходит только на Android)

File f1 = new File(filename1); 

FileChannel fic, foc;
long fsize;
MappedByteBuffer mBUf;

FileOutputStream out = new FileOutputStream(f1,true); 
foc = out.getChannel();

File f2 = new File(filename2);
FileInputStream in = new FileInputStream(f2); 

fic = in.getChannel();
fsize = fic.size();

for (long b = 0; b < fsize; b += 65536)
{
    if (fsize - b < Resource.MEMORY_ALLOC_SIZE)
        mBUf = fic.map(FileChannel.MapMode.READ_ONLY, b, fsize - b);
    else
        mBUf = fic.map(FileChannel.MapMode.READ_ONLY, b, Resource.MEMORY_ALLOC_SIZE);
    foc.write(mBUf); //ERROR HERE!
}               

fic.close();
in.close();
foc.close();
out.close();

Любые идеи / отзывы приветствуются!

Ответы [ 2 ]

3 голосов
/ 30 марта 2012

Есть ли какой-то предел, который есть у MappedByteBuffer?

Конечно, есть.Он ограничен доступной виртуальной памятью для начала, а затем виртуальным адресным пространством.

Для этой задачи вы должны использовать transferTo(), а не MappedByteBuffers,, поскольку не существует согласованных средствраспоряжение виртуальным адресным пространством, занимаемым последним.

0 голосов
/ 30 марта 2012

К сожалению, Long не идет так высоко в 32-битной системе (что, как я полагаю, в Android, поскольку у него нет более 4 ГБ ОЗУ).Поэтому максимальная длина неподписанного long в Android составляет 4 294 967 295, что означает, что вы превысили его предел.

...