web-dev-qa-db-ja.com

InputStreamからファイルを解凍し、別のInputStreamを返す

圧縮されたファイルデータでInputStreamを受け入れ、解凍されたデータで別のInputStreamを返す関数を作成しようとしています。

Zipファイルには1つのファイルのみが含まれるため、ディレクトリなどを作成する必要はありません。

ZipInputStreamなどを見てみましたが、Javaのさまざまなタイプのストリームに混乱しています。

27

概念

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()
        }
    }
}
45
helios

入力データを変更できる場合は、GZIPInputStreamを使用することをお勧めします。

GZipInputStreamZipInputStreamとは異なります。これは、内部にデータが1つしかないためです。したがって、入力ストリーム全体がファイル全体を表します。 ZipInputStreamでは、ストリーム全体にその中のファイルの構造も含まれます。

6
nanda

scala構文:

def unzipByteArray(input: Array[Byte]): String = {
    val zipInputStream = new ZipInputStream(new ByteArrayInputStream(input))
    val entry = zipInputStream.getNextEntry
    IOUtils.toString(zipInputStream, StandardCharsets.UTF_8)
}
4

何かが足りない場合を除いて、絶対に試してみて ZipInputStream を使用する必要があります。そうしない理由はありません(確かに何度か使用しています)。

あなたがすべきことはZipInputStreamを試してみて、うまくいかない場合はコードを投稿してください。そうすれば、どんな問題でもお手伝いします。

ただし、何をするにしても、その機能を再発明しようとしないでください。

2
cletus