有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java getClassLoader()。getResource(filepath)返回一个空指针

我正在使用一种方法为一个研究项目动态生成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());

现在,我确信这个文件是直接写入的。如果我打印输出。getAbsolutePath()并通过终端导航到那里,以检查文件,所有内容都已正确生成和写入,因此文件系统上的所有内容都是正确的。但是,该代码:

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

其中_levelFile是我在上面生成的文件名之一,导致url为空。路径没有损坏或其他任何问题,打印验证_levelFile是否指向正确的路径。对于其他文件,同样的代码也成功了。此外,这个错误似乎与我是否使用getPath()、getCanonicalPath()或getAbsolutePath()来进一步设置输出无关。isReadable(真)什么都不做

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

(*)至少不用花很大力气重写我正在使用的框架的大部分,即使当前代码在所有其他情况下都成功了

编辑:

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


共 (2) 个答案

  1. # 1 楼答案

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

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

  2. # 2 楼答案

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

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

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

    编辑

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

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