首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IOUtils.toByteArray() OutOfMemoryError

IOUtils.toByteArray() OutOfMemoryError
EN

Stack Overflow用户
提问于 2014-04-24 18:08:25
回答 2查看 2.8K关注 0票数 3

我尝试压缩超过100Mb的大视频文件。

代码语言:javascript
复制
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();
        }           
    }

每次我忘记记忆错误的时候。

EN

回答 2

Stack Overflow用户

发布于 2014-04-24 18:24:58

您应该逐步复制数据,这样就不会耗尽内存。

代码语言:javascript
复制
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使用大致相同的方法来完成它的工作)

票数 4
EN

Stack Overflow用户

发布于 2020-02-11 14:35:31

您可以使用:

代码语言:javascript
复制
IOUtils.copy(inputStream, outputStream);

它将自己处理字节缓冲区。您不需要显式创建byte[],因为在大容量的情况下,您通过使用以下命令在内存中加载大容量字节数组:

IOUtils.toByteArray(fis); //这会将整个字节数组加载到内存中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23265857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档