Java 使用nio创建文件时出现NoSuchFileException

Java 使用nio创建文件时出现NoSuchFileException,java,file-io,nio,Java,File Io,Nio,我试图使用JavaNIO创建一个新文件,但遇到了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

我试图使用JavaNIO创建一个新文件,但遇到了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);
        }
代码段如下所示:

 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);
        }

有人知道怎么解决这个问题吗?谢谢你的帮助

我认为图灵85是正确的。您的
filename\u date
变量中有斜杠。因此
/Users/jchang/result\u apache\u log\u parser\u 2015
必须作为目录存在。这就是导致
NoSuchFileException
缺少目录的原因

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

要解决第一个问题,可以采用两种方法:a)创建所需的所有文件夹或b)将分隔符更改为其他内容。我会解释两者

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

Files.createDirectories(path.getParent());
其中
path
是一个文件(重要!)。通过调用file上的
getParent()
,我们得到了
path
所在的文件夹<代码>文件。CreateDirectory(…)处理其余部分

b) 更改分隔符:最简单的方法是:

String filename =  "/Users/jchang/result_apache_log_parser_"
                 + filename_date.replace("/", "_")
                                .replace(":", "_");
这将产生类似于
/User/jchang/result\u apache\u parser\u 2015\u 06\u 09\u 10\u 53\u 29的结果

b)我们也解决了第二个问题

现在,让我们一起来设置并应用
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
的更多信息,请单击。

正如许多人所说,您需要创建中间目录,如../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);
    }

文件。创建(…)
只创建文件,不创建文件夹。这可能是你的问题还是文件夹存在?哦,天哪,我到底需要文件类型吗?e、 g..txt?不,你没有。但是文件的路径(即文件所在的文件夹)必须存在。确定它确实存在,然后,我链接到的只是我的主目录。
Files.createDirectories(file.getParent())-您确定用户是用大写U编写的吗?但还有一个问题(至少在windows下):冒号是非法字符。我正在研究一个解决方案。很明显,我还建议将
filename\u date
中的一些字符替换为有效字符。例如,
filename\u data=filename\u date.replace(“/”,“\u”).replace(“:”,“\u”)太棒了,这就解决了它。谢谢,为我工作。