【问题标题】:Exception throw when creating Path instance创建 Path 实例时抛出异常
【发布时间】:2026-01-20 20:15:02
【问题描述】:

我正在尝试使用环境变量在特定文件夹中创建 Path 类的实例。这是我的代码:

Path pathName = Paths.get(System.getenv("USER") + "/AGENDA");
System.out.println(chemin);
    if(Files.exists(pathName)) {
      System.out.println("Directory already exists!");
    }
    else 
    {
        try {
            Files.createDirectories(pathName);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("Directory newly created!");
    }

当我运行时,控制台显示:

/feujio/AGENDA
java.nio.file.AccessDeniedException: /feujio
at sun.nio.fs.UnixException.translateToIOException(UnixException.java:84)
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
at sun.nio.fs.UnixFileSystemProvider.createDirectory(UnixFileSystemProvider.java:384)
at java.nio.file.Files.createDirectory(Files.java:674)
at java.nio.file.Files.createAndCheckIsDirectory(Files.java:781)
at java.nio.file.Files.createDirectories(Files.java:767)
at File.FilePaths.createPath(FilePaths.java:44)
at File.FilePaths.main(FilePaths.java:63)

Directory newly created!

当我不使用环境变量时,它可以工作。我无法解释这种行为。

【问题讨论】:

  • 所以目录应该以斜杠开头,即/my-username/AGENDA?
  • 它显示了同样的问题。我写道:Path pathName = Paths.get("/" + System.getenv("USER") + "/AGENDA");
  • AccessDeniedException 提示你运行Java进程的用户的文件权限有问题。
  • 不使用环境变量时,目录使用什么路径?我的怀疑是你想把它放在用户的主目录中,即home/feujio/AGENDA 而不是/feujio/AGENDA
  • 当我不使用环境变量时,我设置了一个相对于我的 eclipse-workspace 文件夹的路径。我的意思是如果我设置pathName = Paths.gets("../../AGENDA"),目录将在我的 eclipse-workspace 文件夹中创建。我做pathName = Paths.get("../../../AGENDA") 然后在我想要的文件夹中创建目录。这个解决方案不满足我,因为我希望它可以在其他操作系统上工作。这里我使用的是 Linux 操作系统。

标签: java file exception java.nio.file


【解决方案1】:

Files.createDirectory()的Javadoc:

创建一个新目录。检查文件是否存在以及创建目录(如果不存在)是单个操作,相对于可能影响目录的所有其他文件系统活动而言是原子操作。 createDirectories 方法应该用在需要先创建所有不存在的父目录的地方。

[...]

如果发生 I/O 错误或父目录不存在

,则抛出 IOException

NoSuchFileException 是一个IOException

这意味着my-username 不是当前目录 中的现有目录,无论当前目录是什么。

【讨论】:

  • my-username 我的意思是在我的计算机上打开的当前会话的名称。 createDirectories 显示相同的问题:java.nio.file.NoSuchFileException : my-userName
  • @FEUJIOMarieTherese createDirectories(复数)不应该抛出那个特定的错误。你确定你正在运行更新的代码吗?堆栈跟踪肯定会显示。另外,当前目录是什么?编辑您的问题以显示更新的代码、完整的堆栈跟踪,并添加代码以显示当前目录是什么,例如通过获取pathName绝对路径
  • 我刚刚将createDirectory() 方法替换为createDirectories() 方法。好的,我编辑我的问题