我从网上获得了以下代码,它看起来一切正常,但我发现文件未找到异常......
我在sdcard中有一个名为 NewForestPonies.epub 的文件
许可:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
代码:
String ZipFileLocation=Environment.getExternalStorageDirectory()+"/NewForestPonies.epub";
String unZipFileLocation=Environment.getExternalStorageDirectory()+"/DEST/";
Decompress decomp=new Decompress(ZipFileLocation, unZipFileLocation, "zip");
decomp.run();
public Decompress(String zipFile, String location,String t) {
super(t);
_zipFile = zipFile;
_location = location;
}
public void run() {
FileInputStream fin=null;
ZipInputStream zin=null;
File file =null;
ZipEntry ze ;
FileOutputStream fout=null;
try{
System.out.println(_zipFile );
System.out.println(_location);
fin = new FileInputStream(_zipFile);
zin = new ZipInputStream(fin);
ze= null;
byte[] buffer = new byte[1024];
int length;
while ((ze = zin.getNextEntry()) != null) {
file = new File((_location +"/" + ze.getName()));
file.getParentFile().mkdirs();
fout= new FileOutputStream(_location + ze.getName());
while ((length = zin.read(buffer))>0) {
fout.write(buffer, 0, length);
}
zin.closeEntry();
fout.close();
}
//MyDownloadListener.progress=70;
zin.close();
}catch(Exception e) {
Log.e("Decompress", "unzip", e);
}
finally {
try {
fin.close();
zin.close();
fout.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
ERRROR:
03-20 15:49:15.909: ERROR/Decompress(9479): java.io.FileNotFoundException: /mnt/sdcard/DEST/NewForestPonies/iTunesMetadata.plist (Not a directory)
03-20 15:49:15.909: ERROR/Decompress(9479): at org.apache.harmony.luni.platform.OSFileSystem.open(Native Method)
03-20 15:49:15.909: ERROR/Decompress(9479): at dalvik.system.BlockGuard$WrappedFileSystem.open(BlockGuard.java:239)
03-20 15:49:15.909: ERROR/Decompress(9479): at java.io.FileOutputStream.<init>(FileOutputStream.java:101)
03-20 15:49:15.909: ERROR/Decompress(9479): at java.io.FileOutputStream.<init>(FileOutputStream.java:77)
03-20 15:49:15.909: ERROR/Decompress(9479): at com.AndroidExplorer.Decompress.run(Decompress.java:42)
03-20 15:49:15.909: ERROR/Decompress(9479): at com.AndroidExplorer.DecompressActivity.onCreate(DecompressActivity.java:23)
03-20 15:49:15.909: ERROR/Decompress(9479): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048)
03-20 15:49:15.909: ERROR/Decompress(9479): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1715)
03-20 15:49:15.909: ERROR/Decompress(9479): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1767)
03-20 15:49:15.909: ERROR/Decompress(9479): at android.app.ActivityThread.access$1500(ActivityThread.java:122)
03-20 15:49:15.909: ERROR/Decompress(9479): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1005)
03-20 15:49:15.909: ERROR/Decompress(9479): at android.os.Handler.dispatchMessage(Handler.java:99)
03-20 15:49:15.909: ERROR/Decompress(9479): at android.os.Looper.loop(Looper.java:132)
03-20 15:49:15.909: ERROR/Decompress(9479): at android.app.ActivityThread.main(ActivityThread.java:4028)
03-20 15:49:15.909: ERROR/Decompress(9479): at java.lang.reflect.Method.invokeNative(Native Method)
03-20 15:49:15.909: ERROR/Decompress(9479): at java.lang.reflect.Method.invoke(Method.java:491)
03-20 15:49:15.909: ERROR/Decompress(9479): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
03-20 15:49:15.909: ERROR/Decompress(9479): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
03-20 15:49:15.909: ERROR/Decompress(9479): at dalvik.system.NativeStart.main(Native Method)
答案 0 :(得分:4)
我认为你的代码中的问题是你在第一次循环中关闭 ZipInputStream zin 。
使用以下代码 run(),它可能对您有帮助。
public void run() {
BufferedOutputStream bufferedOutputStream = null;
FileInputStream fileInputStream;
File dest_file = new File(_location);
dest_file.mkdirs(); // creates if destination directory not existed
try {
fileInputStream = new FileInputStream(_zipFile);
ZipInputStream zipInputStream = new ZipInputStream(new BufferedInputStream(fileInputStream));
ZipEntry zipEntry;
while ((zipEntry = zipInputStream.getNextEntry()) != null) {
String zipEntryName = zipEntry.getName();
File file = new File(_location + zipEntryName);
if (file.exists()) {
} else if (zipEntry.isDirectory()) {
file.mkdirs();
} else {
byte buffer[] = new byte[1024];
FileOutputStream fileOutputStream = new FileOutputStream(file);
bufferedOutputStream = new BufferedOutputStream(fileOutputStream, 1024);
int count;
while ((count = zipInputStream.read(buffer, 0, 1024)) != -1) {
bufferedOutputStream.write(buffer, 0, count);
}
bufferedOutputStream.flush();
bufferedOutputStream.close();
}
}
zipInputStream.close();
} catch (Exception e) {
Log.e("Decompress", "unzip", e);
}
}
答案 1 :(得分:2)
您可以先尝试创建新文件吗?
file = new File((_location +"/" + ze.getName()));
file.getParentFile().mkdirs();
if (!file.isFile())
file.createNewFile();
...
答案 2 :(得分:0)
我猜你要解压缩的ZIP文件位于/ mnt / sdcard / EPUB /,但在你的代码中你试图访问可能驻留在META-INF /目录中的container.xml ZIP文件(我没有该文件,所以这里大概是猜测。)
所以你应该做的是传递ZIP文件的位置(例如/mnt/sdcard/EPUB/book1.epub),如下所示:
Decompress("/mnt/sdcard/EPUB/book1.epub", "/mnt/sdcard/EPUB",t)
之后,您可以使用自己的代码在/mnt/sdcard/EPUB/META-INF/container.xml打开未压缩的container.xml
答案 3 :(得分:0)
检查返回值:
boolean result = file.getParentFile().mkdirs();
如果返回false
,则不会创建目录。这可以解释为什么你在异常中获得“(不是目录)”。
mkdirs()的文档说:
请注意,此方法在失败时不会抛出IOException。呼叫者 必须检查返回值。
尝试创建如下目录:
boolean result = (new File(_location, ze.getName())).getParentFile().mkdirs();
这可以避免弄乱'/'分隔符。
答案 4 :(得分:0)
while ((ze = zin.getNextEntry()) != null) {
if (ze.isDirectory()) {
file = new File((_location, ze.getName()));
if (!file.exists())
file.mkdirs();
continue;
}
file = new File((_location +"/" + ze.getName()));
// file.getParentFile().mkdirs();
fout= new FileOutputStream(_location + ze.getName());
while ((length = zin.read(buffer))>0) {
fout.write(buffer, 0, length);
}
zin.closeEntry();
fout.close();
}
答案 5 :(得分:0)
异常显示它不是目录,因此在您的代码中 -
while ((ze = zin.getNextEntry()) != null) {
file = new File((_location +"/" + ze.getName()));
**if(file.isDirectory())**
file.getParentFile().mkdirs();
fout= new FileOutputStream(_location + ze.getName());
while ((length = zin.read(buffer))>0) {
fout.write(buffer, 0, length);
}
zin.closeEntry();
fout.close();
}