2012-01-23 16 views
3

私はZipInputStreamを使用して読み込み中のzipファイルに画像ファイルを束ね、AppletからZipEntryを反復処理します。私が署名したjarファイル「ze.getSize()」に、これらの画像を置くときZipInputStreamとJarInputStreamのZipEntryサイズの不一致

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); 
     } 

は、しかし-1として来ている、とイメージファイルが間違って読んできています。

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

+0

あなたが本当にint型にサイズをダウン切り捨てるべきではありません。また、以下の@ JonSkeetの答えを見てください。 – Perception

+0

jarファイルがURLからのInputStreamとして開かれたときに[JarEntry.getSize()が-1を返す可能性があります](http://stackoverflow.com/questions/8909743/jarentry-getsize-is-returning-1-when- the-jar-files-is-input-stream-f) –

+0

なぜ圧縮画像の入力ストリームを取得し、それを 'ImageIO.read(InputStream)'に渡すのはなぜですか? –

答えて

4

はい、-1サイズが不明であることを意味する - あなたがマップにそれを入れた後、基本的には...しかし、再び

をそれをフェッチしている理由は明らかではないですが、サイズが不明な場合は、読書を維持する必要がありますreadまでバッファは-1を返します。 1つの簡単な方法は、ByteArrayOutputStreamを作成し、ZipEntryからコピーを続けます。読み終えたら、ByteArrayOutputStreamからバイト配列を取得するだけです。必要なサイズ変更はすべて処理されます。

2

この質問はJarEntry.getSize() is returning -1 when the jar files is opened as InputStream from URLに似ており、答えは同じです。

javadocでは、サイズを特定できない場合、そのメソッドは-1を返します。そして(Tom Hawtinによると)返されるサイズは非負である可能性があります...そして間違っています。

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

3

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

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

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

リファレンスNegative value returned for ZipEntry.getSize()

+1

メモと同様に、OPはgetSizeから-1の戻り値を返しますが、intオーバーフローによる大きな負の数値ではありません。あなたの投稿で参照されているバグは、Java 6のアップデート18でも修正されました。 – David

関連する問題