Java 使用相对路径访问并行资源文件夹中的文本文件
您好,感谢您抽出时间来看这个问题 我在访问与src文件夹并行的文件夹中的文本文件时遇到问题(结构见下文) 我找到的最接近解释如下: 我遇到过许多类似的问题,但不幸的是,没有一个能从中推断出这个问题的答案 我知道我可以使用绝对路径,但我想确保这个软件可以在其他人的计算机上运行,所以这是不可能的。因此,我试图让它使用相对路径 作为奖励,这里建议:为了让这段代码在JAR文件中工作,我必须使用getResourceAsStream()。有人能给我建议吗 我正在尝试从RecipereReader.java中访问Recipes.txt,以下是我的代码:Java 使用相对路径访问并行资源文件夹中的文本文件,java,text-files,javafx-8,classloader,relative-path,Java,Text Files,Javafx 8,Classloader,Relative Path,您好,感谢您抽出时间来看这个问题 我在访问与src文件夹并行的文件夹中的文本文件时遇到问题(结构见下文) 我找到的最接近解释如下: 我遇到过许多类似的问题,但不幸的是,没有一个能从中推断出这个问题的答案 我知道我可以使用绝对路径,但我想确保这个软件可以在其他人的计算机上运行,所以这是不可能的。因此,我试图让它使用相对路径 作为奖励,这里建议:为了让这段代码在JAR文件中工作,我必须使用getResourceAsStream()。有人能给我建议吗 我正在尝试从RecipereReader.java
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));
提前感谢您的帮助
罗宾
如果文件被捆绑在jar文件中,那么它们就不再是文件:文件系统在运行时不包含这些文件,因为它们被嵌入到jar文件中。因此,您可以而不是使用文件IO来读取它们<代码>新建文件读取器(路径)没有意义 您似乎还想修改这些资源的内容。如果资源嵌入到jar文件中,那么这肯定是不可能的 因此,您需要考虑您真正想要做什么,以及如何向最终用户提供并安装应用程序 如果文件包含应用程序所需的静态只读资源,那么应该将它们绑定到jar文件中,并使用类加载器读取 如果文件是应用程序必须读取和保存的数据,就像文本编辑器一样,那么在应用程序中提供这些文件可能没有意义:只需询问用户在哪里加载/保存文件
如果它们是需要由应用程序透明地加载和保存的首选项,那么您可以将它们从/保存到位于用户主目录中的.myApp.prefs文件中,例如。如果这些文件捆绑在您的jar文件中,那么它们就不再是文件:文件系统在运行时不包含这些文件,因为它们被嵌入到jar文件中。因此,您可以而不是使用文件IO来读取它们<代码>新建文件读取器(路径)没有意义 您似乎还想修改这些资源的内容。如果资源嵌入到jar文件中,那么这肯定是不可能的 因此,您需要考虑您真正想要做什么,以及如何向最终用户提供并安装应用程序 如果文件包含应用程序所需的静态只读资源,那么应该将它们绑定到jar文件中,并使用类加载器读取 如果文件是应用程序必须读取和保存的数据,就像文本编辑器一样,那么在应用程序中提供这些文件可能没有意义:只需询问用户在哪里加载/保存文件
如果它们是需要由应用程序透明地加载和保存的首选项,那么您可以将它们从/保存到位于用户主目录中的.myApp.prefs文件中。通常的做法是将资源放在与要加载资源的类的包名相匹配的文件夹中 例如,您将拥有以下内容:
package com.robhartley.application;
public class ResourceLoader {
public List<Recipe> loadRecipes() {
InputStream inputStream = getClass().getResourceAsStream("Recipes.txt");
// ...
}
}
package com.robhartley.application;
公共类资源加载器{
公共列表loadRecipes(){
InputStream InputStream=getClass().getResourceAsStream(“Recipes.txt”);
// ...
}
}
在项目中使用以下文件:
resources/com/robhartley/application/Recipes.txt
通常,将资源放在与要加载的类的包名匹配的文件夹中
例如,您将拥有以下内容:
package com.robhartley.application;
public class ResourceLoader {
public List<Recipe> loadRecipes() {
InputStream inputStream = getClass().getResourceAsStream("Recipes.txt");
// ...
}
}
package com.robhartley.application;
公共类资源加载器{
公共列表loadRecipes(){
InputStream InputStream=getClass().getResourceAsStream(“Recipes.txt”);
// ...
}
}
您的项目中有以下文件:
resources/com/robhartley/application/Recipes.txt
非常好,感谢您的分享。考虑到用户只需选择一个存储文件的位置,我最初的问题似乎有些多余。然而,这可能是一个有点愚蠢的问题,但是当java程序已经编译时,您将如何保存用户输入到java程序中的文件路径?这看起来有点像鸡和蛋,因为您必须在读取其他可编辑文件位置的位置上有一个可编辑文件!非常感谢您的时间和知识,非常感谢我不理解您的问题。你能解释一下你想做什么吗?太好了,谢谢你分享。考虑到用户只需选择一个存储文件的位置,我最初的问题似乎有些多余。然而,这可能是一个有点愚蠢的问题,但是当java程序已经编译时,您将如何保存用户输入到java程序中的文件路径?这看起来有点像鸡和蛋,因为您必须在读取其他可编辑文件位置的位置上有一个可编辑文件!非常感谢您的时间和知识,非常感谢我不理解您的问题。你能解释一下你想做什么吗?