Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java IOUtils.toByteArray()OutOfMemoryError_Java_Android_Garbage Collection_Out Of Memory - Fatal编程技术网

Java IOUtils.toByteArray()OutOfMemoryError

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

我尝试压缩大小超过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();
        }           
    }

每次我出内存时都会出错。

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

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”