【问题标题】:File not found. Why not?文件未找到。为什么不?
【发布时间】:2010-10-12 18:30:42
【问题描述】:

好的,我正在尝试使用以下代码在 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 文件?

【问题讨论】:

  • 在一个完全不相关的注释中,url.toString() 比 "" + url 更有效(也更好)。
  • 我们应该假设它抛出了 FileNotFoundException 吗?
  • 那么当你运行它时会打印出什么?我猜问题是 FileInputStream 不喜欢 URL。
  • 嘿,我应该在最后一条评论之前刷新页面。

标签: java file file-io io


【解决方案1】:

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

使用getResourceAsStream 而不是getResource() - 这会给你一个InputStream 直接。或者,如果您想要其他内容的 URL,请继续使用 getResource(),然后使用 URL.openStream() 获取数据。

【讨论】:

  • 第一个抛出 FnFE 结束第二个不抛出的原因是什么?
【解决方案2】:

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

获取URL 指向的内容的常用方法是使用openStream。您可以使用Class/ClassLoader.getResourceAsStream(它在实现中打开 URL)来打开资源流,而无需自己接触URL

或者,您可以使用以下命令打开 文件 URL:

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

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

一般情况下:转换为String 时,请使用toStringString.valueOf 来明确您在做什么。另请注意,String 的类型有点弱,因为该类型没有说明它包含的数据格式,所以喜欢URIFile 之类的类型。

【讨论】:

  • 那么我怎样才能正确加载文件呢?这将进入 Java Web Start Jar。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-12-14
      • 1970-01-01
      • 1970-01-01
      • 2022-11-29
      • 1970-01-01
      • 2023-03-31
      • 2021-12-09
      • 2011-04-27
      • 2016-10-20
      相关资源
      最近更新 更多