我正在编写一个需要读取 ZIP 文件中的一些 XML 和图像文件的 Java 小程序。Zip 文件将通过 HTTP 下载,并且小程序未签名,因此我需要使用它java.util.zip.ZipInputStream
来操作数据。当我尝试读取 Zip 文件中的 PNG 文件时出现问题。
我处理 Zip 文件的步骤:
通过 Http 下载 Zip
URL resourceURL = new URL(source); HttpURLConnection httpConnection= (HttpURLConnection) resourceURL.openConnection(); httpConnection.connect(); InputStream resourceFileIn = httpConnection.getInputStream();
使用 ZipInputStream 保存下载的数据
ZipInputStream resourceZipIn = new ZipInputStream(resourceFileIn);
遍历每个 ZipEntry 并提取相应的字节数组
ArrayList<ExtractedEntry> extractedList = new ArrayList<ExtractedEntry>(); ZipEntry currentEntry; while ((currentEntry = resourceZipIn.getNextEntry()) != null) { byte[] byteHolder = new byte[(int) currentEntry.getSize()]; resourceZipIn.read(byteHolder, 0, byteHolder.length); extractedList.add(new ExtractedEntry(currentEntry.getName(), byteHolder)); }
备注:提取的每个 ZipEntry 都由以下类保存
public class ExtractedEntry { private String name; private byte[] byteArray; public ExtractedEntry(String name, byte[] byteArray) { super(); this.name = name; this.byteArray = byteArray; } public String getName() { return name; } public byte[] getByteArray() { return byteArray; } }
在提取的列表中找到我要读取的文件
ExtractedEntry bgEntry = null; for (int j = 0; j < extractedList.size() && bgEntry == null; j++) { if (extractedList.get(j).getName().equals("background.png")) { bgEntry = extractedList.get(j); } }
根据需要执行特定动作
InputStream mapBgIn = new ByteArrayInputStream(bgEntry.getByteArray()); BufferedImage bgEntry = ImageIO.read(bgIn);
我只列出了读取 PNG 文件的操作,因为那是我遇到问题的地方。当我尝试以上述方式读取图像时,我总是在步骤 5 的最后一行收到以下错误。
javax.imageio.IIOException: Error reading PNG image data at com.sun.imageio.plugins.png.PNGImageReader.readImage(Unknown Source)
at com.sun.imageio.plugins.png.PNGImageReader.read(Unknown Source)
at javax.imageio.ImageIO.read(Unknown Source)
at javax.imageio.ImageIO.read(Unknown Source)
at com.quadd.soft.game.wtd.lib.resource.ResourceManager.loadHttpZipRes(ResourceManager.java:685)
Caused by: javax.imageio.IIOException: Unknown row filter type (= 7)!
at com.sun.imageio.plugins.png.PNGImageReader.decodePass(Unknown Source)
at com.sun.imageio.plugins.png.PNGImageReader.decodeImage(Unknown Source)
... 29 more
但是,如果我从第 3 步开始按以下方式读取图像,则没有问题。
ZipInputStream resourceZipIn = new ZipInputStream(resourceFileIn);
ZipEntry testEntry;
while ((testEntry = resourceZipIn.getNextEntry()) != null) {
if (testEntry.getName().equals("background.png")) {
BufferedImage bgEntry = ImageIO.read(resourceZipIn);
}
}
因此,我想我的代码在从中提取字节java.util.zip.ZipInputStream
并将其放回以读取图像时存在一些问题。但是我对操纵流很陌生,所以我无法弄清楚到底是什么问题。我想问是否有人可以指出我在代码中犯了什么错误导致错误。