我在磁盘上有一个40MB的文件,我需要使用字节数组将其“映射”到内存中。
起初,我认为将文件写入ByteArrayOutputStream是最好的方法,但我发现在复制操作期间某个时刻它占用了大约160MB的堆空间。
有人知道更好的方法吗,而不使用三倍于RAM的文件大小?
更新:谢谢你们的答案。我注意到我可以通过将ByteArrayOutputStream的初始大小设置为略大于原始文件大小来减少内存消耗(使用我的代码的确切大小会强制重新分配,必须检查原因)。
还有另一个高内存点:当我使用ByteArrayOutputStream.toByteArray获取byte[]时。看一下它的源代码,我可以看到它正在克隆数组:
public synchronized byte toByteArray()[] {
return Arrays.copyOf(buf, count);
}
我在考虑是否可以扩展ByteArrayOutputStream并重写这个方法,从而直接返回原始数组。假设流和字节数组不会再被使用,这种做法存在潜在的危险吗?