您好,感谢您抽出宝贵时间来研究这个问题。
我无法访问与我的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));
提前感谢您的帮助!
罗宾
答案 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
。