在手机上有个功能需求,需要把压缩包解压到指定目录下,压缩包里包含两层目录(例如:css/popsystem.css),之前代码如下
/**
* 解压一个压缩文档(包含子目录) 到指定位置
* @param zipFileName 压缩包的名字
* @param outputDirectory 指定的路径
* @throws Exception
*/
public static void unzip(String zipFileName, String outputDirectory) throws Exception {
File file_zip = new File(zipFileName);
ZipInputStream in = new ZipInputStream(new FileInputStream(file_zip));
ZipEntry z;
String[] files = null;
while ((z = in.getNextEntry()) != null) {
if (z.isDirectory()) {
String name = z.getName();
name = name.substring(0, name.length() - 1);
File f = new File(outputDirectory + File.separator + name);
f.mkdir();
} else {
files = z.getName().split("/");
File f = null;
f = new File(outputDirectory + File.separator + z.getName());
f.createNewFile();
FileOutputStream out = new FileOutputStream(f);
int count;
byte data[] = new byte[BUFFER];
while ((count = in.read(data, 0, BUFFER)) != -1) {
out.write(data, 0, count);
out.flush();
}
out.close();
}
}
in.close();
//删除压缩包
file_zip.delete();
}
在Android手机上运行一切正常,当Android平板运行时直接报错,报错信息主要如下
1.FileNotFoundException (No such file or directory)
2.open failed: ENOENT (No such file or directory)
通过查看报错信息+跟断点,发现是在FileOutputStream(f)写入数据处失败,看报错信息应该是没有找到有效路径,打开平板存储至解压的路径时发现只有原始压缩包在,css文件夹和popsystem.css文件都没有,而在手机上直接是css文件夹,文件夹里面是popsystem.css文件,结合报错信息来看应该是Android平板系统创建文件夹和文件过程中出现问题,网上搜索错误信息大部分都提到createNewFile(),mkdir(),mkdirs()方法,针对这三个创建方法具体使用区别如下
1、createNewFile():只能用来创建文件,且只能在已存在的目录下创建文件,否则会创建失败。(当需要创建的文件存在二级文件夹,手机系统先创建缺少的二级文件夹,再创建文件,Android平板系统创建失败)
2、mkdir():只能用来创建文件夹,且只能创建一级目录,如果上级不存在,就会创建失败。
3、mkdirs():只能用来创建文件夹,且能创建多级目录 ,如果上级不存在,就会自动创建。(创建文件夹多用此)
针对以上方法的具体用法,对以上代码做如下调整
/**
* 解压一个压缩文档(包含子目录) 到指定位置
* @param zipFileName 压缩包的名字
* @param outputDirectory 指定的路径
* @throws Exception
*/
public static void unzip(String zipFileName, String outputDirectory) throws Exception {
File file_zip = new File(zipFileName);
ZipInputStream in = new ZipInputStream(new FileInputStream(file_zip));
ZipEntry z;
String[] files = null;
while ((z = in.getNextEntry()) != null) {
if (z.isDirectory()) {
String name = z.getName();
name = name.substring(0, name.length() - 1);
File f = new File(outputDirectory + File.separator + name);
f.mkdir();
} else {
files = z.getName().split("/");//css/popsystem.css拆分成["css","popsystem.css"]数组
File f = null;
if (files.length >= 1) {
createFileDirectory(outputDirectory, files);
}
f = new File(outputDirectory + File.separator + z.getName());
FileOutputStream out = new FileOutputStream(f);
int count;
byte data[] = new byte[BUFFER];
while ((count = in.read(data, 0, BUFFER)) != -1) {
out.write(data, 0, count);
out.flush();
}
out.close();
}
}
in.close();
//删除压缩包
file_zip.delete();
}
/**
*由于Android平板和手机存在系统差异,解压文件过程中需要做如下区分
* @param filePath 文件目录
* @param files 需要解压的文件目录+文件/文件 组成的数组 例如:["css","popsystem.css"]或者["kpi_html.html"]
*/
public static void createFileDirectory(String filePath, String[] files) {
File file = null;
try {
if (files.length == 1) {//没有分级目录,只是一个文件的情况 例如:只有一个 kpi_html.html 文件
file = new File(filePath + files[0]);
if (!file.exists()) {
file.createNewFile();//创建文件
}
} else {//存在分级目录情况,例如:css/popsystem.css
file = new File(filePath + files[0]);
if (!file.exists()) {
file.mkdir();//创建文件夹
}
file = new File(filePath + files[0] + File.separator + files[1]);
if (!file.exists()) {
file.createNewFile();//创建文件
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
OK,手机、平板顺利运行。
如有不准确之处,还请各位指教!