Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.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 解压缩大型二进制文件_Java_Compression_Gzip_Binaryfiles - Fatal编程技术网

Java 解压缩大型二进制文件

Java 解压缩大型二进制文件,java,compression,gzip,binaryfiles,Java,Compression,Gzip,Binaryfiles,我有一个使用以下方法解压缩大型zip文件的函数。因为文件太大,有时我会遇到OutOfMemoryError错误。有没有办法优化我的代码?我读过一些关于将文件分成更小的部分,可以放入内存并解压缩的文章,但我不知道如何做到这一点。任何帮助或建议都将不胜感激 private static String decompress(String s){ String pathOfFile = null; try(BufferedReader reader = new Buff

我有一个使用以下方法解压缩大型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;
    }
堆栈跟踪:

线程“main”java.lang.OutOfMemoryError中的异常:java堆空间 位于java.base/java.util.Arrays.copyOf(Arrays.java:3689) 位于java.base/java.util.ArrayList.grow(ArrayList.java:237) 位于java.base/java.util.ArrayList.ensureCapacity(ArrayList.java:217)
不要使用
Reader
类,因为您不需要逐个字符或逐行写入输出文件。您应该使用以下方法通过
byte
读取和写入
byte


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

不要使用
Reader
类,因为您不需要逐个字符或逐行写入输出文件。您应该使用以下方法通过
byte
读取和写入
byte


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

您对输入和输出文件都使用
s
,这是行不通的。您不能写入正在读取的同一个文件。您对输入和输出文件都使用
s
,这将不起作用。你不能写你正在读的同一个文件。谢谢你的建议。这是java 8+语法和var?java 10+语法我正在使用的系统是java 7。我确实在我的个人机器上对这段代码进行了测试,它使用的是Java 11,你甚至不能使用
transferTo
,因为它是Java 9+。查看如何在Java 7兼容的替代方案中实现它并不复杂:
try(GZIPInputStream in=new GZIPInputStream(new FileInputStream(infle)){Files.copy(in,path.get(outFile));}
该方法自Java 7以来就存在。在这种特定情况下,即使对于较新版本,它也可能是首选解决方案,因为不需要手动处理目标
OutputStream
。感谢您的建议。这是java 8+语法和var?java 10+语法我正在使用的系统是java 7。我确实在我的个人机器上对这段代码进行了测试,它使用的是Java 11,你甚至不能使用
transferTo
,因为它是Java 9+。查看如何在Java 7兼容的替代方案中实现它并不复杂:
try(GZIPInputStream in=new GZIPInputStream(new FileInputStream(infle)){Files.copy(in,path.get(outFile));}
该方法自Java 7以来就存在。在这种特定情况下,它可能是较新版本的首选解决方案,因为不需要手动处理目标
OutputStream
try(var in = new GZIPInputStream(new FileInputStream(inFile));
    var out = new FileOutputStream(outFile)) {
    in.transferTo(out);           
}