Java FileWriter 类 - java.io.FileNotFoundException: * 没有这样的文件或目录 -Ubuntu

Posted

技术标签:

【中文标题】Java FileWriter 类 - java.io.FileNotFoundException: * 没有这样的文件或目录 -Ubuntu【英文标题】:Java FileWriter class - java.io.FileNotFoundException: * no such file or directory -Ubuntu 【发布时间】:2019-12-24 12:40:54 【问题描述】:

我正在使用这种方法在我的项目的子目录中生成一些乌龟文件.ttl

public static void write(int id, int depth)
        try 

            FileWriter fw = null;
            switch (getName())
            case ("KG1"):
                fw = new FileWriter("WWW/KG1/" + depth + "/" + id + ".ttl");
            break;

            case ("KG2"):
                fw = new FileWriter("WWW/KG2/" + depth + "/" + id + ".ttl");
            

        // Write something

        fw.close();
         catch (IOException e) 
            e.printStackTrace();
        
    

但是当我将我的项目放在 Ubuntu 中(它在 Windows 中仍然可以正常工作)的 java 类 FileWriter 中时,我遇到了这个异常:

java.io.FileNotFoundException: /WWW/KG1/2/0.ttl (No such file or directory)

我在两个操作系统上都使用 Eclipse Neon,但 Ubuntu 似乎对此并不满意。

这是我迄今为止尝试过的:

    为项目主目录下的所有文件和目录添加写权限

    使用绝对路径而不是相对路径,使用System.getProperty("usr.dir"),并绘制我提供给FileWriter 的所有路径字符串,但它不起作用。

有什么建议吗?

谢谢!

【问题讨论】:

您的工作目录中是否存在所有目录WWWKG12 可能是因为这个? ***.com/questions/8075373/… @RealSkeptic:是的,他们确实存在 你确定它们存在大写吗? @RealSkeptic:是的也验证了这一点,我什至复制粘贴了路径以确保没有拼写错误 【参考方案1】:

我会尝试使用 File.separator 并确保父目录存在。 这是一个示例(可能存在语法问题)。

final String WWW = "WWW";
final String KG1 = "KG1";
final String KG2 = "KG2";
final String extension = ".ttl";

int id = 1;
int depth = 1;

String filePath = "." // current dir
  + File.separator 
  + WWW 
  + File.separator 
  + KG1 
  + File.separator 
  + depth 
  + File.separator 
  + id 
  + extension;

File file = new File(filePath);
// make sure parent dir exists (else created)
file.getParentFile().mkdirs(); 
FileWriter writer = new FileWriter(file);

【讨论】:

谢谢!我很想知道这背后的原因? 我一直在这种情况下使用File.separatorChar(而不是File.pathSeparatorChar。File.separatorChar 是:系统相关的默认名称分隔符。该字段已初始化包含系统属性 file.separator 值的第一个字符。在 UNIX 系统上,此字段的值是“/”;在 Microsoft Windows 系统上,它是“\\”。 @Betty 这是一个名为绝对路径和相对路径的概念。绝对路径是完整的,但相对路径需要更多信息才能完整。 www/kg1/.. 是相对路径(无前缀)。它由 JVM 完成,相对于 user.dir 属性而不是当前工作目录。请查看System.getProperty("user.dir") 而不是usr.dir 的输出。 @The_Cute_Hedgehog:我知道绝对/相对路径。实际上,System.getProperty("user.dir") 输出实际的绝对路径,System.getProperty("usr.dir") 输出null。我使用后者来获取当前运行的 JVM 目录的绝对值,但没有帮助。【参考方案2】:

您可以使用 Path 和 File 对象让事情变得更轻松。这是一个版本,如果它不存在,可以选择创建想要的目录

Path path = Paths.get("WWW", "KG1", String.valueOf(depth));
try 
    Files.createDirectories(path);
    FileWriter fw = new FileWriter(new File(path.toFile(), id + ".ttl"));
    fw.close();
 catch (IOException e) 
    e.printStackTrace();

请注意,我故意跳过switch 以简化答案

【讨论】:

感谢您的回复,效果很好:您知道这是什么原因吗?

以上是关于Java FileWriter 类 - java.io.FileNotFoundException: * 没有这样的文件或目录 -Ubuntu的主要内容,如果未能解决你的问题,请参考以下文章

java中的 FileWriter类 和 FileReader类的一些基本用法

Java FileWriter 类 - java.io.FileNotFoundException: * 没有这样的文件或目录 -Ubuntu

JAVA IO流相关代码(字符流:FileWriter类,FileReader类,BufferedReader类,BufferedWriter类)

IO流概述及FileWriter类使用

JAVA基础复习-FileRead与FileWriter结合使用示例:字符输入输出流整合(实现文本类文件的复制)

第1章 IO流概述及FileWriter类使用