android 平板 open failed: ENOENT (No such file or directory) 解决

在手机上有个功能需求,需要把压缩包解压到指定目录下,压缩包里包含两层目录(例如: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,手机、平板顺利运行。

如有不准确之处,还请各位指教!

猜你喜欢

转载自blog.csdn.net/caijinghuacaijinghua/article/details/82951928