ストリームを完全に読み取る前に、ZipInputStreamのサイズを見つけて推定する方法はありますか?
たとえば、userdataを読み取る前に、getNextEntryを使用してエントリのメタデータを取得できます。
Inputstreamには、この入力ストリームから読み取ることができるバイト数の見積もりを返すためのavailable()メソッドがありますが、ZipInputStreamの同様のメソッドを見つけることができません。
ストリームを完全に読み取る前に、ZipInputStreamのサイズを見つけて推定する方法はありますか?
たとえば、userdataを読み取る前に、getNextEntryを使用してエントリのメタデータを取得できます。
Inputstreamには、この入力ストリームから読み取ることができるバイト数の見積もりを返すためのavailable()メソッドがありますが、ZipInputStreamの同様のメソッドを見つけることができません。
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());
}
}
}
ストリームだけがある場合は、そうは思いません。
zip ファイル形式には一連のエントリがあり、最後にグローバル ディレクトリ (すべてのファイルとそのサイズのテーブルがあります) があります。したがって、ファイルにアクセスしないと、その情報にアクセスできません。
Inputstream には、この入力ストリームから読み取ることができる推定バイト数を返す available() メソッドがあります。
ブロックせずに。同じことではありません。この値を合計ファイル サイズとして扱わないことについて、Javadoc に特定の警告があります。
しかし、ZipInputStream の同様のメソッドを見つけることができません。
あるから不思議です。ただし、ゼロを返します。これは、ブロックせずに読み取ることができる量の最良の見積もりです。
なんで?(a) ストリームであり、(ii) 圧縮されたストリームであるためです。すべてを読まずに、その量を知る方法はありません。また、ブロックせずにどれだけ読み取れるかを知る方法はありません。