背景
目前,我尝试通过带有HTTP请求的HTTP-servlet获取zip文件。收到的zip文件包含三个不同的文件。这些文件包含我想要过滤掉的信息,并且从源代码执行此操作不是一个选项(就是这样,但我知道它会好得多)。
因为我无法从源文件过滤掉文件中的一些信息,从一开始就构建文件,我的解决方案是解压缩文件,将这三个文件作为字符串读取然后过滤它们。最后“重建”全部作为“zipfile”(inputStream)并返回inputStream。
问题
目前,我已经创建了一个类来处理文件的解压缩和过滤。最后我只想返回包含zip文件和里面三个文件的新inputStream。
我已经将HTTP实体中的内容转换为inputStream,解压缩此inputStream并将三个文件作为三个字符串。为了试着看看这是否有效,我目前不想做更多的事情,只需要解压缩它们,然后关闭inputStream并返回它。但是当我返回inputStream时会产生异常:
java.io.IOException: Attempted read on closed stream.
这是因为inputStream在我下面给出的函数之外使用。当我关闭zipInputStream时,我可能还会关闭inputStream以进行进一步的工作。
当前代码
public InputStream convertInputStream(HttpEntity entity)
{
InputStream inputStream = null;
try
{
inputStream = entity.getContent();
}
catch (IOException e11)
{
}
ZipInputStream zipInputStream = new ZipInputStream(inputStream);
Vector <String>entryVector = new Vector<String>();
ZipEntry entry;
try
{
String entryValue;
while((entry = zipInputStream.getNextEntry()) != null)
{
System.out.println("Unzipping file: " + entry.getName() + "...");
byte [] buf = new byte[(int) entry.getSize()];
zipInputStream.read(buf);
entryValue = new String(buf);
entryVector.add(entryValue);
zipInputStream.closeEntry();
}
}
catch(IOException e)
{
System.out.println("error in getting next entry.");
}
finally
{
try
{
zipInputStream.close();
}
catch (IOException e)
{
e.printStackTrace();
}
System.out.println("Unzipping done!");
}
return inputStream;
}
我希望我能尽可能清楚地表达这一点。我仍然可以看到,当我无法在此功能之外显示整个解决方案时,这是非常令人困惑的。
答案 0 :(得分:2)
如果您打印“解压缩文件”,则实际上并未解压缩任何内容。如果你想这样做,你需要使用read()函数从ZipInputStream中读取条目的内容,并将其写入文件。
编辑: 您可以尝试将输入流中的(压缩)zip文件读入字节数组。然后在该数组上创建一个ByteArrayInputStream,然后将ZipInputStream包装在其周围。然后,您可以安全地关闭输入流而不关闭基础流。
此外,请确保文件的内容为String实际上是有用的。新的String(byte [])使用默认编码创建一个字符串,所以这很可能没用。
答案 1 :(得分:1)
所以你没有通过网络“下载”?通过下载,您的意思是将文件从zip存档解压缩到本地硬盘吗?
您可以使用以下方法轻松解压缩zip文件:
private static File unZipFile(File zipFileIn) throws Exception {
ZipFile unZipFile = new ZipFile(zipFileIn);
Enumeration<? extends ZipEntry> entries = unZipFile.entries();
String topFile = null;
while (entries.hasMoreElements()) {
ZipEntry entry = (ZipEntry) entries.nextElement();
if (entry.isDirectory()) {
// Assume directories are stored parents first then children
String extractFile = entry.getName();
if (topFile == null) {
topFile = extractFile;
}
// This is not robust, just a quick solution
(new File(entry.getName())).mkdir();
continue;
}
copyInputStream(unZipFile.getInputStream(entry),new BufferedOutp utStream(new FileOutputStream(entry.getName())));
}
unZipFile.close();
File newFile = new File(zipFileIn.getParentFile().getAbsoluteFile(),topFile);
return newFile;
}
private static final void copyInputStream(InputStream in, OutputStream out) throws IOException {
byte[] buffer = new byte[1024];
int len;
while((len = in.read(buffer)) >= 0)
out.write(buffer, 0, len);
in.close();
out.close();
}
该方法返回一个File,它是解压缩文件的根目录。
或许最好更详细地询问您的问题。 ATM每个人都在猜测你要做什么而不是解决方案。
答案 2 :(得分:0)
我认为您需要阅读每个条目的内容,然后调用entry.closeEntry()
答案 3 :(得分:0)
听起来你正试图下载zip文件,同时以二进制和解压缩形式保存它。如果是这种情况,我会说首先以二进制形式下载,然后再单独解压缩文件盘。
如果您不想要两者,那么您可以选择要执行的操作,方法是将普通流写入磁盘以获取二进制zip文件(无需使用ZipInputStream);或者使用ZipInputStream并从每个条目读取数据并将其写入磁盘(但不要使用普通输入流写入磁盘)。