圧縮されたファイルデータでInputStream
を受け入れ、解凍されたデータで別のInputStream
を返す関数を作成しようとしています。
Zipファイルには1つのファイルのみが含まれるため、ディレクトリなどを作成する必要はありません。
ZipInputStream
などを見てみましたが、Javaのさまざまなタイプのストリームに混乱しています。
概念
GZipinputstreamは、gzip(拡張子「.gz」)として圧縮されたストリーム(またはファイル)用です。ヘッダー情報はありません。
GZipInputStreamは[zip形式のデータ]用です
実際のZipファイルがある場合、ZipFileを使用してファイルを開き、ファイルのリスト(例では1つ)を要求し、解凍された入力ストリームを要求する必要があります。
ZipFileは、[ヘッダー情報+ zipデータ]を持つファイル用です
ファイルがある場合、メソッドは次のようになります。
// ITS PSEUDOCODE!!
private InputStream extractOnlyFile(String path) {
ZipFile zf = new ZipFile(path);
Enumeration e = zf.entries();
ZipEntry entry = (ZipEntry) e.nextElement(); // your only file
return zf.getInputStream(entry);
}
。ZipファイルのコンテンツでInputStreamを読み取る
入力ストリームがある場合は、(@ cletusが言うように)ZipInputStreamを使用できます。ヘッダーデータを含むストリームを読み取ります。
ZipInputStreamは、[header information + zippeddata]を持つストリーム用です
重要:PCにファイルがある場合は、ZipFile
クラスを使用してランダムにアクセスできます
これは、InputStreamを介してZipファイルを読み取るサンプルです。
import Java.io.FileInputStream;
import Java.util.Zip.ZipEntry;
import Java.util.Zip.ZipInputStream;
public class Main {
public static void main(String[] args) throws Exception
{
FileInputStream fis = new FileInputStream("c:/inas400.Zip");
// this is where you start, with an InputStream containing the bytes from the Zip file
ZipInputStream zis = new ZipInputStream(fis);
ZipEntry entry;
// while there are entries I process them
while ((entry = zis.getNextEntry()) != null)
{
System.out.println("entry: " + entry.getName() + ", " + entry.getSize());
// consume all the data from this entry
while (zis.available() > 0)
zis.read();
// I could close the entry, but getNextEntry does it automatically
// zis.closeEntry()
}
}
}
入力データを変更できる場合は、GZIPInputStream
を使用することをお勧めします。
GZipInputStream
はZipInputStream
とは異なります。これは、内部にデータが1つしかないためです。したがって、入力ストリーム全体がファイル全体を表します。 ZipInputStream
では、ストリーム全体にその中のファイルの構造も含まれます。
scala構文:
def unzipByteArray(input: Array[Byte]): String = {
val zipInputStream = new ZipInputStream(new ByteArrayInputStream(input))
val entry = zipInputStream.getNextEntry
IOUtils.toString(zipInputStream, StandardCharsets.UTF_8)
}
何かが足りない場合を除いて、絶対に試してみて ZipInputStream
を使用する必要があります。そうしない理由はありません(確かに何度か使用しています)。
あなたがすべきことはZipInputStream
を試してみて、うまくいかない場合はコードを投稿してください。そうすれば、どんな問題でもお手伝いします。
ただし、何をするにしても、その機能を再発明しようとしないでください。