6

ストリームを完全に読み取る前に、ZipInputStreamのサイズを見つけて推定する方法はありますか?

たとえば、userdataを読み取る前に、getNextEntryを使用してエントリのメタデータを取得できます。

Inputstreamには、この入力ストリームから読み取ることができるバイト数の見積もりを返すためのavailable()メソッドがありますが、ZipInputStreamの同様のメソッドを見つけることができません。

4

3 に答える 3

3

ZipInputStream には available() メソッドがありますが、0 または 1 を返します。

任意のタイプのファイルの推定サイズを取得するには、FileInputStream を使用してから、ZipInputStream を使用して zip ファイルを読み取ることができます。元。

 public class ZipUtil {

    public static void main(String[] args) throws Exception {
        ZipInputStream zis = null;

        FileInputStream fis = new FileInputStream("C:/catalina.zip");
        int size = fis.available();
        System.out.println("size in KB : " + size/1024);
        zis = new ZipInputStream(fis);        

        ZipEntry ze;
        while ((ze = zis.getNextEntry()) != null) {
            System.out.println(ze.getName());
        }
    }
}
于 2012-06-19T09:46:42.667 に答える
3

ストリームだけがある場合は、そうは思いません。

zip ファイル形式には一連のエントリがあり、最後にグローバル ディレクトリ (すべてのファイルとそのサイズのテーブルがあります) があります。したがって、ファイルにアクセスしないと、その情報にアクセスできません。

于 2012-06-19T09:47:40.110 に答える
1

Inputstream には、この入力ストリームから読み取ることができる推定バイト数を返す available() メソッドがあります。

ブロックせずに。同じことではありません。この値を合計ファイル サイズとして扱わないことについて、Javadoc に特定の警告があります。

しかし、ZipInputStream の同様のメソッドを見つけることができません。

あるから不思議です。ただし、ゼロを返します。これは、ブロックせずに読み取ることができる量の最良の見積もりです。

なんで?(a) ストリームであり、(ii) 圧縮されたストリームであるためです。すべてを読まずに、その量を知る方法はありません。また、ブロックせずにどれだけ読み取れるかを知る方法はありません。

于 2012-06-19T10:29:00.663 に答える