使用nio创建文件时出现NoSuchFileException

时间:2015-06-09 14:58:19

标签: java file-io nio

我正在尝试使用java nio创建一个新文件,而且我遇到了一个createFile错误。错误如下所示:

 createFile error: java.nio.file.NoSuchFileException: /Users/jchang/result_apache_log_parser_2015/06/09_10:53:49

代码段如下所示:

 String filename = "/Users/jchang/result_apache_log_parser_" + filename_date;
        Path file = Paths.get(filename);
        try {
            Files.createFile(file);
        } catch (FileAlreadyExistsException x) {
            System.err.format("file named %s" +
                    " already exists%n", file);
        } catch (IOException x) {
            System.err.format("createFile error: %s%n", x);
        }

任何人都知道如何解决这个问题?谢谢你的帮助!

3 个答案:

答案 0 :(得分:6)

我会说图灵85是正确的。您的filename_date变量中包含斜杠。所以/Users/jchang/result_apache_log_parser_2015必须作为目录存在。这是NoSuchFileException,缺少目录的原因。

答案 1 :(得分:3)

您的代码至少有两个问题。首先:您的文件名中包含路径分隔符(/)。第二:至少在Windows下,您的解决方案在filname(:)中包含非法字符。

要解决第一个问题,您可以选择两条路线:a)创建您需要的所有文件夹,或者b)将分隔符更改为不同的分隔符。我会解释两者。

要创建路径的所有文件夹,只需调用

即可
Files.createDirectories(path.getParent());

其中path是一个文件(重要!)。通过调用getParent()文件,我们将获得path所在的文件夹。 Files.createDirectories(...)负责其余的工作。

b)更改分隔符:没有比这更容易的了:

String filename =  "/Users/jchang/result_apache_log_parser_"
                 + filename_date.replace("/", "_")
                                .replace(":", "_");

这应该会产生类似/User/jchang/result_apache_parser_2015_06_09_10_53_29

的内容

我们已经解决了第二个问题。

现在让我们一起设置并应用nio的一些小技巧:

String filename =  "/Users/jchang/result_apache_log_parser_"
                 + filename_date.replace('/', '_')
                                .replace(':', '_');

Path file = Paths.get(filename);
try {
    // Create sub-directories, if needed.
    Files.createDirectories(file.getParent());
    // Create the file content.
    byte[] fileContent = ...;
    // We do not need to create the file manually, let NIO handle it.
    Files.write(file
                , fileContent
                // Request permission to write the file
                , StandardOpenOption.WRITE
                // If the file exists, append new content
                , StandardOpenOption.APPEND
                // If the file does not exist, create it
                , StandardOpenOption.CREATE);
} catch (IOException e) {
    e.printStackTrace();
}

有关nio点击here

的详细信息

答案 2 :(得分:2)

正如许多人所说,你需要创建中间目录,比如../ 06 /..

所以在创建文件之前使用它来创建不存在的目标

Files.createDirectories(mPath.getParent());

所以你的代码应该是:

    Path file = Paths.get(filename);
    try {
        Files.createDirectories(file.getParent());
        Files.createFile(file);
    } catch (FileAlreadyExistsException x) {
        System.err.format("file named %s" +
                " already exists%n", file);
    } catch (IOException x) {
        System.err.format("createFile error: %s%n", x);
    }