当我JAR我的程序时,Java把资源文件放在哪里?

当我JAR我的程序时,Java把资源文件放在哪里?,java,eclipse,file,text,jar,Java,Eclipse,File,Text,Jar,在过去的两个小时里,我一直在寻找这个问题,但什么也找不到(我已经找到了解决同样问题的方法,但是图像,而不是文本文件) 差不多,我制作了一个读取文本文件的程序。该文件是名称和ID的列表。使用Eclipse,我将文件放在src文件夹中,并将路径文件放在程序中。像这样: in = new BufferedReader(new FileReader(curDir+"\\bin\\items.txt")); 其中curDir是用户的当前目录(可通过System.getProperty(“user.dir

在过去的两个小时里,我一直在寻找这个问题,但什么也找不到(我已经找到了解决同样问题的方法,但是图像,而不是文本文件)

差不多,我制作了一个读取文本文件的程序。该文件是名称和ID的列表。使用Eclipse,我将文件放在src文件夹中,并将路径文件放在程序中。像这样:

in = new BufferedReader(new FileReader(curDir+"\\bin\\items.txt"));
其中curDir是用户的当前目录(可通过System.getProperty(“user.dir”)找到)

现在,问题是,当我从Eclipse运行程序时,它运行得很好,但是当我尝试将它变成一个可运行的JAR,然后运行它时,程序运行,但是文本文件中的信息不会加载。看起来Eclipse没有将文本文件与JAR放在一起


编辑:问题解决了吗?那么JAR文件需要保存在一个包含所有原始文件的文件夹中吗?我很困惑,那么什么是JAR文件呢?

无论您是从Eclipse还是从JAR运行,获取文件的一种更健壮的方法是

MyClass.getResource("items.txt")
其中
MyClass
是与所需资源位于同一个包(文件夹)中的类

如果Eclipse没有将文件放入您的JAR中,您可以转到

运行->运行配置->类路径选项卡->高级->添加文件夹


然后将包含文件的文件夹添加到类路径。或者,导出Ant脚本并创建自定义构建脚本。

至此,
文件读取器只能读取磁盘文件系统资源。但是JAR只包含类路径资源。您需要将其作为类路径资源读取。为此,您需要
ClassLoader

假设
Foo
是JAR中需要读取资源的类,并且
items.txt
放在JAR的类路径根中,那么您应该按照如下方式读取它(注意:需要使用前导斜杠!):

或者,如果希望独立于类或运行时上下文,则使用相对于类路径根操作的上下文类加载器(注意:不需要前导斜杠!):


(UTF-8当然是文件编码的字符集,否则您可能会看到)

获取jar文件的位置

首先创建一个文件夹(比如myfolder)并将文件放入其中

考虑以下函数

public String path(String filename)
{
URL url1 = getClass().getResource("");
String ur=url1.toString();
ur=ur.substring(9);
String truepath[]=ur.split("myjar.jar!");
truepath[0]=truepath[0]+"myfolder/";
truepath[0]=truepath[0].replaceAll("%20"," ");
return truepath[0]+filename;
}//This method will work on Windows and Linux as well.
//You can alternatively use the following line to get the path of your jar file
//classname.class.getProtectionDomain().getCodeSource().getLocation().getPath();
假设您的jar文件位于D:\Test\dist中

然后path()将返回/D:/Test/dist/myfolder/filename

现在,您可以将“myfolder”放在jar文件所在的文件夹中

如果您想访问jar中的某个只读文件,您应该将其复制到一个jar中

,并可以作为


getResource(“/packagename/filename.txt”)

jar文件基本上包含一个包含所有子目录和文件的目录。它也经常被压缩以占用更少的空间。您可以使用命令行
jar-tfmyfile.jar
查看jar文件的内容。或者在NetBeans中,如果我查看项目的“文件”,我可以单击buildjar文件并查看其内容。Eclipse中一定有类似的东西。事实上,我忘记了最重要的部分:您可以将任何目录和文件放入jar中,但通常用于运行代码的jar(
java-jar myJar.jar
)包含您的可执行类和资源文件。jar还可以包含其他jar文件,当您的程序需要一些打包在jar中的库时,这非常有用。
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("items.txt");
reader = new BufferedReader(new InputStreamReader(input, "UTF-8"));
// ...
public String path(String filename)
{
URL url1 = getClass().getResource("");
String ur=url1.toString();
ur=ur.substring(9);
String truepath[]=ur.split("myjar.jar!");
truepath[0]=truepath[0]+"myfolder/";
truepath[0]=truepath[0].replaceAll("%20"," ");
return truepath[0]+filename;
}//This method will work on Windows and Linux as well.
//You can alternatively use the following line to get the path of your jar file
//classname.class.getProtectionDomain().getCodeSource().getLocation().getPath();