我正试图将一个很大的文件写入另一个很大文件。我在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,这意味着你超过了它的限制。