java - IOUtils.toByteArray() 内存溢出错误

标签 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();
        }           
    }

每次我遇到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/

相关文章:

java - 你真的在java中使用你的反向域来命名包吗?

android - 是否可以在 Flutter 中完全处理音量增大/减小产生的事件?

android - 如何设置和使用 ThreeTenABP 库

java - 动画导致垃圾收集器创建日志条目

java - 在其 getter 中调用数据成员的 setter

java - 如何读取文本文件中字符串数据的特定位置

Android Studio - 无法解析 : com. android.support 库

java - 匿名类是否总是保持对其封闭实例的引用?

python - self = None 有什么作用?

java - OpenSTF API POST 远程连接