26

当我启动我的程序时,我需要阅读一个文本文件。我正在使用 eclipse 并开始了一个新的 java 项目。在我的项目文件夹中,我得到了“src”文件夹和标准的“JRE System Library”+ staedteliste.txt ......我只是不知道将文本文件放在哪里。我真的尝试了我能想到的每个文件夹......我不能使用“硬编码”路径,因为我的应用程序需要包含文本文件......

我使用以下代码读取文件,但出现此错误:

Error:java.io.FileNotFoundException:staedteliste.txt(No such file or directory)

public class Test {

ArrayList<String[]> values;

public static void main(String[] args) {
    // TODO Auto-generated method stub

    URL url = Test.class.getClassLoader().getResource("src/mjb/staedteliste.txt");
    System.out.println(url.getPath()); // I get a nullpointerexception here!
    loadList();
}

public static void loadList() {
    BufferedReader reader;
    String zeile = null;

    try {
        reader = new BufferedReader(new FileReader("src/mjb/staedteliste.txt"));
        zeile = reader.readLine();          

        ArrayList<String[]> values = new ArrayList<String[]>();

        while (zeile != null) {             
            values.add(zeile.split(";"));
            zeile = reader.readLine();
        }
        System.out.println(values.size());
        System.out.println(zeile);

    } catch (IOException e) {
        System.err.println("Error :"+e);
    }
}

}

4

9 回答 9

45

首先问自己:您的文件是应用程序的内部组件吗?(这通常意味着它被打包在你的 JAR 中,如果它是一个 web 应用程序,则为 WAR;通常,它是一些配置文件或静态资源,只读)。

如果答案是肯定的,您不想为文件指定绝对路径。但是您既不想使用相对路径(如您的示例)访问它,因为 Java 假定路径是相对于“当前目录”的。通常这种情况下的首选方式是从类路径相对加载它。

Java 为您提供了用于执行此操作的classLoader.getResource()方法。并且 Eclipse(在正常设置中)假定src/位于类路径的根目录中,因此在编译后,它将所有内容复制到您的输出目录(bin/),编译形式的 java 文件(.class),其余部分原样。

因此,例如,如果您将文件放在 中src/Files/myfile.txt,它将在编译时复制到bin/Files/myfile.txt;并且,在运行时,bin/将位于您的类路径(的根目录)中。因此,通过调用getResource("/Files/myfile.txt")(在它的某些变体中),您将能够阅读它。

编辑:此外,如果您的文件在概念上与 java 类相关联(例如,某些com.example.MyClass具有MyClass.cfg关联的配置文件),您可以使用该类中的 getResource() 方法并使用(资源)相对路径:MyClass.getResource("MyClass.cfg"). 然后将在类路径中搜索该文件,但会预先附加类包。因此,在这种情况下,您通常会将您的MyClass.cfgMyClass.java文件放在同一目录中。

于 2010-05-17T16:57:46.640 回答
9

一种方法是

  1. 将您正在使用的文件添加到类路径
  2. 使用资源加载器定位文件:

        URL url = Test.class.getClassLoader().getResource("myfile.txt");
        System.out.println(url.getPath());
        ...
    
  3. 打开它
于 2010-05-17T16:12:14.907 回答
3

假设您在 Eclipse 上有一个名为“TestProject”的项目,并且您的工作区文件夹位于 E:/eclipse/workspace。当您构建一个 Eclipse 项目时,您的类路径是e:/eclipse/workspace/TestProject. 当您尝试阅读“staedteliste.txt”时,您正在尝试访问位于e:/eclipse/workspace/TestProject/staedteliste.txt.

如果您想为您的项目创建一个单独的文件夹,请在 TestProject 下创建 Files 文件夹,然后使用 (相对路径) 访问该文件/Files/staedteliste.txt。如果将文件放在 src 文件夹下,则必须使用/src/staedteliste.txt. src 文件夹内的 Files 文件夹将是/src/Files/staedteliste.txt

除了使用相对路径,您可以通过e:/eclipse/workspace/在开头添加使用绝对路径,但是使用相对路径更好,因为只要项目文件夹结构相同,您就可以移动项目而无需担心重构。

于 2010-05-17T17:31:00.857 回答
3

Files只需在下面创建一个文件夹src并将您的文件放在那里。这看起来像src/Files/myFile.txt

注意: 在您的代码中,您需要像这样指定,Files/myFile.txt 例如

getResource("Files/myFile.txt");

因此,当您构建项目并运行 .jar 文件时,它应该能够工作。

于 2012-01-20T08:05:55.170 回答
0

如果这是一个简单的项目,您应该能够将 txt 文件直接拖到项目文件夹中。具体来说,“项目文件夹”将是最高级别的文件夹。我试图通过将 txt 文件放在 src 文件夹中来做到这一点(对于我正在做的家庭作业项目),但这没有用。但最后我想把它放在项目文件中。

一个很好的教程是http://www.vogella.com/articles/JavaIO/article.html。我用它作为 i/o 的介绍,它有所帮助。

于 2013-01-27T18:52:13.893 回答
0

MJB

请试试这个

  1. 在 Eclipse 中“右键单击”您要使用的文本文件,查看并复制存储在 HDD 中的完整路径,例如(如果在 UNIX 中“/home/sjaisawal/Space-11.4-template/provisioning/devenv/Test/src/testpath/测试文件.txt")

  2. 把这个完整的路径和尝试。

  3. 如果它有效,那么类路径问题,否则 GOK :)

于 2012-01-19T10:06:26.220 回答
0

根据您的 Java 类包名称,您可能在目录结构的下方 4 或 5 级。

例如,如果您的 Java 类包是 com.stackoverflow.project,那么您的类位于 src/com/stackoverflow/project。

您可以使用 multiple 向上移动目录结构../,也可以将文本文件移动到与您的类相同的包中。移动文本文件会更容易。

于 2010-05-17T16:10:46.197 回答
0

看看这个视频

您所要做的就是选择您的文件(假设它是相同的简单形式的txt 文件),然后将其拖到Eclipse 中的项目中,然后将其放在那里。选择复制而不是链接,因为它更灵活。就是这样-我刚刚尝试过。

于 2013-06-21T18:48:33.733 回答
0

您可能应该看看 ClassLoader 类中 getResource 的各种风格:https ://docs.oracle.com/javase/1.5.0/docs/api/java/lang/ClassLoader.html 。

于 2010-05-17T16:14:05.050 回答