2012-03-30 4 views
21

ZipFileクラスを使用して大きなzipファイル(250MB)を開いてエントリを読み取ろうとしました。これはエミュレータと実際のハードウェアの2.x上で正常に動作します。私がタブレット(4.0.3を走らせているAsus Transformer)やエミュレータ(3.2)で正確なコードを使用していても、私は何もエントリーを読むことができません。 ZipFileクラスのsize()関数は常にゼロを返し、ZipFileはすべてのzipエントリを返しません。タブレットのROMに付属のzipアプリでさえ、何も入力できません。 zipファイルは破損していません。私はそれをチェックした。Android 3.x + Java ZipFileクラス - 大きなファイルからZipEntriesを読み取ることができません

ZipFileから読み取るコードは、小さなzipファイルを含むすべてのバージョンで正常に動作します。 2.xと3.x/4.xの間で何が変わったのですか?

My Testfileは、HighVoltage Sid CollectionのC64Music.zipです。それは40,000以上のファイルを含み、約250MBです。

どこから見てもわかりません。

+0

3.x/4.xを実行しているAsusまたはエミュレータ上の他のzipファイルを読み込もうとしましたか?問題はこのzipファイルのみですか? –

+0

あなたは何か例外を飲み込んでいますか?そうでなければ、getName()はzipファイルの名前を返しますか? (シンプルなテストですが、何か驚くべきことが起こるかもしれません)。 OPEN_READフラグの有無にかかわらずzipを開くと、結果は異なりますか? –

+0

'JarFile'で試してみることはできますか? –

答えて

0
public class Compress { 

    private static final int BUFFER = 2048; 
    private String[] _files; 
    private String _zipFile; 
    public Compress(String[] files, String zipFile) { 
    _files = files; 
    _zipFile = zipFile; 
    } 
    public void zip() { 
    try { 
     BufferedInputStream origin = null; 
     FileOutputStream dest = new FileOutputStream(_zipFile); 
     ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(dest)); 
     byte data[] = new byte[BUFFER]; 
     for(int i=0; i < _files.length; i++) { 
     Log.v("Compress", "Adding: " + _files[i]); 
     FileInputStream fi = new FileInputStream(_files[i]); 
     origin = new BufferedInputStream(fi, BUFFER); 
     ZipEntry entry = new ZipEntry(_files[i].substring(_files[i].lastIndexOf("/") + 1)); 
     out.putNextEntry(entry); 
     int count; 
     while ((count = origin.read(data, 0, BUFFER)) != -1) { 
      out.write(data, 0, count); 
     } 
     origin.close(); 
     } 

     out.close(); 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } 

    } 

} 

Call Compress like given below where you want to zip a file :---- 

String zipFilePath = "fileName.zip"; 
File zipFile = new File(zipFilePath); 
String[] files = new String[] {"/sdcard/fileName"}; 
if(!zipFile.exists()){ 
    new Compress(files, zipFilePath).zip(); 
    } 
0

3.x/4.xでは、UIスレッドに対する不正使用を防ぐために多くの変更が加えられました。したがって、高価なディスクI/O操作を別のThreadに委託していないため、アプリがクラッシュする可能性があります。

2

これは、Android ZIPファイルの実装の既知の問題です:

http://code.google.com/p/android/issues/detail?id=23207

は、基本的にはファイルのみ65Kエントリまでサポートジップ。より多くのエントリをサポートするZip64と呼ばれるzipファイルフォーマットの拡張バージョンがあります。残念ながら、アンドロイドのZipFileはZip64を読み取ることができません。おそらく、C64Music.zipファイルがZip64形式であることがわかります

回避策は、ネイティブ実装の代わりにApache Commons Compressライブラリを使用することです。彼らのバージョンのZipFileはZip64をサポートしています:http://commons.apache.org/compress/apidocs/org/apache/commons/compress/archivers/zip/ZipFile.html

関連する問題