首页 > 解决方案 > BufferedWriter 不检测只读目录

问题描述

我有一个读取和写入 csv 文件的 java 应用程序。我在我的 Mac 上创建了一个只读目录,我的应用程序将尝试将 csv 文件写入该目录。我使用 chmod 000 执行此操作。没有创建文件,但也没有引发错误。此外,检查文件是否是使用 Files.notExists() 创建的会返回 False。我的应用程序需要检测到没有创建 csv 来通知用户。这里发生了什么?

public void writeCSV(String fileName, List<String> results) throws IOException {
    // fileName = "~/no_write/results.csv"

    try(CSVPrinter printer = new CSVPrinter(Files.newBufferedWriter(Paths.get(fileName)), CSVFormat.DEFAULT.withHeader(header)) {
        for (String result : results) {
            printer.printRecord(result);
        }
    }

    if (Files.notExists(Paths.get(fileName))) { // returns False but no_write directory is empty
        throw new IOException();
    }

    if (!Files.exists(Paths.get(fileName))) { // Files.exists returns True
        throw new IOException();
    }
}

标签: javacsvfile-iobufferedwriter

解决方案


如评论中所述,解决方案是获取绝对路径。使用绝对路径时,将获取目录权限并生成 IOException。不再需要检查文件是否存在。

public void writeCSV(String fileName, List<String> results) throws IOException {
    // fileName = "~/no_write/results.csv"

    try(CSVPrinter printer = new CSVPrinter(Files.newBufferedWriter(Paths.get(fileName).toAbsolutePath()), CSVFormat.DEFAULT.withHeader(header)) {
        for (String result : results) {
            printer.printRecord(result);
        }
    }
}

推荐阅读