java - 解压大型二进制文件
问题描述
我有一个使用以下方法解压缩大型 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)
解决方案
不要使用Reader
类,因为您不需要逐个字符或逐行编写输出文件。byte
您应该使用byte
withInputStream.transferTo()
方法进行读写:
try(var in = new GZIPInputStream(new FileInputStream(inFile));
var out = new FileOutputStream(outFile)) {
in.transferTo(out);
}
此外,您可能不需要flush()
显式调用,在每一行之后都这样做是浪费的。
推荐阅读
- angular-dart - AngularDart 移动网络应用
- azure - 函数V2:Nuget包DocumentFormat.OpenXml 2.8.1遇到异常
- ruby-on-rails - Ruby: Disable to use link massively
- android - 开放测试期结束后,抢先体验应用会自动卸载吗?
- python - matplotlib 不使用动画功能
- openthread - 在 Simplelink cc2640r2f (Launchxl-CC2640R2) 上构建和刷新 openthread
- excel - EXCEL:A列输入到B列输出
- c# - .Net / C# 解释
- json - JSON 数据错误 403
- ios - iOS/IBM Cloud/Swift:使用 AlamoFire 发布到 Watson API