Java ClassLoader.getResource()上的NullPointerException
我正在做一个小项目,我需要将一个文件从应用程序JAR移动到JAR之外的另一个位置 以下是我的JAR文件的外观:Java ClassLoader.getResource()上的NullPointerException,java,file,jar,nullpointerexception,Java,File,Jar,Nullpointerexception,我正在做一个小项目,我需要将一个文件从应用程序JAR移动到JAR之外的另一个位置 以下是我的JAR文件的外观: MyApp.JAR |- META-INF |- MANIFEST.MF |- files |- myFile.exe |- MainClass.class 我想做的是将myFile.exe移动到C:\\(例如)。 因此,在main类中,我尝试了: 23. Path path = Paths.get(getClass().getClass
MyApp.JAR
|- META-INF
|- MANIFEST.MF
|- files
|- myFile.exe
|- MainClass.class
我想做的是将myFile.exe
移动到C:\\
(例如)。
因此,在main类中,我尝试了:
23. Path path = Paths.get(getClass().getClassLoader().getResource("/files/myFile.exe").toURI());
24. byte[] bytes = Files.readAllBytes(path);
25. FileOutputStream fos = new FileOutputStream("C:\\myFile.exe");
26. fos.write(b);
27. fos.close();
运行应用程序后,我得到一个NullPointerException
,如下所示:
java.lang.NullPointerException
at MainClass.<init>(MainClass.java:23)
at MainClass.main(MainClass.java:66)
java.lang.NullPointerException
在MainClass。(MainClass.java:23)
在MainClass.main(MainClass.java:66)
(第66行是使用newmainclass();
调用构造函数的地方)
我知道可能会抛出NPE
,因为找不到myFile.exe
,但我不明白为什么。。。
当我打开JAR时,我可以看到files
文件夹,里面有exe
。
也许我访问文件的方式不对?
我尝试了在StackOverflow上找到的许多其他方法,但没有任何效果
提前感谢您,我的英语很抱歉。我认为您在这里采取了太多的中间步骤,因为标准Java API不允许您立即执行。我建议您使用在以下位置复制字节:
try(InputStream resourceStream = getClass().getResourceAsStream("/files/myFile.exe");
FileOutputStream fos = new FileOutputStream("C:\\myFile.exe"))
{
IOUtils.copy(resourceStream, fos);
} // optionally, catch IOException here (or declare it to be thrown)
如果您需要有关提供给getResourceAsStream()
的URL的帮助,请查看。您使用的是绝对路径:您应该使用(“files/myFiles.exe”)
iso(“/files/myFiles.exe”)
也许您可以将第23行逐行拆分为多个赋值,这样就可以看到返回的null
?正确的路径是files/myFile.exe
,没有前导斜杠。但是您应该只从getClass().getClassLoader().getResourceAsStream(“files/myFile.exe”)