请问为什么IO中生成文件createNewFile()会抛出IOException而生成文件夹mkdir()却不会?

时间:2021-04-08 12:28:09
请问为什么生成新文件会抛出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());
    }

5 个解决方案

#1


有一点createNewFile()并不是因为文件存在而发生io异常,io异常是由本地方法在创建文件时所发生的,可以去了解一下c创建文件以及文件夹的机制

#2


和path有关,你可以试下,path= C:/和path=c:/cs.txt

#3


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
找不到路径我就一直创建

#4


同意楼上!

引用 3 楼 deduct1 的回复:
createNewFile() 时可能它的某个父文件夹不存在 比如c:/a/b/1.txt 如果C盘下没有一个文件夹叫 a 的话,就会抛如下异常:
   Exception in thread "main" java.io.IOException: 系统找不到指定的路径。
at java.io.WinNTFileSystem.createFileExclusively……

#5


老兄,我最近也刚好碰到你这个问题,debug了很久,最后才发现:
1.可能是路径问题。
*2.可能是你之前对目录调用了createNewFile,如dir="C:/dir";dir.createNewFile().
这样,就生成了一个没有类型的文件dir,然后你在dir文件下建立文件“a.txt”,那肯定会报not a directory错误。
因为dir是没有类型的 文件而不是 文件夹

因此,你不该对 文件夹路径调用createNewFile,这样会带来隐藏的问题。

#1


有一点createNewFile()并不是因为文件存在而发生io异常,io异常是由本地方法在创建文件时所发生的,可以去了解一下c创建文件以及文件夹的机制

#2


和path有关,你可以试下,path= C:/和path=c:/cs.txt

#3


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
找不到路径我就一直创建

#4


同意楼上!

引用 3 楼 deduct1 的回复:
createNewFile() 时可能它的某个父文件夹不存在 比如c:/a/b/1.txt 如果C盘下没有一个文件夹叫 a 的话,就会抛如下异常:
   Exception in thread "main" java.io.IOException: 系统找不到指定的路径。
at java.io.WinNTFileSystem.createFileExclusively……

#5


老兄,我最近也刚好碰到你这个问题,debug了很久,最后才发现:
1.可能是路径问题。
*2.可能是你之前对目录调用了createNewFile,如dir="C:/dir";dir.createNewFile().
这样,就生成了一个没有类型的文件dir,然后你在dir文件下建立文件“a.txt”,那肯定会报not a directory错误。
因为dir是没有类型的 文件而不是 文件夹

因此,你不该对 文件夹路径调用createNewFile,这样会带来隐藏的问题。