解压 Java 中的 zip 文件导致 "java.util.zip.ZipException" - 无效的 LOC header(错误的签名)
Unpacking zip files in Java that cause a "java.util.zip.ZipException" - invalid LOC header (bad signature)
我有一个 zip file (that is downloaded from an ownCloud 实例)并且无法使用 Java 库(java 版本“1.8.0_66”)从 java.util.zip.如果我尝试这样做,则会抛出以下异常:
java.util.zip.ZipException: invalid LOC header (bad signature)
发出Linux 'file'命令时,输出如下:
so-example.zip: Zip archive data, at least v3.0 to extract
经过反复试验后我发现,"v2.0" 应该可以解压缩的文件可以由 Java 处理,没有任何问题。
用于解包的代码的最小示例如下:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
public class PlaygroundZip{
public static void main(String[] args) {
String filename = "/tmp/so-example.zip";
byte[] buffer = new byte[1024];
try {
ZipFile zipFile = new ZipFile(filename);
Enumeration entries = zipFile.entries();
while(entries.hasMoreElements()) {
ZipEntry entry = (ZipEntry)entries.nextElement();
String currName = entry.getName();
System.out.println("File: " + currName);
if(entry.isDirectory()) {
new File(currName).mkdirs();
} else{
InputStream zis = zipFile.getInputStream(entry);
FileOutputStream fos = new FileOutputStream(currName);
int len;
while ((len = zis.read(buffer)) > 0) {
fos.write(buffer, 0, len);
}
fos.close();
}
}
zipFile.close();
} catch (IOException ioe) {
System.err.println("Unhandled exception:");
ioe.printStackTrace();
}
}
}
如何使用标准 Java 库或任何其他方法处理这些文件?
到目前为止,我发现解压缩这些文件的唯一方法是使用系统命令并使用 "unzip" 命令行工具(Ubuntu 12.04 LTS,UnZip 6.00)。由于这是在服务器应用程序中使用的,因此即使远非优雅,这也是可以接受的 hack。
Process p = Runtime.getRuntime().exec("unzip " + filename + " -d /tmp/mydir");
我有一个 zip file (that is downloaded from an ownCloud 实例)并且无法使用 Java 库(java 版本“1.8.0_66”)从 java.util.zip.如果我尝试这样做,则会抛出以下异常:
java.util.zip.ZipException: invalid LOC header (bad signature)
发出Linux 'file'命令时,输出如下:
so-example.zip: Zip archive data, at least v3.0 to extract
经过反复试验后我发现,"v2.0" 应该可以解压缩的文件可以由 Java 处理,没有任何问题。
用于解包的代码的最小示例如下:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
public class PlaygroundZip{
public static void main(String[] args) {
String filename = "/tmp/so-example.zip";
byte[] buffer = new byte[1024];
try {
ZipFile zipFile = new ZipFile(filename);
Enumeration entries = zipFile.entries();
while(entries.hasMoreElements()) {
ZipEntry entry = (ZipEntry)entries.nextElement();
String currName = entry.getName();
System.out.println("File: " + currName);
if(entry.isDirectory()) {
new File(currName).mkdirs();
} else{
InputStream zis = zipFile.getInputStream(entry);
FileOutputStream fos = new FileOutputStream(currName);
int len;
while ((len = zis.read(buffer)) > 0) {
fos.write(buffer, 0, len);
}
fos.close();
}
}
zipFile.close();
} catch (IOException ioe) {
System.err.println("Unhandled exception:");
ioe.printStackTrace();
}
}
}
如何使用标准 Java 库或任何其他方法处理这些文件?
到目前为止,我发现解压缩这些文件的唯一方法是使用系统命令并使用 "unzip" 命令行工具(Ubuntu 12.04 LTS,UnZip 6.00)。由于这是在服务器应用程序中使用的,因此即使远非优雅,这也是可以接受的 hack。
Process p = Runtime.getRuntime().exec("unzip " + filename + " -d /tmp/mydir");