2012-03-30 21 views
21

Nếu tôi mở một tệp zip lớn (250MB) qua lớp ZipFile và cố gắng đọc các mục nhập. Điều này hoạt động tốt trên 2.x trong giả lập và phần cứng thực. Nếu tôi sử dụng chính xác một số mã trên máy tính bảng của tôi (Asus Transformer chạy 4.0.3) hoặc trình mô phỏng (3.2), tôi không thể đọc bất kỳ mục nhập nào. Hàm size() của lớp ZipFile luôn trả về số không và ZipFile không trả về bất kỳ mục zip nào. Ngay cả một ứng dụng zip đi kèm với ROM trên máy tính bảng của tôi không thể đọc bất kỳ mục nhập nào. Tệp zip không bị hỏng. Tôi đã kiểm tra nó.Android 3.x + Java ZipFile Class - Không thể đọc ZipEntries từ các tệp lớn

Mã để đọc từ ZipFile hoạt động tốt trên tất cả các phiên bản có tệp zip nhỏ hơn. Điều gì đã thay đổi giữa 2.x và 3.x/4.x ??

My Testfile là C64Music.zip từ Bộ sưu tập HighVoltage Sid. Nó chứa hơn 40.000 tập tin và khoảng 250MB.

Tôi không biết phải nhìn vào đâu.

+0

Bạn đã thử đọc các tệp zip khác trên Asus hoặc trình mô phỏng đang chạy 3.x/4.x chưa? Có phải vấn đề chỉ với tệp zip này không? –

+0

Bạn có nuốt bất kỳ ngoại lệ nào không? Nếu không, getName() trả về tên của tệp zip? (Thử nghiệm đơn giản, nhưng có thể bật lên một cái gì đó đáng ngạc nhiên). Bạn có nhận được bất kỳ kết quả nào khác không nếu bạn mở zip có hoặc không có cờ OPEN_READ? –

+0

Tôi không chắc chắn, bạn có thể thử với 'JarFile'? ... –

Trả lời

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

Rất nhiều thay đổi được thực hiện trong 3.x/4.x để ngăn chặn lạm dụng chống lại chuỗi giao diện người dùng. Do đó, có thể ứng dụng của bạn đang gặp sự cố do bạn không tải xuống hoạt động I/O đĩa đắt tiền đến một số riêng biệt Thread.

2

Đây là một vấn đề được biết đến với việc thực hiện ZipFile android:

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

Về cơ bản nén file chỉ hỗ trợ lên đến 65k mục. Có một phiên bản mở rộng của định dạng tệp zip được gọi là Zip64, hỗ trợ số lượng mục nhập lớn hơn. Thật không may ZipFile trên Android không thể đọc Zip64. Có thể bạn sẽ thấy rằng tệp C64Music.zip có định dạng Zip64

Một công việc xung quanh là sử dụng thư viện Apache Commons Compress thay vì triển khai gốc. Phiên bản ZipFile của họ hỗ trợ Zip64: http://commons.apache.org/compress/apidocs/org/apache/commons/compress/archivers/zip/ZipFile.html