日期:2014-05-20  浏览次数:20923 次

请问为什么IO中生成文件createNewFile()会抛出IOException而生成文件夹mkdir()却不会?
请问为什么生成新文件会抛出IOException而文件夹却不会呢?
按理来说,不管生成文件或者文件夹,都会有同名文件或文件夹已存在的风险,因此都应该抛出IOException啊?
以下是源代码:

    public boolean createNewFile() throws IOException {
SecurityManager security = System.getSecurityManager();
if (security != null) security.checkWrite(path);
return fs.createFileExclusively(path, false);
    }

    public boolean mkdirs() {
if (exists()) {
    return false;
}
if (mkdir()) {
      return true;
  }
        File canonFile = null;
        try {
            canonFile = getCanonicalFile();
        } catch (IOException e) {
            return false;
        }

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

------解决方案--------------------
有一点createNewFile()并不是因为文件存在而发生io异常,io异常是由本地方法在创建文件时所发生的,可以去了解一下c创建文件以及文件夹的机制
------解决方案--------------------
createNewFile() 时可能它的某个父文件夹不存在 比如c:/a/b/1.txt 如果C盘下没有一个文件夹叫 a 的话,就会抛如下异常:
   Exception in thread "main" java.io.IOException: 系统找不到指定的路径。
at java.io.WinNTFileSystem.createFileExclusively(Native Method)
at java.io.File.createNewFile(File.java:883)
at cn.test.Ts.main(Ts.java:13)

因为这个Native Method没有创建父文件夹的功能

为了创建这个文件 就要调用 someFile.getParentFile().mkdirs()方法
然后就能创建 因为是mkdirs()方法会递归的调用自身:“&& (parent.mkdirs() " ,直到要创建的文件夹的父文件夹存在:
    if (mkdir()) {          return true;      } 
所以不会发生找不到路径的情况 就不需要抛ioexception
找不到路径我就一直创建