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

时间:2011-09-02 13:54:21

标签: java eclipse file text jar

过去2个小时一直在寻找这个并且找不到任何东西(我找到了同样问题的解决方案,但有图像,而不是文本文件)。

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

in = new BufferedReader(new FileReader(curDir+"\\bin\\items.txt"));

其中curDir是用户的当前目录(在System.getProperty(“user.dir”)中找到)。

现在问题是,当我从Eclipse运行它时,程序运行正常但是当我尝试使它成为可运行的JAR然后运行它时,程序运行,但是文本文件中的信息没有加载。看起来Eclipse并没有将文本文件与JAR放在一起。

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

3 个答案:

答案 0 :(得分:2)

无论是从Eclipse还是从JAR运行,获取文件的更强大的方法是

MyClass.getResource("items.txt")

其中MyClass是与您需要的资源在同一个包(文件夹)中的类。

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

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

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

答案 1 :(得分:1)

到目前为止,FileReader只能读取磁盘文件系统资源。但是JAR只包含类路径资源。您需要将其作为类路径资源进行读取。您需要ClassLoader

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

InputStream input = Foo.class.getResourceAsStream("/items.txt");
reader = new BufferedReader(new InputStreamReader(input, "UTF-8"));
// ...

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

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("items.txt");
reader = new BufferedReader(new InputStreamReader(input, "UTF-8"));
// ...

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

答案 2 :(得分:0)

获取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文件所在的文件夹中

OR

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

你的包,可以作为

访问它

yourClassname.getResource( “/包/ FILENAME.TXT”);