【发布时间】:2014-10-03 19:21:16
【问题描述】:
我正在尝试使用以下方法从我当前的 JAR 中提取 ZIP 文件:
InputStream resource = getClass().getClassLoader().getResourceAsStream(name);
这会得到正确的InputStream,但是当我尝试使用以下代码解压缩它时会出错(我将每个文件存储到Hashmap<file, filename>):
public static HashMap<String, String> readZip(InputStream inputStream) throws IOException {
byte[] buffer = new byte[1024];
HashMap<String, String> list = new HashMap<>();
ZipInputStream zipInputStream = new ZipInputStream(inputStream);
ZipEntry entry = zipInputStream.getNextEntry();
while (entry != null) {
if (!entry.isDirectory()) {
StringBuilder stringBuilder = new StringBuilder();
while (IOUtils.read(zipInputStream, buffer) > 0) {
stringBuilder.append(new String(buffer, "UTF-8"));
}
list.put(stringBuilder.toString(), entry.getName());
}
zipInputStream.closeEntry();
entry = zipInputStream.getNextEntry();
}
zipInputStream.closeEntry();
zipInputStream.close();
return list;
}
但是,当我尝试这样做时,我得到了这个异常(IOUtils.read)
java.util.zip.ZipException: invalid stored block lengths
at java.util.zip.InflaterInputStream.read(Unknown Source)
at java.util.zip.ZipInputStream.read(Unknown Source)
我做错了吗?我已经对错误进行了大量的谷歌搜索,但没有看到任何与我的问题相关的内容。
【问题讨论】:
-
所以您的 JAR 包含一个压缩的条目?您想读取此条目的字节并通过
ZipInputStream读取它? -
是的,我想就是这样
-
这表明文件已损坏。尝试用普通的解压工具解压。
-
不管怎样,您在将数据连接到 StringBuilder 并将其保存为 String 时犯了一个严重错误。首先,您甚至没有正确执行此操作,因为您在构造每个字符串时忽略了读取计数。其次,String 不是二进制数据的容器。您应该将每个条目复制到 ByteArrayOutputStream 并返回 HashMap
。 -
等一下。运行 maven 和构建 .zip 文件并将其添加到 JAR 之间存在很大的无法解释的距离,并且都不涉及编译。
标签: java maven zip embedded-resource