背景
現在、HTTP サーブレットを介して HTTP リクエストで zip ファイルを取得しようとしています。受信した zip ファイルには、3 つの異なるファイルが含まれています。これらのファイルにはフィルターで除外したい情報が含まれており、ソースからこれを行うことはオプションではありません (その方がはるかに優れていることはわかっていますが)。
ファイルが最初からビルドされているソースからファイル内の一部の情報を除外できないため、私の解決策は、ファイルを解凍し、これら 3 つのファイルを文字列として読み取ってからフィルター処理することです。最後に、すべてを「zipfile」(inputStream) として「再構築」し、inputStream を返します。
問題
現在、ファイルの解凍とフィルタリングを処理するクラスを作成しました。最後に、zip ファイルと 3 つのファイルを含む新しい inputStream を返したいだけです。
HTTPエンティティからコンテンツをinputStreamに取得し、このinputStreamを解凍して、3つのファイルを3つの文字列として取得するところまで来ました。これが機能するかどうかを確認するために、現在、それらを解凍して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;
}
これをできるだけ明確に表現できればと思います。この関数の外にソリューション全体を表示できない場合、これを理解するのが非常に混乱していることは今でもわかります。