java提取ZLIB输入流的意外结束
我正在创建一个程序,该程序将提取一个zip文件,然后将这些文件插入到一个数据库中,每隔一段时间就会出现一次错误java提取ZLIB输入流的意外结束,java,Java,我正在创建一个程序,该程序将提取一个zip文件,然后将这些文件插入到一个数据库中,每隔一段时间就会出现一次错误 java.lang.Exception: java.io.EOFException: Unexpected end of ZLIB input stream 我无法找出原因,因为提取代码与您在web上可以找到的所有其他代码几乎相同。我的代码如下: public void extract(String zipName, InputStream content) throws Excep
java.lang.Exception: java.io.EOFException: Unexpected end of ZLIB input stream
我无法找出原因,因为提取代码与您在web上可以找到的所有其他代码几乎相同。我的代码如下:
public void extract(String zipName, InputStream content) throws Exception {
int BUFFER = 2048;
//create the zipinputstream
ZipInputStream zis = new ZipInputStream(content);
//Get the name of the zip
String containerName = zipName;
//container for the zip entry
ZipEntry entry;
// Process each entry
while ((entry = zis.getNextEntry()) != null) {
//get the entry file name
String currentEntry = entry.getName();
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// establish buffer for writing file
byte data[] = new byte[BUFFER];
int currentByte;
// read and write until last byte is encountered
while ((currentByte = zis.read(data, 0, BUFFER)) != -1) {
baos.write(data, 0, currentByte);
}
baos.flush(); //flush the buffer
//this method inserts the file into the database
insertZipEntry(baos.toByteArray());
baos.close();
}
catch (Exception e) {
System.out.println("ERROR WITHIN ZIP " + containerName);
}
}
}
切勿尝试读取超过条目包含的字节数。调用ZipEntry.getSize()获取条目的实际大小,然后在读取条目时使用此值跟踪条目中剩余的字节数。见下文:
try{
...
int bytesLeft = (int)entry.getSize();
while ( bytesLeft>0 && (currentByte=zis.read(data, 0, Math.min(BUFFER, bytesLeft))) != -1) {
...
}
...
}
我想说的是,您偶尔会收到截断的Zip文件来处理。检查上游。这可能是由此引起的
我以前在1000个随机创建的文档上有一个或两个错误,我应用了建议的解决方案(捕获EOFEException并对其不做任何处理),我没有其他错误。•您是否检查过您尝试处理的压缩流(文件)是否有效(例如,
解压
可以解压)请精确指出实际引发异常的代码行。我可能记不清了,但您不应该在处理完每个条目后关闭它吗?您应该在调用insertZipEntry()之前关闭BAO,我们的“currentByte”变量的名称很糟糕:应该是“count”或类似的名称。您能为您的问题选择一个最佳答案吗?这不是必需的。ZipInputStream会为您处理这些问题。EJP:但它失败了。但是,entry.getSize()和entry.getCompressedSize()对我来说都返回-1。