我在获取文件路径(资源文件夹中的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包含相应文件夹资产中的文件)
如果有人能帮助我,我将感激不尽。
答案 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
}