5

ZipInputStream を使用して読み取り、アプレットから ZipEntry を反復処理している zip ファイルに多数の画像ファイルがあります。

   ZipInputStream zis = new ZipInputStream(in);
        ZipEntry ze = null;
        while ((ze = zis.getNextEntry()) != null) {
            htSizes.put(ze.getName(), new Integer((int) ze.getSize()));
            if (ze.isDirectory()) {
                continue;
            }
            int size = (int) ze.getSize();
            // -1 means unknown size.
            if (size == -1) {
                size = ((Integer) htSizes.get(ze.getName())).intValue();
            }
            byte[] b = new byte[(int) size];
            int rb = 0;
            int chunk = 0;
            while (((int) size - rb) > 0) {
                chunk = zis.read(b, rb, (int) size - rb);
                if (chunk == -1) {
                    break;
                }
                rb += chunk;
            }
            // add to internal resource hashtable
            htJarContents.put(ze.getName(), b);
        }

ただし、これらの画像を署名済みの jar に入れると、" ze.getSize()" が -1 になり、画像ファイルが正しく読み取られません。

この点で誰かが私を助けることができますか?

4

3 に答える 3

4

はい、-1 はサイズが不明であることを意味します。なぜそれをマップに入れてから再度フェッチするのかは明らかではありません..

基本的に、サイズが不明な場合は、read-1 が返されるまでバッファを読み続ける必要があります。単純な方法の 1 つは、 を作成しByteArrayOutputStream、 から にコピーし続けることZipEntryです。読み取りが完了したら、 からバイト配列を取得しますByteArrayOutputStream。必要なサイズ変更を処理します。

于 2012-01-23T13:59:09.000 に答える
3

getSize()は、エントリのデータの非圧縮サイズを返します。不明な場合は -1 を返します。

したがって、返されたサイズが負の場合は、それを 0xffffffffl に追加して正しい値を取得します。

long size = ze.getSize();
if (size < 0) {
    size = 0xffffffffl + size ;
}

参考ZipEntry.getSize()で返される負の値

于 2013-08-03T03:57:07.577 に答える
2

この質問は、 JarEntry.getSize() が URL からの InputStream として jar ファイルを開いたときに -1 を返すのと似ており、答えは同じです。

-1javadocには、サイズを特定できない場合にそのメソッドが戻ることが具体的に記載されています。また、(Tom Hawtin によると) 返されるサイズが負でない可能性もあり、正しくない可能性もあります。

肝心なのは、報告されたサイズをヒントとしてのみ扱い、ストリーム全体を展開可能なバイト バッファー (ByteArrayOutputStream など) に読み込む必要があるということです。

于 2012-01-23T14:03:57.303 に答える