我要解压缩iPhone应用.ipa文件。 这实际上是正常提取的zip文件。 但其中的实际app文件是一个带有.app结尾的文件夹(因为所有mac应用程序实际上都是带有结尾.app的文件夹)。 现在这段时间似乎是java.util.zip的一个问题。
public static void main(String[] args) throws IOException {
ZipFile zipFile = new ZipFile("file.zip");
String path = "";
Enumeration files = zipFile.entries();
while (files.hasMoreElements()) {
ZipEntry entry = (ZipEntry) files.nextElement();
if (entry.isDirectory()) {
File file = new File(path + entry.getName());
file.mkdir();
System.out.println("Create dir " + entry.getName());
} else {
File f = new File(entry.getName());
FileOutputStream fos = new FileOutputStream(f); //EXception occurs here
InputStream is = zipFile.getInputStream(entry);
byte[] buffer = new byte[1024];
int bytesRead = 0;
while ((bytesRead = is.read(buffer)) != -1) {
fos.write(buffer, 0, bytesRead);
}
fos.close();
System.out.println("Create File " + entry.getName());
}
}
}
这是我的输出:
Exception in thread "main" java.io.FileNotFoundException: Payload/SMA Jobs.app/06-magnifying-glass.png (No such file or directory)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(FileOutputStream.java:179)
at java.io.FileOutputStream.<init>(FileOutputStream.java:131)
at Main.main(Main.java:27)
enter code here
任何人都知道如何处理这些时期?
答案 0 :(得分:2)
首先,你应该使用mkdirs(),而不是mkdir()。
第二,zip文件并不总是包含所有目录条目(或者以正确的顺序使用它们)。最好的做法是在代码的两个分支中创建目录,所以添加:
} else {
File f = new File(entry.getName());
f.getParent().mkdirs();
(你应该添加一些检查以确保getParent()不为空等)。
答案 1 :(得分:0)
我不认为这个时期是个问题。查看您尝试输出的文件的绝对路径,并确保它指向正确的位置。
答案 2 :(得分:0)
if (entry.isDirectory()) {
File file = new File(path + entry.getName());
....
} else {
File f = new File(entry.getName());
....
创建目录时,传递的文件路径为path + entry.getName() 但是在创建文件时,传递的文件路径是entry.getName()
将文件路径更改为path + entry.getName()后,代码适用于期间文件名和普通文件名。 :)