在Java中获取文件路径时java.lang.NullPointerException(通过jar文件执行)

时间:2015-10-16 06:45:45

标签: java jar nullpointerexception

我在获取文件路径(资源文件夹中的sh文件)时获取NPE。 我试着从下面的帖子中读到关于NPE i的详细信息,但这实际上无法解决我的问题。

What is a NullPointerException, and how do I fix it?

以下是我的代码段:

 File absPathofBash;

   url = ClassLoader.class.getResource("assets/forbackingup.sh");
    absPathofBash = new File(url.getPath());

后来我在 ProcessBuilder 中使用它,如

ProcessBuilder pb = new ProcessBuilder(url.getPath(), param2, param3)

我也试过直接获取绝对路径,比如

absPathofBash = new File("assets/forbackingup.sh").getAbsolutePath(); 

使用后一种方式,我可以处理它,但如果我创建 jar ,则无法找到该文件。 (虽然Jar包含相应文件夹资产中的文件)

如果有人能帮助我,我将感激不尽。

5 个答案:

答案 0 :(得分:2)

将代码打包为jar后,无法使用文件路径加载jar内的文件,而是使用类资源,必须使用它来加载:

i

这样您就可以在jar中加载this.getClass().getClassLoader().getResource("assets/forbackingup.sh"); 作为绝对路径。您也可以使用assets/forbackingup.sh,但这样路径必须相对于jar中的this.getClass().getResource()类路径。

this方法为您提供了一个网址,如果您希望直接使用getResource,则可以使用InputStream

希望它有所帮助!

答案 1 :(得分:0)

由于文件本身位于jar文件中,您可以尝试使用:

InputStream is = this.getClass().getClassLoader().getResourceAsStream(fileNameFromJar);

答案 2 :(得分:0)

对于jar文件,classloader将返回不同于目标文件未嵌入jar内的URL。请参阅应该帮助您的链接上的答案: How to use ClassLoader.getResources() in jar file

答案 3 :(得分:0)

我通过创建临时文件来完成它。虽然这并不难,但我在这里发布代码补丁:

InputStream stream = MyClass.class.getClassLoader().
            getResourceAsStream("assets/forbackingup.sh");

        File temp = File.createTempFile("forbackingup", ".sh");



      OutputStream outputStream =   
               new FileOutputStream(temp);

      int read = 0;

      byte[] bytes = new byte[1024];

      while ((read = stream.read(bytes)) != -1) {

            outputStream.write(bytes, 0, read);
            outputStream.close();

      }

现在,我们在此处有 temp 文件,我们可以将其传递给ProcessBuilder

String _filePath=temp.getPath();
ProcessBuilder pb = new ProcessBuilder(url.getPath(), param2, param3)

感谢大家的考虑。

答案 4 :(得分:-1)

您可以使用Path类,如:

Path path = Paths.get("data/test-write.txt");
if(!Files.exists(path)){
    // can handle null pointer exception
}