解压缩大型二进制文件

时间:2020-05-19 11:51:37

标签: java compression gzip binaryfiles

我具有使用以下方法解压缩大型zip文件的功能。有时由于文件太大,我遇到OutOfMemoryError错误。有什么方法可以优化代码?我已经读过一些有关将文件分成可以装入内存和解压缩的较小部分的内容,但是我不知道该怎么做。任何帮助或建议,表示赞赏。

private static String decompress(String s){
        String pathOfFile = null;

        try(BufferedReader reader = new BufferedReader(new InputStreamReader(new GZIPInputStream(new FileInputStream(s)), Charset.defaultCharset()))){
            File file = new File(s);
            FileOutputStream fos = new FileOutputStream(file);

            String line;
            while((line = reader.readLine()) != null){
                fos.write(line.getBytes());
                fos.flush();
            }

            pathOfFile = file.getAbsolutePath();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return pathOfFile;
    }

堆栈跟踪:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at java.base/java.util.Arrays.copyOf(Arrays.java:3689)
        at java.base/java.util.ArrayList.grow(ArrayList.java:237)
        at java.base/java.util.ArrayList.ensureCapacity(ArrayList.java:217)

1 个答案:

答案 0 :(得分:2)

不要使用Reader类,因为您不需要逐个字符或逐行写入输出文件。您应该使用InputStream.transferTo()方法通过byte来读写byte

try(var in = new GZIPInputStream(new FileInputStream(inFile));
    var out = new FileOutputStream(outFile)) {
    in.transferTo(out);           
}

另外,您可能不需要显式调用flush(),在每一行都浪费之后再这样做。

相关问题