2011-09-02 71 views
3

过去2个小时一直在寻找这个东西,找不到任何东西(我找到了解决同样问题的解决方案,但使用图片而不是文本文件)。当我JAR程序时,Java将资源文件放在哪里?

非常多,我做了一个读取文本文件的程序。该文件是名称和ID的列表。使用Eclipse,我把文件放在我的src文件夹中,并在程序中放入路径文件。就像这样:

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

哪里CURDIR是用户的当前目录(用System.getProperty( “user.dir来”)中找到)。

现在,问题是,当我从Eclipse运行程序时,程序运行良好,但是当我试图将其设置为可运行JAR并运行它时,程序将运行,但文本文件中的信息不会加载。它看起来像Eclipse没有把文本文件放入JAR中。

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

+0

一个jar文件基本上包含所有子目录和文件的目录。它也经常被压缩以占用更少的空间。您可以使用命令行'jar -tf myfile.jar'来查看jar文件的内容。或者在NetBeans中,如果我去了我的项目“文件”,我可以点击生成jar文件,并查看其内容。在Eclipse中必须有相同的东西。 – toto2

+0

其实我忘了最重要的部分:你可以把任何目录和文件在一个罐子里,但平时的罐子的用于运行代码('Java的罐子myJar.jar')包含可执行的类和资源文件。一个jar也可以包含其他的jar文件,当你的程序需要一些包装在jar中的库的时候这很有用。 – toto2

回答

2

更加可靠的方式来获得文件无论您是从Eclipse中运行或JAR是做

MyClass.getResource("items.txt") 

其中MyClass是在同一包(文件夹),因为你需要的资源类。

如果Eclipse没有把你的JAR文件,你可以去

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

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

1

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

假设Foo是你在需要读取资源和items.txt被放在JAR的类路径根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

0

让您的jar文件的位置

首先创建一个文件夹(说我的文件夹),并把你的文件里面

考虑以下功能

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:\测试\ DIST

然后路径()将返回/ d:/测试/距离/ MyFolder文件/文件名

现在,你可以把 'MyFolder文件' 内其中,如果你想访问你的一些jar文件驻留

OR

文件夹只读文件JAR文件中,你应该把它复制到一个

你的软件包,并可以访问它作为

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

相关问题