Java IOUtils.toByteArray()OutOfMemoryError
我尝试压缩大小超过100Mb的大型视频文件Java IOUtils.toByteArray()OutOfMemoryError,java,android,garbage-collection,out-of-memory,Java,Android,Garbage Collection,Out Of Memory,我尝试压缩大小超过100Mb的大型视频文件 public static void compress(File input, File output) throws IOException { InputStream fis = new FileInputStream(input); byte[] bFile = IOUtils.toByteArray(fis); FileOutputStream fos = new FileOutputStr
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();
}
}
每次我出内存时都会出错。您应该逐步复制数据,这样就不会耗尽内存
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);
}
}
无论文件大小如何,一次将使用大约4KB的缓冲区。(我怀疑GZIP使用的是相同的方法来完成它的工作)您可以使用:
IOUtils.copy(inputStream, outputStream);
它将自行处理字节缓冲区。您不需要显式创建字节[],因为如果是大字节,您将使用以下命令在内存中加载大字节数组:
IOUtils.toByteArray(fis)代码>//这将把整个字节数组加载到内存中。那么您的问题是什么?我认为在移动平台上向内存加载100MB时,OOM是很正常的。不要这样做。好吧,这里不允许源代码级别低于1.7的资源规范,因为我使用Java1.6。如果我切换到Java1.7,我得到了这个Android要求编译器符合5.0或6.0级的要求。改为找到“1.7”