我正在压缩目录的内容,但在尝试打开压缩文件时遇到错误。谁能告诉我的代码发生了什么?也许我没有分配足够的字节?
查看 zipDirectory() 内部,您会看到我正在压缩包含特殊扩展文件的文件夹。不确定错误发生在哪里,所以也许有人可以帮助我!
private void zipDirectory() {
File lazyDirectory = new File(defaultSaveLocation);
File[] files = lazyDirectory.listFiles();
for (File file : files) {
if (file.isDirectory()) {
System.out.println("Zipping up " + file);
zipContents(file);
}
}
}
public static void addToZip(String fileName, ZipOutputStream zos) throws IOException {
System.out.println("Writing '" + fileName + "' to zip file");
File file = new File(fileName);
FileInputStream fis = new FileInputStream(file);
ZipEntry zipEntry = new ZipEntry(fileName);
zos.putNextEntry(zipEntry);
byte[] bytes = new byte[1024];
int length;
while ((length = fis.read(bytes)) >= 0) {
zos.write(bytes, 0, length);
}
zos.closeEntry();
fis.close();
}
public static void zipContents(File dirToZip) {
List<File> fileList = new ArrayList<File>();
File[] filesToZip = dirToZip.listFiles();
for (File zipThis : filesToZip) {
String ext = "";
int i = zipThis.toString().lastIndexOf('.');
if (i > 0) {
ext = zipThis.toString().substring(i+1);
}
if(ext.matches("cpp|bem|gz|h|hpp|pl|pln|ppcout|vec|xml|csv")){
fileList.add(zipThis);
}
}
try {
FileOutputStream fos = new FileOutputStream(dirToZip.getName() + ".zip");
ZipOutputStream zos = new ZipOutputStream(fos);
for (File file : fileList) {
addToZip(file.toString(), zos);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
与 Java 中 IO 流的大多数问题一样,您的错误几乎肯定是您没有正确关闭流。您需要添加:
zos.finish(); // good practice
zos.close();
for 循环之后。
对我来说,解决方法是您需要对每个文件条目执行此操作
zos.finish()
zos.flush()
zos.closeEntry()
然后再次执行以上操作即可关闭
zos
。否则,默认Windows无法正确打开压缩文件夹,但第三方应用程序可以。
如果您使用面向字符的编写器(例如 FileWriter)来创建解压缩文件(实际上包含二进制数据),也可能会发生这种情况
我无法读取正在提取的文件,并切换到二进制输出流(FileOutputStream)解决了该问题