我在磁盘中有一个40MB的文件,我需要使用字节数组将其“映射”到内存中。Java:内存高效ByteArrayOutputStream
起初,我认为将文件写入ByteArrayOutputStream将是最好的方式,但我发现在复制操作过程中的某个时刻需要大约160MB的堆空间。
有人知道更好的方式来做到这一点,而不使用三倍的RAM文件大小?
更新:感谢您的回答。我注意到我可以减少内存消耗,告诉ByteArrayOutputStream初始大小比原始文件大小稍大一些(使用我的代码强制重新分配的确切大小,必须检查原因)。
还有一个很高的内存点:当我用ByteArrayOutputStream.toByteArray返回byte []时。纵观它的源代码,我可以看到它是克隆的数组:
public synchronized byte toByteArray()[] {
return Arrays.copyOf(buf, count);
}
我想我可能只是延长ByteArrayOutputStream和重写这个方法,因此对原阵列直接返回。鉴于流和字节数组将不会被使用多次,这里是否存在潜在的危险?
同类问题http://stackoverflow.com/questions/964332/java-large-files-disk-io-performance – Santosh