【问题标题】:Java Writer Readonly File System ExceptionJava Writer 只读文件系统异常
【发布时间】:2023-02-24 03:10:42
【问题描述】:

我想使用缓冲写入器在我上面 6 个文件夹中写入一个文件,但它说它是一个只读文件系统

public static void writeDataToCSVFile() {
    try(
        BufferedWriter writer = new BufferedWriter(Files.newBufferedWriter(Paths.get("/../../../../../../costumers.csv")));
    ) {
        writer.write("Id;Firstname;Lastname;Street;Housenumber;Postalcode;City;Country");
        writer.newLine();
        for(Customer customer: CustomerManagement.customers) {
            writer.write(customer.convertToCSVString());
            writer.newLine();
        }
        writer.flush();
        
    } catch (Exception e) {
        e.printStackTrace();
    }
}
java.nio.file.FileSystemException: /../../../../../../costumers.csv: Read-only file system
    at java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:100)
    at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:106)
    at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111)
    at java.base/sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:218)
    at java.base/java.nio.file.spi.FileSystemProvider.newOutputStream(FileSystemProvider.java:484)
    at java.base/java.nio.file.Files.newOutputStream(Files.java:228)
    at java.base/java.nio.file.Files.newBufferedWriter(Files.java:3008)
    at java.base/java.nio.file.Files.newBufferedWriter(Files.java:3056)
    at de.volkswagen.fakultaet73.shoppingsystem.management.CustomerManagement.writeDataToCSVFile(CustomerManagement.java:128)
    at de.volkswagen.fakultaet73.shoppingsystem.enities.ShoppingSystem.start(ShoppingSystem.java:23)
    at de.volkswagen.fakultaet73.shoppingsystem.main.Main.main(Main.java:21)

当我使用绝对文件路径时,如“/Username/Desktop/test.csv”,它有效。

【问题讨论】:

  • “在我之上”是什么意思?相对路径将相对于当前工作目录。这可能符合也可能不符合您对“我”的看法。您检查过Paths.get("/../../../../../../costumers.csv").toAbsolutePath()` 打印的内容了吗?
  • 此外:您将新创建的BufferedWriter 包裹在另一个BufferedWriter 中。这会起作用,但不会给您带来任何好处(并且会浪费一些内存)。只需删除包装 Files.newBufferedWriter 调用的 new BufferedWriter(...) 即可。此时也无需调用flush():关闭编写器将自动为您刷新所有相关缓冲区。
  • / 开头的路径是绝对路径。如果你想要一个相对路径,删除第一个/
  • 您的操作系统是什么?

标签: java


【解决方案1】:

看起来您正在尝试写入 / 根目录。一般来说,根目录对于普通用户来说是不可写的。

您希望在目录路径前加上 ./../../../../../../ 不是有效路径。它基本上意味着 / 根目录之上的 6 个目录。根据定义,根目录之上没有目录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 2018-04-10
    • 2012-06-03
    • 2020-04-26
    • 2016-08-04
    • 2020-07-01
    相关资源
    最近更新 更多