我正在尝试将一个非常大的文件写入另一个非常大的文件。我在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();
感谢任何想法/反馈!
答案 0 :(得分:3)
MappedByteBuffer有一些限制吗?
当然有。它受到可用虚拟内存的限制,在此之后由虚拟地址空间限制。
您应该使用transferTo()
来完成此任务而不是MappedByteBuffers,
,因为没有商定的方法来处理后者占用的虚拟地址空间。
答案 1 :(得分:-1)
不幸的是,在32位系统上,Long并没有那么高(我相信Android是因为它没有超过4Gb的RAM)。因此,Android上无符号长度的最大长度为4,294,967,295,这意味着您已超出其限制。