我尝试压缩大小超过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();
}
}
每当我出现错误的时候。
答案 0 :(得分:4)
您应该逐步复制数据,并且不会耗尽内存。
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使用了同样的工作)
答案 1 :(得分:0)
您可以使用:
IOUtils.copy(inputStream, outputStream);
这将处理字节缓冲区本身。您不需要显式创建一个byte [],因为在大容量情况下,您可以使用以下命令在内存中加载大容量字节数组:
IOUtils.toByteArray(fis);
//这会将整个字节数组加载到内存中。