在Eclipse中,相对文件路径是如何工作的?

57

所以我的2009年新年决心是学习Java。我最近买了《Java for Dummies》这本书,并且一直在使用Eclipse重写其中的演示代码。不过,书中每个使用相对路径的示例都似乎无法读取它应该从中读取的.txt文件。

以下是示例代码:

import java.util.Scanner;
import java.io.File;
import java.io.IOException;
import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.GridLayout;

class TeamFrame extends JFrame {

    public TeamFrame() throws IOException {
        PlayerPlus player;
        Scanner myScanner = new Scanner(new File("Hankees.txt"));

        for (int num = 1; num <= 9; num++) {
            player = new PlayerPlus(myScanner.nextLine(), myScanner.nextDouble());
            myScanner.nextLine();
            addPlayerInfo(player);
        }      

        add(new JLabel());
        add(new JLabel("   ------"));
        add(new JLabel("Team Batting Aberage:"));
        add(new JLabel(PlayerPlus.findTeamAverageString()));
        setTitle("The Hankees");
        setLayout(new GridLayout(11,2));
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        pack();
        setVisible(true);
    }

    void addPlayerInfo(PlayerPlus player) {
        add(new JLabel(player.getName()));
        add(new JLabel(player.getAverageString()));
    }
}

如下屏幕截图所示,您可以看到我已包含了这个文件。

图片已不再可用

此外,我已验证在构建应用程序时,Hankees.txt 的一个副本会与编译的 .class 文件一起放置在 bin 文件夹中。

最后,如果我将第12行更改为以下内容,并将 Hankees.txt 放在 C:\ 驱动器的根目录中,则程序编译并运行良好。

Scanner myScanner = new Scanner(new File("C:\\Hankees.txt"));

所以,基本上我的问题是我做错了什么?或者这是Eclipse的责任吗?

感谢所有帮助!


1
旁注:我对任何书名中带有“白痴”一词的书都持怀疑态度。建议尝试Bruce Eckel的《Java 编程思想》或Niemeyer&Knudsen的《学习 Java》两本书,它们都非常优秀。 - Jason S
我上次查看《Java入门指南》时,它是基于Java 1.2的。他们最近更新了吗? - Michael Myers
6个回答

81

你需要"src/Hankees.txt"

你的文件在源文件夹中,而该文件夹不被视为工作目录。

或者,你可以将文件移动到项目的根目录,然后只使用"Hankees.txt"


4
我认为Eclipse设计使项目的顶级目录成为程序的工作目录。我不知道他们为什么要这样做。很多人有/bin和/src文件夹,所以/src并不是.class文件所在的地方。 - jjnguy
如果您的文件位于根目录下的一个文件夹中,例如Baseball/players/Hankees.txt,该怎么办? - elemjay19
这就是你应该使用的路径:棒球/选手/汉基斯.txt - jjnguy
2
然后使用路径 - players/Hankees.txt - jjnguy
我在我的src文件夹中有一个名为names.dat的文件,但是当我尝试打开它时,出现了java.io.FileNotFoundException: names.dat (No such file or directory)的错误。我的主类在一个包中。我也尝试将文件放置在包中,但没有成功。 - Aaron Franke
显示剩余4条评论

7

项目的构建路径定义了从源文件夹复制到输出文件夹的资源。通常情况下,这被设置为包含所有文件。

新的运行配置默认使用项目目录作为工作目录,但也可以更改。

此代码显示了工作目录和加载类的位置之间的差异:

public class TellMeMyWorkingDirectory {
    public static void main(String[] args) {
        System.out.println(new java.io.File("").getAbsolutePath());
        System.out.println(TellMeMyWorkingDirectory.class.getClassLoader().getResource("").getPath());
    }
}

输出结果可能类似于:
C:\your\project\directory
/C:/your/project/directory/bin/

7

这与另一个问题非常相似。 如何将文件加载到我的Java应用程序中?

我该如何将文件加载到我的Java应用程序中?

不应该通过以下方式加载文件:

C:\your\project\file.txt

这是不好的!

你应该使用getResourceAsStream。

InputStream inputStream = YourClass.class.getResourceAsStream(“file.txt”);

同时,您应该使用 File.separator;它是系统相关的名称分隔符字符,为了方便起见表示为字符串。


1
你应该说明为什么“这是不好的”。 - jason
1
“为什么这是不好的”更好地描述在我发布的链接中。这就是tldr;的答案 :) - Bernie Perez
DataInputStream呢? - Aaron Franke

5

您可以始终使用以下方法获取运行时路径:

 String path = new File(".").getCanonicalPath();

这提供了有关放置文件和资源的宝贵信息。

1
太棒了!非常感谢,这确实返回了包含“src”文件夹的路径(末尾没有\)。您是否知道它功能上的任何限制?例如,依赖于平台/操作系统。 - a.t.

5

是的,eclipse将顶级目录视为工作/根目录,以便于路径使用。

只是想添加一些额外的信息。我是新来的!我想提供帮助。


2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接