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

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

差不多,我制作了一个读取文本文件的程序。 该文件是名称和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脚本并创建自定义构建脚本。

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

假设Foo是JAR中需要读取资源的类,而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 )

获取jar文件的位置

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

考虑以下function

 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中的某些只读文件,则应将其复制到一个文件中

您的包可以访问它

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