我有一个应用程序,它下载一个zip并解压缩我SDCard上的文件.
一切正常,但是当我的同事在他的Mac(狮子)上创建zip文件时,我的所有文件都有
大小:-1
CRC:-1
compressedsize:-1
我无法将文件写入我的SD卡.两个拉链具有完全相同的内容,唯一的区别在于它们最初压缩的位置.这是我解压缩文件的代码:
public class UnzipTask extends AsyncTask<String, Integer, VoID> { private static final String TAG = UnzipTask.class.getSimplename(); private String mDestLocation; private ZipListener mListener; private Context mCtx; private int mCallbackID; public UnzipTask(Context context, ZipListener Listener, file dir) { mCtx = context; mListener = Listener; mDestLocation = dir.getabsolutePath() + "/"; } public voID setID(int ID) { mCallbackID = ID; } @OverrIDe protected VoID doInBackground(String... arg0) { try { String file = arg0[0]; inputStream is = mCtx.getAssets().open(file); unzipfile(is); } catch (IOException e) { e.printstacktrace(); } catch (Exception e) { e.printstacktrace(); } return null; } /** * Private function that ensures a directory exist * @param dir */ private voID _dirChecker(String dir) { file f = new file(mDestLocation + dir); if (!f.isDirectory()) { f.mkdirs(); } } private voID unzipfile(inputStream input) throws Exception { ZipinputStream zin = new ZipinputStream(input); ZipEntry ze = null; while ((ze = zin.getNextEntry()) != null) { Log.v(TAG, "UnzipPing " + ze.getname()); if(mListener != null) { mListener.onUnzipped(mCallbackID, ze.getname(), ze.g etSize(), ze.getCrc(), ze.getCompressedSize()); } if (ze.isDirectory()) { _dirChecker(ze.getname()); } else if (ze.getCompressedSize() > 0 && ze.getSize() > 0 && ze.getCrc() != 0.0) { // If size=-1 -> writing to disk fails String fileOutput = mDestLocation + ze.getname(); fileOutputStream fout = new fileOutputStream(fileOutput); int read = 0; byte[] buffer = new byte[(int) ze.getSize()]; while ((read = zin.read(buffer)) >= 0) { fout.write(buffer, 0, read); } zin.closeEntry(); fout.close(); } else { Log.v(TAG, "SkipPing entry" + ze.getname()); } } } zin.close(); }}
几个笔记
1)我可以在windows 7上解压缩这两个文件
2)我的同事可以在他的Mac上解压缩这两个文件
3)唯一的问题是,在AndroID上我无法解压缩MAC创建的zip文件…
题:
有谁知道为什么在Mac上压缩的zip文件有这些无效的大小?我的解压缩过程(在AndroID上)是否遗漏了一些代码?
如果你愿意,你可以在这里下载拉链,以及一个非常小的apk来显示输出:
编辑:更新链接
Zip file (zipped on a Mac)
Zip file (zippen on Win7)
Demo.apk
解决方法:
该问题与版本有关.让我从我的Mac(10.8)的一些输出开始:
~ $zipinfo -m test_mac.zip Archive: test_mac.zip 1694 bytes 8 filesdrwxr-xr-x 2.1 unx 0 bx 0% stor 10-Aug-12 01:11 test_win/-rwxr-xr-x 2.1 unx 46 bX 20% defN 10-Aug-12 01:11 test_win/index.HTMLdrwxrwxr-x 2.1 unx 0 bx 0% stor 10-Aug-12 01:12 __MACOSX/drwxrwxr-x 2.1 unx 0 bx 0% stor 10-Aug-12 01:12 __MACOSX/test_win/-rw-r--r-- 2.1 unx 211 bX 37% defN 10-Aug-12 01:11 __MACOSX/test_win/._index.HTML-rwxr-xr-x 2.1 unx 9 bX-21% defN 10-Aug-12 01:10 test_win/version.txt-rw-r--r-- 2.1 unx 211 bX 37% defN 10-Aug-12 01:10 __MACOSX/test_win/._version.txt-rw-r--r-- 2.1 unx 211 bX 37% defN 10-Aug-12 01:11 __MACOSX/._test_win8 files, 688 bytes uncompressed, 450 bytes compressed: 34.6%~ $zipinfo -m test_win.zip Archive: test_win.zip 1678 bytes 8 filesdrwx--- 3.1 fat 0 bx 0% stor 10-Aug-12 09:11 test_win/-rw-a-- 3.1 fat 46 bx 20% defN 10-Aug-12 09:11 test_win/index.HTML-rw-a-- 3.1 fat 9 bx-21% defN 10-Aug-12 09:10 test_win/version.txtdrwx--- 3.1 fat 0 bx 0% stor 10-Aug-12 09:12 __MACOSX/-rw-a-- 3.1 fat 211 bx 37% defN 10-Aug-12 09:11 __MACOSX/._test_windrwx--- 3.1 fat 0 bx 0% stor 10-Aug-12 09:12 __MACOSX/test_win/-rw-a-- 3.1 fat 211 bx 37% defN 10-Aug-12 09:11 __MACOSX/test_win/._index.HTML-rw-a-- 3.1 fat 211 bx 37% defN 10-Aug-12 09:10 __MACOSX/test_win/._version.txt8 files, 688 bytes uncompressed, 450 bytes compressed: 34.6%
看看第二个字段(mac文件中的2.1和win文件中的3.1).这是压缩文件的ZIP存档格式版本. java.util.zip实现仅支持版本2.50及更高版本的ZIP文件格式(请参阅此StackOverflow).
Mac的Compress …菜单选项使用低于Java实现支持的版本(2.1仍然在10.8中使用).
告诉你的同事使用命令行工具(例如zip -r myfile.zip directory_to_compress /),你应该得到AndroID应用程序可以膨胀的输出.
总结以上是内存溢出为你收集整理的Android解压缩在Mac上压缩的文件全部内容,希望文章能够帮你解决Android解压缩在Mac上压缩的文件所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)