我已经创建了可执行jar文件,该文件位于资源文件夹
下 Example.jar
|
|__src
| |
| Main.class
|
File1.txt
我们如何将File1.txt作为文件读取, 我试过下面的代码
ClassLoader classLoader =Main.class.getClassLoader();
File file= new File(classLoader.getResource("File1.txt").getFile());(without slash)
和
File file= new File(classLoader.getResource("/File1.txt").getFile());(with slash)
使用斜杠我正在忘记空指针异常 和 没有斜线我认为文件名或目录名不正确
答案 0 :(得分:1)
你不需要"文件"实例读取文件的内容,正如其他人回答的那样,只需使用Stream或URL。 请注意,使用类加载器时路径是绝对的:
Main.class.getClassLoader().getResourceAsStream("fileAtRoot.txt")
相当于
Main.class.getResourceAsStream("/fileAtRoot.txt")
如果你真的想要这个文件,它在任何情况下都不会起作用:你可以得到它,如果它是一个文件,但是当它在一个JAR内部时没有要打开的文件,它只会起作用eclipse,或者如果你在类路径中放置一个文件夹而不是jar。
这是一个例子:
免责声明:这是一个反对者,不要实际使用它
public class SOResourceLoad {
public static void main (String[] args) {
new SOResourceLoad().run();
}
private void run () {
try {
URL resource = getClass().getResource("SOResourceLoad.class");
System.out.println( resource );
System.out.println( resource.toURI() );
System.out.println( new File(resource.toURI()) );
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
}
Eclipse的结果
file:/D:/opt/workspace/examples/target/classes/pdem/stackoverflow/SOResourceLoad.class
file:/D:/opt/workspace/examples/target/classes/pdem/stackoverflow/SOResourceLoad.class
D:\opt\workspace\examples\target\classes\pdem\stackoverflow\SOResourceLoad.class
jar文件的结果:
jar:file:/D:/opt/sodist.jar!/pdem/stackoverflow/SOResourceLoad.class
jar:file:/D:/opt/sodist.jar!/pdem/stackoverflow/SOResourceLoad.class
Exception in thread "main" java.lang.IllegalArgumentException: URI is not hierarchical
at java.io.File.<init>(File.java:418)
at pdem.stackoverflow.SOResourceLoad.run(SOResourceLoad.java:25)
at pdem.stackoverflow.SOResourceLoad.main(SOResourceLoad.java:17)
stacktrace告诉我们,当我们执行jar文件时,我们无法获取文件。
答案 1 :(得分:0)
getClass().getResourceAsStream("File1.txt")
但是,通常,您将资源存储在项目内和/或jar根目录下的资源目录下。所以我会稍微更改一下结构,将资源目录放在项目的根目录下,也可以放在jar的目标结构下,然后将File1.txt放在那里。所以,新的加载命令就是这样的:
getClass().getResourceAsStream("resources/File1.txt")
答案 2 :(得分:0)
首先,您需要检查您的类加载器,然后加载文件:
ClassLoader cl = Thread.currentThread().getContextClassLoader();
if (cl == null) {
cl = Class.class.getClassLoader();
}
cl.getResourceAsStream("File1.txt");