加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java.nio.file.NoSuchFileException:为什么nio没有创建文件

发布时间:2020-12-15 04:28:18 所属栏目:Java 来源:网络整理
导读:我正在使用 java.nio.file包并尝试使用以下代码创建文件. private static void printReport(String filename,String str)throws Exception{ ErrorCheck ec = new ErrorCheck(); String fileName = "/var/Emails_log/"+filename; Path filePath = Paths.get(f
我正在使用 java.nio.file包并尝试使用以下代码创建文件.

private static void printReport(String filename,String str)throws Exception{

    ErrorCheck ec           = new ErrorCheck();
    String fileName         = "/var/Emails_log/"+filename;      
    Path filePath           = Paths.get(fileName);
    File file           = new File(fileName);               
    final BufferedWriter out    = Files.newBufferedWriter(filePath,StandardCharsets.UTF_8,StandardOpenOption.APPEND);         

    try{                

        final Path tmp = filePath.getParent();
        if (tmp != null){ // null will be returned if the path has no parent
                Files.createDirectories(tmp);   
        }
        else{
            out.write(str);
            out.write('n');
        }               
        }catch (Exception e){
        ec.errorMsg("ERROR: GSW.SendEmail.Exception =>",e);
        } 
       finally {
            if (out != null) {
                out.flush();
                out.close();
            }
    }           
}

抛出以下异常:

java.nio.file.NoSuchFileException: /var/Emails_log/GSWvalidSentAddresses.txt
at sun.nio.fs.UnixException.translateToIOException(UnixException.java:86)
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
at sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:214)
at java.nio.file.spi.FileSystemProvider.newOutputStream(FileSystemProvider.java:430)
at java.nio.file.Files.newOutputStream(Files.java:170)
at java.nio.file.Files.newBufferedWriter(Files.java:2720)
at SendEmail.printReport(SendEmail.java:114) SendEmail.send(SendEmail.java:87)

我的问题是为什么不创建文件?

请指教

谢谢你的期待

解决方法

更新答案:

现在您已经显示了完整的代码,有两个主要问题:

>您正在尝试打开文件,然后确保存在导致它的目录,并且
>您正在使用StandardOpenOption.APPEND,但这不会创建文件;它将附加到现有文件.

…以及与实际代码行数相关的大量关于最佳实践的问题.

看评论:

private static void printReport(String filename,String str) throws Exception /* No,it doesn't. The only calls you had outside your catch-all `try` don't throw exceptions. */ {
    ErrorCheck ec           = new ErrorCheck();            // Recommend not creating this until/unless you need it
    String fileName         = "/var/Emails_log/"+filename; // VERY poor practice having two locals that only differ by the capitalization of one character in the middle (`filename` and `fileName`)
    Path filePath           = Paths.get(fileName);
    //  File file               = new File(fileName);      <== Removed,since you never use it for anything

    try {
        // Make sure the directories exist
        Files.createDirectories(filePath.getParent());  // No need for your null check,so I removed it; based on `fileName`,it will always have a parent

        // Open the file,creating it if it doesn't exist
        try (
            final BufferedWriter out = Files.newBufferedWriter(
                                            filePath,StandardOpenOption.CREATE,StandardOpenOption.APPEND)
        ) {
            // Write to out here
        }
    } catch (Exception e) {
        // Log-and-continue isn't generally best practice; and if you're going to do it
        ec.errorMsg("ERROR: GSW.SendEmail.Exception =>",e); // <== Um...send mail failed? This isn't sending mail,it's putting something in a file.
    }
    // Using the try-with-resources,we don't have to worry about the flush and close calls
}

但这是我建议你写它的方式:

private static void printReport(String filename,String str) throws IOException {
    Path filePath           = Paths.get("/var/Emails_log/" + filename);

    // Make sure the directories exist
    Files.createDirectories(filePath.getParent());

    // Open the file,creating it if it doesn't exist
    try (
        final BufferedWriter out = Files.newBufferedWriter(
                                        filePath,StandardOpenOption.APPEND)
    ) {
        // Write to out here,perhaps outputting `str`?
    }
}

…并处理调用层中的异常.请注意,同样,因为我们正在使用try-with-resources,所以close是自动的(当有异常时和没有异常时).

或者,如果您真的想要记录并继续:

private static void printReport(String filename,String str) {
    try {
        Path filePath           = Paths.get("/var/Emails_log/" + filename);

        // Make sure the directories exist
        Files.createDirectories(filePath.getParent());

        // Open the file,StandardOpenOption.APPEND)
        ) {
            // Write to out here,perhaps outputting `str`?
        }
    }
    catch (Exception e) {
        new ErrorCheck().errorMsg("ERROR: GSW.SendEmail.Exception =>",e); // <== But surely this message is suspect? I don't see anything sending email here.
    }
}

原答案:

您尚未显示实际失败的代码,即调用newBufferedWriter(this one或this one). newBufferedWriter采用OpenOptions,其标准集可从StandardOpenOption开始.确保已指定StandardOpenOption.CREATEStandardOpenOption.CREATE_NEW,

如果你使用其中一个标志,并且你的问题中的代码是在newBufferedWriter调用之前,除了一些其他问题(权限)它应该工作:

String fileName         = "/var/Emails_log/"+filename;
Path filePath           = Paths.get(fileName);
final Path tmp          = filePath.getParent();

if (tmp != null) {      // <== Note: There's no point to this check,given
                        // your filename above,the path WILL have a parent.
                        // You could remove the `if` and just use
                        // `Files.createDirectories(tmp)` unless the `fileName`
                        // is actually coming from somewhere else and so could
                        // be a root (roots don't have parents)
    Files.createDirectories(tmp);
}
else {
    out.write(str);     // I assume this is for logging or display?
    out.write('n');    // Specifically,that it's *not* trying to write
                        // to the file you're trying to create.
}

try (BufferedWriter writer = Files.newBufferedWriter(filePath,StandardOpenOption.CREATE)) {
// ------------------------------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^
    // Write to the file here
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读