【问题标题】:How do relative file paths work in Eclipse?相对文件路径在 Eclipse 中如何工作?
【发布时间】:2010-10-01 01:04:16
【问题描述】:

所以我 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 以某种方式对此负责?

感谢您的所有帮助!

【问题讨论】:

  • 切题评论:我对任何标题中有“傻瓜”的书持怀疑态度。试试 Bruce Eckel 的“Thinking in Java”或 Niemeyer & Knudsen 的“Learning Java”,都很不错。
  • 我上次检查 Java for Dummies 时,它是基于 Java 1.2 的。他们最近更新了吗?

标签: java eclipse file-io relative-path


【解决方案1】:

您始终可以通过以下方式获取运行时路径:

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

这提供了有关将文件和资源放在何处的宝贵信息。

【讨论】:

  • 太棒了!非常感谢,这确实返回了包含src 文件夹的路径(末尾没有\)。你知道它的功能有什么限制吗?例如。依赖于平台/操作系统。
【解决方案2】:

这与另一个问题非常相似。 How should I load files into my Java application?

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

不想通过以下方式加载您的文件:

C:\your\project\file.txt

不好!

您应该使用 getResourceAsStream。

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

你也应该使用 File.separator;这是系统相关的名称分隔符,为了方便表示为字符串。

【讨论】:

  • 你应该说出为什么'这很糟糕'
  • 在我发布的链接中更好地描述了“为什么这很糟糕”。这是 tldr;答案:)
  • docs.oracle.com/javase/7/docs/api/java/lang/… 说:The name of a resource is a '/'-separated path name that identifies the resource。所以你不应该使用 File.separator。您在此处指定资源名称,而不是文件系统路径。
  • DataInputStream 怎么样?
【解决方案3】:

项目的构建路径定义将源文件夹中的哪些资源复制到输出文件夹。通常设置为包含所有文件。

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

这段代码显示了工作目录和加载类的位置之间的区别:

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/

【讨论】:

    【解决方案4】:

    转述自http://java.sun.com/javase/6/docs/api/java/io/File.html

    java.io 下的类根据当前用户目录解析相对路径名,该目录通常是启动虚拟机的目录。

    Eclipse 将工作目录设置为顶级项目文件夹。

    【讨论】:

      【解决方案5】:

      是的,出于路径的目的,eclipse 将顶层目录视为工作/根目录。

      ...只是想我会添加一些额外的信息。我是新来的!我想帮忙。

      【讨论】:

        【解决方案6】:

        你需要"src/Hankees.txt"

        您的文件位于不计入工作目录的源文件夹中。\

        或者您可以将文件移动到项目的根目录并使用"Hankees.txt"

        【讨论】:

        • 是的,成功了!你能解释为什么会这样吗?毕竟文件在存放.class文件的src文件夹中,为什么还要重新定义src文件夹呢?
        • 嗯,我相信 eclips 设计使您项目的顶级目录成为程序的工作目录。我不知道他们为什么这样做。而且很多人都有 /bin 和 /src 文件夹,所以 /src 不是 .class 文件所在的位置。
        • 如果你把文件放在根目录下的文件夹里,比如 Baseball/players/Hankees.txt?
        • 那是你应该使用的路径。 Baseball/players/Hankees.txt
        • 然后使用路径-players/Hankees.txt
        猜你喜欢
        • 1970-01-01
        • 2012-06-19
        • 2018-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-03
        • 1970-01-01
        相关资源
        最近更新 更多