【问题标题】:Java file path f.exists() always returns falseJava 文件路径 f.exists() 总是返回 false
【发布时间】:2020-05-06 12:52:40
【问题描述】:

我正在尝试创建一个允许用户创建文件和文件夹的基本 Java 程序。

我希望这一切都发生在我的项目内部的文件夹中(附图片),所以我有一些疑问......

This would be my proyect tree

  1. “Test”文件夹是否放置正确?如果不是我如何访问它?如您所见,它在 com.company 中,我应该将其移至 src 吗?

  2. 当我尝试检查是否存在时,它显示 false

这是我的代码:

public class Main {
    Scanner input = new Scanner(System.in);

    public static void main(String[] args) {
        Main main = new Main();
        main.init();
    }

    public void init(){
        File f = new File("Test"); //Here i've tried "com"+File.separator+"company"+File.separator+"Test"
        System.out.println(f.exists()); //output is false here

    }
}

f.getParent() 表示为空。

但是当我尝试时: System.out.println(f.getAbsolutePath());它正确显示了整个路径。

使用相对路径的目的是因为我希望这段代码可以在任何计算机上运行。

感谢您的建议,希望有人可以帮助我。

【问题讨论】:

  • 正确的路径宁愿是 src/Test/test.txt - 因为它会从项目级别开始并且它已经在 src 文件夹中。你能试试吗?不过最好把它放在 src/main/resources 文件夹中。

标签: java io relative-path


【解决方案1】:

如果您在 Java 中使用相对路径名,它们将相对于正在运行的应用程序的工作目录进行解析。所以你需要知道工作目录是什么。

当您在 IDE 中启动应用程序时,工作目录取决于 IDE 和启动器配置。但通常是与项目顶部对应的文件系统目录。

另外需要注意的是,您看到的src 文件夹是特殊的。其中的条目通常不是文件和目录。它们通常是 Java 包和类。所以在文件系统中,“src”>“com.company”>“Main”实际上表示为一个路径为“src/com/company/Main.java”的文件。

这意味着将任意文件夹和文件放入“src”文件夹是错误的。它会起作用......但它在概念上是错误的。数据文件不属于源代码树,当然也不属于您的应用程序编写的数据文件。 (而且当您开始使用源代码控制系统时,您会发现将数据文件写入源代码树会让您头疼。我不会详细说明……但我很确定您后悔的。)

关于您正在做的另一件事在概念上是错误的,那就是 Java 程序通常被编写为独立的东西。您的程序的用户不需要下载和安装 Intellij 或其他一些 IDE 并将您的项目加载到其中。他们只想从 JAR 文件中运行它。在那个世界中,项目目录和“src”文件夹将不存在,并且像“src/Test”这样的硬连线相对路径将是有问题的。


所以让我们暂时忽略它,看看你的代码当前在做什么

文件夹“Test”是否正确放置?如果不是我如何访问它?如您所见,它在 com.company 中,我应该将其移至 src 吗?

根据图片,Test文件夹(实际上是包)>>是src文件夹中。

当我尝试检查是否存在时,它显示为 false。

您的代码使用了错误的路径。在您拥有它的“Test”文件夹位置(根据图片!),相对路径应该是“src/Test”,而不是“Test”或“com/company/Test”。

请注意,Windows 接受“/”或“\”作为文件分隔符,尽管通常使用“\”。

f.getParent()null

没错。相对路径“Test”没有父部分。它是一个简单的文件/目录名称。

这样想。在具有相对路径的File解析之前,无法确定它是相对于哪个目录。

但是当我尝试时:System.out.println(f.getAbsolutePath()); 它正确显示了整个路径。

再次,正确。

当您在相对 File 上调用 f.getAbsolutePath() 时,运行时系统会预先添加应用程序工作目录的路径,然后为您提供结果。


使用相对路径的目的是因为我希望这段代码可以在任何计算机上运行。

该相对路径不适用于任何计算机。您正在使用项目的src 树中的路径,并且您的项目通常不会存在于最终用户的计算机上。 (见上文。)

那你该怎么办?

没有一个正确答案。

  • 你可以把文件/目录放到用户的current/working目录中。
  • 您可以将文件/目录放入用户的home 目录,或主目录中的隐藏子目录。 (这是 Linux 上的常用方法。)
  • 您可以将目录的路径名设为命令行参数
  • 您可以从环境变量中获取路径名
  • 您可以从特定于应用程序的配置文件中获取路径名。

最佳答案取决于上下文。

【讨论】:

  • 嗨,斯蒂芬,感谢您花时间向我解释这一切!正如你可能假设的那样,我仍然是一名学生。当我的意思是我的项目可以在任何计算机上运行时,因为我正在 Windows 计算机上开发这个项目,而我的老师有一台 Mac,所以它也应该在他的机器上运行。我的项目的目标是创建文件和文件夹(仅在这个给定目录“测试”内,所以这就是为什么我试图限制该文件夹的路径)鉴于此信息,放置此文件夹的最佳编码实践是什么?
  • 如果我正确理解了您的解释,这将是一个好习惯吗? ibb.co/xC72QC3
  • 在某些情况下,是的,这将是一个很好的做法。 (它似乎正在使用将在当前 / 工作目录中的目录。)
【解决方案2】:

根据你的图片路径是错误的,你应该检查src目录里面:

File f = new File("src/Test");
System.out.println(f.exists());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    • 2013-03-26
    • 2017-04-26
    相关资源
    最近更新 更多