我使用方法为研究项目动态生成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());
现在,我确定有问题的文件是直接写入的。如果我打印outputs.getAbsolutePath()并通过终端导航来检查文件,所有内容都会生成并正确写入,因此文件系统上的所有内容都是正确的。但是,这段代码:
URL url = this.getClass().getClassLoader().getResource(_levelFile);
其中_levelFile是我上面生成的文件名之一,导致url为null。路径没有被破坏或任何东西,打印验证_levelFile指向正确的路径。其他文件的代码相同。此外,该bug似乎与我是否使用getPath(),getCanonicalPath()或getAbsolutePath()无关,进一步设置outputs.isReadable(true)不会做任何事情。
有什么想法吗?请不要提供Url url =结构的替代方案,我无法控制此代码*,我有义务更改我的代码,以便正确设置网址。
(*)至少没有重大努力重写我正在使用的框架的大部分,即使当前代码在所有其他情况下都成功。
编辑:
同样,我无法使用网址代码的替代方案,它是我无法触及的加载程序的一部分。此外,即使我将临时文件的路径设置为我成功加载的文件来自的同一目录,加载也会失败。
答案 0 :(得分:1)
我假设ClassLoader只查找类路径中的资源 - 可能不包括/tmp
。我不确定它是否真的支持绝对路径名。它可能只是将它们解释为相对于单个类路径的根。
如何使用_levelFile.toURI().toURL()
呢?
答案 1 :(得分:0)
您正在文件系统中创建文件,然后尝试将其作为资源读取。资源是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.