【问题标题】:getClassLoader().getResource(filepath) returns a null pointergetClassLoader().getResource(filepath) 返回一个空指针
【发布时间】:2011-12-01 04:32:12
【问题描述】:

我正在使用一种方法为研究项目动态生成 XML 文件,它们被放入从文件路径读取的加载器中,我无法控制加载器如何处理事情(否则我会传递内部 XML 表示而不是使用临时文件),我正在使用此代码来保存文件:

File outputs = File.createTempFile("lvlFile", ".tmp.xml");

FileWriter fw = new FileWriter(outputs);

fw.write(el.asXML());

fw.close();

// filenames is my list of file paths which gets returned and passed around

filenames.add(outputs.getAbsolutePath());

现在,我确定有问题的文件是直接写入的。如果我打印 output.getAbsolutePath() 并通过终端导航到那里以检查文件,则所有内容都会正确生成和写入,因此文件系统上的所有内容都是正确的。但是,这段代码:

URL url = this.getClass().getClassLoader().getResource(_levelFile);

其中 _levelFile 是我上面生成的文件名之一,导致 url 为空。路径没有损坏或任何东西,打印验证 _levelFile 指向正确的路径。相同的代码已成功用于其他文件。此外,该错误似乎与我是否使用 getPath()、getCanonicalPath() 或 getAbsolutePath() 无关,进一步设置 output.isReadable(true) 没有任何作用。

有什么想法吗?请不要提供 Url url = 结构的替代方案,我无法控制此代码*,我有义务更改我的代码以正确设置 url。

(*) 至少无需花费大量精力重写我正在使用的大部分框架,即使当前代码在所有其他情况下都成功。

编辑:

同样,我无法使用 URL 代码的替代方法,它是我无法触及的加载程序的一部分。此外,即使我将临时文件的路径设置为与成功加载的文件所在的目录相同的目录,加载也会失败。

【问题讨论】:

  • 由于您正在创建一个临时文件,在您关闭该文件后它可能会被自动删除。你检查了吗?

标签: java file url nullpointerexception


【解决方案1】:

我假设 ClassLoader 只会在类路径中查找资源 - 这可能不包括 /tmp。我不确定它是否真的支持绝对路径名。它可能只是将它们解释为相对于单个类路径的根。

改用_levelFile.toURI().toURL() 怎么样?

【讨论】:

  • 您对绝对路径是正确的。 getResource(anAbsolutePath) 将从给定类加载器的根目录开始。并且 /tmp 永远不会在类路径上,除非您手动将它放在那里。
  • 不能使用 toURI().toURL(),我将文件名从框架传递给一个方法,它执行 URL 代码,我不能修改参数或代码方法。
【解决方案2】:

您正在文件系统中创建文件,然后尝试将其作为资源读取。资源是 JVM 获取其类的地方,即类路径。因此,仅当您将文件写入类路径时,此操作才有效。

即使这是正确的,也要小心:例如,如果您从 Eclipse 运行,则在刷新工作区之前,您的进程可能不会“看到”新资源。

现在我的问题是:您真的确定要将文件作为资源读取吗?看来您应该创建新的FileInputStream(_levelFile) 并从中读取。

编辑

@Anonymous 是对的。您正在使用 createTempFile() 的 2-arg 版本创建临时文件,因此您的文件是在临时目录中创建的。它进入你的类路径的机会非常低...... :) 因此,如果您想阅读它,那么您必须获取它的路径,或者在创建输入流时使用它:

File outputs = File.createTempFile("lvlFile", ".tmp.xml");
..........................
InputStream in = new FileInputStream(ouptuts);
// now read from this stream.

【讨论】:

  • 不幸的是,我不能使用输入流,我的双手被 URL 代码捆绑,否则我已经这样做了。另外,使用三个参数 createTempFile 设置文件写入的目录与我成功读取的文件来自同一目录也有同样的问题。
猜你喜欢
  • 2010-10-12
  • 2017-08-12
  • 2018-11-19
  • 1970-01-01
  • 2011-04-17
  • 1970-01-01
  • 2013-01-22
  • 2012-10-02
  • 1970-01-01
相关资源
最近更新 更多