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



我正试图将一个很大的文件写入另一个很大文件。我在filechannel写入行收到这个错误,我不确定原因。我认为这是因为我超出了数据类型long的限制,但long可以达到9223372036854775807,我最多只能达到5372896745。你知道为什么会发生这种情况吗?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();

任何想法/反馈都将不胜感激!

MappedByteBuffer是否有一些限制?

当然有。它首先受到可用虚拟内存的限制,然后受到虚拟地址空间的限制。

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

不幸的是,Long在32位系统上没有那么高(我相信Android是这样的,因为它没有超过4Gb的RAM)。因此,Android上无符号长的最大长度为4294967295,这意味着你超过了它的限制。

最新更新