使用相对路径访问并行资源文件夹中的文本文件

时间:2016-08-06 15:04:46

标签: java text-files javafx-8 classloader relative-path

您好,感谢您抽出宝贵时间来研究这个问题。

我无法访问与我的src文件夹并行的文件夹中的文本文件(请参阅下面的结构)。

我找到的最接近解释的地方是:https://www.cis.upenn.edu/~matuszek/cit597-2006/Pages/finding-files.html 我遇到过许多类似的问题,但不幸的是我无法从中推断出这个问题的答案。

我知道我可以使用绝对路径,但我想确保这个软件可以在其他人的计算机上运行,​​这样就不行了。因此,我试图让它与相对路径一起工作。

作为奖励,这里建议:https://coderanch.com/t/464197/java/java/Reading-files-directory-giving-relative为了使这段代码在JAR文件中工作,我必须使用getResourceAsStream()。有人可以建议吗?

我正在尝试从RecipeReader.java中访问Recipes.txt,这是我目前的代码:

        Class thisClass = this.getClass();
        ClassLoader loader = thisClass.getClassLoader();
        URL recipeFileURL = loader.getResource("Recipes.txt");
        String path = recipeFileURL.getPath();
        path.replaceAll("%20",  " ");
        BufferedReader input = new BufferedReader(new FileReader(path));

并且类似于写入同一文件:

        Class thisClass = this.getClass();
        ClassLoader loader = thisClass.getClassLoader();
        URL recipeFileURL = loader.getResource("Recipes.txt");
        String path = recipeFileURL.getPath();
        path.replaceAll("%20",  " ");
        BufferedWriter output = new BufferedWriter(new FileWriter(path));

提前感谢您的帮助!

罗宾

Eclipse Tree View

2 个答案:

答案 0 :(得分:4)

如果文件捆绑在jar文件中,则它们不再是文件:文件系统在运行时不包含这些文件,因为它们嵌入在jar文件中。所以你可以使用文件IO来读取它们。 new FileReader(path)没有意义。

您似乎也希望修改这些资源的内容。如果资源嵌入在jar文件中,那肯定是不可能的。

因此,您需要考虑您真正想做的事情,以及如何将应用程序提供给最终用户并进行安装。

如果文件包含应用程序所需的静态只读资源,则应将它们捆绑在jar文件中,并使用ClassLoader进行读取。

如果文件是数据,必须由应用程序读取和保存,就像文本编辑器一样,那么为它们提供应用程序可能没有意义:只需询问用户在哪里加载/保存文件。

如果它们是需要由应用程序透明地加载和保存的首选项,那么您可以从/向位于用户主目录中的.myApp.prefs文件加载和保存它们,例如。

答案 1 :(得分:0)

通常你会这样做的方法是将你的资源放在一个文件夹中,该文件夹与将加载它的类的包名相匹配。

例如,你会有这个:

package com.robhartley.application;

public class ResourceLoader {
    public List<Recipe> loadRecipes() {
         InputStream inputStream = getClass().getResourceAsStream("Recipes.txt");
         // ...
    }
}

项目中包含以下文件:resources/com/robhartley/application/Recipes.txt