Android NIO - java.io.IOException:对于定义的数据类型,值太大

时间:2012-03-29 23:46:32

标签: android types nio

我正在尝试将一个非常大的文件写入另一个非常大的文件。我在filechannel写行上收到这个错误,我不确定为什么。我认为这是因为我超出了数据类型的限制,但很长时间可以达到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 个答案:

答案 0 :(得分:3)

  

MappedByteBuffer有一些限制吗?

当然有。它受到可用虚拟内存的限制,在此之后由虚拟地址空间限制。

您应该使用transferTo()来完成此任务而不是MappedByteBuffers,,因为没有商定的方法来处理后者占用的虚拟地址空间。

答案 1 :(得分:-1)

不幸的是,在32位系统上,Long并没有那么高(我相信Android是因为它没有超过4Gb的RAM)。因此,Android上无符号长度的最大长度为4,294,967,295,这意味着您已超出其限制。