【发布时间】:2011-03-13 05:24:13
【问题描述】:
背景
目前,我尝试通过带有 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;
}
我希望我能够尽可能清楚地表达这一点。我仍然可以看到,当我无法在此函数之外显示整个解决方案时,这很难理解。
【问题讨论】:
-
"正在尝试下载相同的 zip 文件,链接更改,我无法访问该文件。" - 你能在这里提供更多细节吗?
-
嗯。说链接更改可能不是真的,但是浏览器说找不到文件,所以不知何故,名称已损坏?我的理论是,在关闭 zipInputStream 的同时,我也在关闭底层流; inputStream(该函数执行后使用)。
-
浏览器如何参与?您的示例读取一个 zip 文件,打印文件名,然后关闭该 zip 文件。浏览器从何而来?
-
是的,这与错误无关,我的解释不好。调用 zipInputStream.close() 时,我得到了上面更新的异常。 edit 我清理了这个问题。 /编辑
-
这个方法的目的是什么?
标签: java inputstream zipinputstream