Java 解压缩大型二进制文件
我有一个使用以下方法解压缩大型zip文件的函数。因为文件太大,有时我会遇到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
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);
}