当我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”);