Java ClassLoader.getResource()上的NullPointerException

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

我正在做一个小项目,我需要将一个文件从应用程序JAR移动到JAR之外的另一个位置

以下是我的JAR文件的外观:

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”)