文件未找到。为什么不?

时间:2009-03-11 19:45:23

标签: java file file-io io

好的,我正在尝试使用以下代码加载Java文件:

String file = "map.mp";
URL url = this.getClass().getResource(file);
System.out.println("url = " + url);
FileInputStream x = new FileInputStream("" + url);

尽管文件与类所在的文件夹相同,但它无法找到它(是的,完整代码中的try catch块中的 )。

但是,它会找到另一个使用相同代码并使用不同名称的文件:

URL url = this.getClass().getResource("default.png");
System.out.println("url2 = " + this.getClass().getResource("default.png"));
BufferedImage img = ImageIO.read(url);

为什么我的代码找不到我的map.mp文件?

4 个答案:

答案 0 :(得分:18)

您正在尝试使用网址,就像它是文件名一样。它不会。它将以file://开头。在其他部署方案中,可能根本没有要打开的实际文件 - 例如,它可能位于jar文件中。如果您确实需要,可以使用URL.getFile() - 但最好不要这样做。

使用getResourceAsStream代替getResource() - 直接为您提供InputStream。或者,如果您想要其他内容的网址,请继续使用getResource(),然后使用URL.openStream()获取数据。

答案 1 :(得分:4)

FileInputStream将文件名作为参数,而不是URL字符串。

获取URL指向openStream的内容的常用方法。您可以打开资源流,而无需使用URL / Class自己联系ClassLoader.getResourceAsStream(它会在实施中打开网址)。

或者,您可以使用以下命令打开文件网址

InputStream in = FileInputStream(new File(url.toURI()));

对于资源,这将要求您在文件系统上的jar外部具有原始类文件。 JNLP(Java WebStart)有一个用于打开文件的API是一种安全的方式。

一般情况下:转换为String使用toStringString.valueOf时,要清楚自己在做什么。另请注意,String的输入方式有点弱,因为该类型未提供其所包含数据格式的指示,因此喜欢URIFile之类的内容。

答案 2 :(得分:0)

尝试查看您要访问的文件是否正在找到或是否为目标文件。使用Sys internals File Monitor。它有助于监控SO访问哪些文件。

答案 3 :(得分:0)

你的路上有空间吗?你看到%20吗?删除它。 然后,这将起作用:getResource(file)就像getResourceAsStream()一样。

路径中的空间是邪恶的。总是避免它们。