Java 文件路径 f.exists() 总是 returns false

Java file path f.exists() always returns false

我正在尝试创建一个允许用户创建文件和文件夹的基本 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目录里面查看:

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

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

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

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

的文件

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

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


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

Is the folder "Test" correctly placed? if not how do i access to it? As you see, it's inside com.company, should I move it to src?

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

When I try to check if exists, it says false.

您的代码使用了错误的路径。对于 "Test" 文件夹所在的位置(根据图片!),相对路径应为 "src/Test",而不是 "Test" 或 "com/company/Test"。

请注意,Windows 接受“/”或“\”作为文件分隔符,即使“\”是常规使用的。

f.getParent() says null.

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

这样想。直到 File 的相对路径被 解决,才确定它相对于哪个目录。

But when I try: System.out.println(f.getAbsolutePath()); it shows correctly the whole path.

再次正确。

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


The point of using relative path is because I'd like this code to work on ANY computer.

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

那你该怎么办?

没有一个正确答案。

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

最佳答案取决于上下文。