必威体育Betway必威体育官网
当前位置:首页 > IT技术

File类中createNewFile方法为什么需要抛出异常而mkdirs不需要?

时间:2019-06-01 15:43:06来源:IT技术作者:seo实验室小编阅读:60次「手机版」
 

createnewfile

问题

在学习对硬盘文件操作类File时我们会遇到如下的情况:

我们来创建一个新文件:

public class FileTest {
    public static void main(String[] args) {
        testOfcreatenewfile();//报错
    }

public static void testOfCreateNewFile(){
        File file = new File("D:\\javaspace\\study.txt");
        boolean isNewFile = false;
        isNewFile = file.createNewFile();//报错
        System.out.println(isNewFile);
    }

编译器一般会报错:Unhandled exception: java.io.IOException,意思是没有进行IO异常的处理。这里我们很奇怪?我们的代码语法上是没有错误的为什么编译不通过?我们其实忽略了方法中潜在的异常:如果路径中的javaspace目录不存在呢?或者说在多线程文件被中途删除了呢?所以系统会提示我们去处理或者抛出这个异常,我的博客里有一篇博客专门讲了如何去处理这个异常,这里我们简单的写书正确处理异常的代码即可:

  public static void testOfCreateNewFile(){
        File file = new File("D:\\javaspace_idea\\texture\\study.txt");
        boolean isNewFile = false;
        try {
            isNewFile = file.createNewFile();
        } catch (IOException e) {
            e.printstacktrace();
        } finally {
        }
        System.out.println(isNewFile);
    }

然后我们再来看看创建目录的过程:

public class FileTest {
    public static void main(String[] args) {
       testOfmkdirs();
    }

 public static void testOfMkdirs(){
        File file = new File("D:\\a\\b\\c");
        boolean isMadirs;
        isMadirs = file.mkdirs();
        System.out.println(isMadirs);
    }

这里编译器是可以编译通过的,没有要求我们对异常进行处理,那你可能问了,如果父路径中a、b文件夹不存在的话不是类似于上述的创建文件出现的IO异常吗?这个问题是值得我们去深究的。

解释

首先我们查询一下官方的文档:

CNF

MKD

官方文档中的createNewFile方法中标注的需要抛出异常的,但是mkdirs是没有标注的,其实到这里我们就可以解决这个问题了,但是我们想知道它到底为什么不需要抛出异常,这里我们就需要看mkdirs方法到底是如何实现的。所以我们打开了File类中的mkdirs方法:

//File中mkdirs的实现
  public boolean mkdirs() {
        if (exists()) {
            return false;
        }
        if (mkdir()) {//【1】
            return true;
        }
        File canonFile = null;
        try {//【2】
            canonFile = getcanonicalFile();
        } catch (IOException e) {
            return false;
        }

        File parent = canonFile.getParentFile();
        return (parent != null && (parent.mkdirs() || parent.exists()) &&
                canonFile.mkdir());//【3】
    }

这里我们不去完整解释这个代码的意思,我们从三个地方来看看:首先【1】中出现了mkdir()方法,我们知道mkdir和mkdirs的区别就是s可以在父目录不存在的情况下创建父目录,而mkdir是不行的,这说明mkdirs和mkdir是有关系的。再来看【2】是一个对异常的处理,也许到这里你可以大致明白为什么mkdirs不用抛出异常了吧,因为方法内部已经对异常进行了处理。这里还选了第三个地方进行解释【3】:我们奇怪为什么mkdirs能创建父目录,其实这里出现的mkdir迭代已经说明问题,mkdirs中其实在父目录不存在的时候会进行判断,然后迭代mkdir来创建父目录,直至它存在,所以总结下来这个方法是不需要处理异常的。

相关阅读

JAVA-FileInputStream之read方法

  关于FileInputStream  它用于读取本地文件中的字节数据,继承自InputStream类,由于所有的文件都是以字节为向导,因此它适用于操

-bash: ls: No such file or directory 错误的原因及

ubuntu出现如下错误: { Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.15.0-42-generic x86_64) * Documentation:  https://help.

No input file specified. phpStudy nginx报错解决方

No input file specified. phpStudy nginx报错解决方案 排查1:检查这个目录是否存在,路径是否错误 排查2:vhost.conf配置文件 serv

WritePrivateProfileString

在我们写的程序当中,总有一些配置信息需要保存下来,以便完成程序的功能,最简单的办法就是将这些信息写入INI文件中,程序初始化时

CreateFile函数详解

CreateFile函数详解 CreateFile 函数创建或打开下列对象,并返回一个可以用来访问这些对象的句柄。  文件 pipes 邮槽  通信

分享到:

栏目导航

推荐阅读

热门阅读