ClassLoader.getResource()上的NullPointerException

时间:2015-12-19 16:58:43

标签: java file jar nullpointerexception

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

这就是我的JAR文件的样子:

MyApp.JAR
   |- META-INF
       |- MANIFEST.MF
   |- files
       |- myFile.exe
   |- MainClass.class

我想做的是将myFile.exe移至C:\\(例如)。 所以在MainClass我尝试过:

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)

(第66行是我使用new MainClass();调用构造函数的地方)

我知道可能会抛出NPE,因为无法找到myFile.exe,但我无法弄清楚为什么...... 当我打开JAR时,我可以看到里面有files的{​​{1}}文件夹。 也许我以错误的方式访问文件? 我在StackOverflow上尝试了许多其他方法,但没有任何作用......

提前致谢,对不起我的英语。

1 个答案:

答案 0 :(得分:0)

我认为您在这里采取了太多中间笨重的步骤,因为标准Java API不允许您立即执行此操作。我建议您使用IOUtils.copy复制字节:

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()提供的网址的帮助,请查看here