获取java中的文件路径时发生java.lang.NullPointerException(通过jar文件执行)

获取java中的文件路径时发生java.lang.NullPointerException(通过jar文件执行),java,jar,nullpointerexception,Java,Jar,Nullpointerexception,我在获取文件路径时获取NPE(资产文件夹中的sh文件)。 我试图从下面的线程中阅读关于NPE I的详细信息,但这实际上无法解决我的问题 以下是我的代码片段: File absPathofBash; url = ClassLoader.class.getResource("assets/forbackingup.sh"); absPathofBash = new File(url.getPath()); 稍后,我将在Process Builder中使用它,如下所示 Proce

我在获取文件路径时获取NPE(资产文件夹中的sh文件)。 我试图从下面的线程中阅读关于NPE I的详细信息,但这实际上无法解决我的问题

以下是我的代码片段:

 File absPathofBash;

   url = ClassLoader.class.getResource("assets/forbackingup.sh");
    absPathofBash = new File(url.getPath());
稍后,我将在Process Builder中使用它,如下所示

ProcessBuilder pb = new ProcessBuilder(url.getPath(), param2, param3)
我也尝试过直接获取绝对路径,比如

absPathofBash = new File("assets/forbackingup.sh").getAbsolutePath(); 
使用后一种方法,我可以处理它,但是如果我创建一个jar,那么就找不到该文件。(尽管Jar在各自的文件夹资产中包含该文件)


如果有人能在这方面帮助我,我将不胜感激。

一旦您将代码打包为jar,您就不能使用文件路径加载jar中的文件,而是类资源,您必须使用它来加载:

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

getResource
方法为您提供了一个URL,如果您想直接获取
InputStream
您可以使用
getresourceastream


希望有帮助

您可以使用如下路径类:

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

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

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

对于jar文件,classloader将返回与目标文件未嵌入jar时不同的URL。请参阅链接上的答案,这将有助于您:

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

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)

谢谢大家的考虑。

您不能使用
文件
访问
Jar
文件中的嵌入式资源,它们不是文件系统看到的“文件”,而是zip文件中的一堆压缩字节(本质上)。在您的情况下,如果要执行该文件,则需要从Jar文件中提取该文件(您可以使用
Class#getResourceAsStream
),然后执行它,我如何在ProcessBuilder中对输入流进行管道传输?
ProcessBuilder
用于创建可操作的系统进程,这些进程通常作为带有参数列表的命令运行。因此,您不能运行jar中的shell脚本。如果您想这样做,我认为您必须从
InputStream
创建一个临时文件,然后使用这个tmpFile继续
ProcessBuilder
。我已经完成了这项工作,即通过jar执行shell脚本。我遇到的问题是,我尝试直接执行这个jar而不更改终端中的当前目录。如果我将cd刻录到jar的目录,然后执行这个jar文件,它就可以正常工作。但除此之外(根据我的要求),它无法定位我的sh文件。我意识到这是一个愚蠢的问题,在文件中读取inputstream,然后将文件路径导入ProcessBuilder。虽然这在理论上可以回答这个问题,但这并不是一个好的答案,因为它不教OP。相反,它给出了一个没有解释的替代解决方案。这通常会导致OP无法学习,当出现类似问题时,会回来问新问题。你介意再解释一下吗?