我尝试压缩超过 100Mb 的大型视频文件。
public static void compress(File input, File output) throws IOException {
InputStream fis = new FileInputStream(input);
byte[] bFile = IOUtils.toByteArray(fis);
FileOutputStream fos = new FileOutputStream(output);
GZIPOutputStream gzipStream = new GZIPOutputStream(fos);
try {
gzipStream.write(bFile);
// IOUtils.copy(fis, gzipStream);
} finally {
gzipStream.close();
fis.close();
fos.close();
}
}
每次我遇到outofmemoryerror。
最佳答案
你应该逐步复制数据,这样你就不会耗尽内存。
public static void compress(File input, File output) throws IOException {
try(InputStream in = new FileInputStream(input);
OutputStream out = new GZIPOutputStream(new FileOutputStream(output))) {
byte[] bytes = new byte[4096];
for(int len; (len = in.read(bytes)) > 0; )
out.write(bytes, 0, len);
}
}
无论文件大小如何,这将立即使用大约 4 KB 作为缓冲区。 (我怀疑 GZIP 使用大致相同的方式来完成它的工作)
关于java - IOUtils.toByteArray() 内存溢出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23265857/