IOUtils.toByteArray()OutOfMemoryError

时间:2014-04-24 10:08:25

标签: 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 FileOutputStream(output);
        GZIPOutputStream gzipStream = new GZIPOutputStream(fos);
        try {
            gzipStream.write(bFile);
            // IOUtils.copy(fis, gzipStream);
        } finally {
            gzipStream.close();
            fis.close();
            fos.close();
        }           
    }

每当我出现错误的时候。

2 个答案:

答案 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); //这会将整个字节数组加载到内存中。

相关问题