首页 > 解决方案 > 使用 Java 的 getResource 找不到文件

问题描述

我正在尝试加载Test从我的类中调用的文件,但不知何故 Java 说,该文件不存在,而它显然存在,并且 URL 对象既不url为空也不包含无效路径,当我调试程序时,文件对象file中存储了正确的路径。当我打印出来file.getPath()并将其粘贴到 Windows 资源管理器中时,它打开得很好。我正在运行 Eclipse,但我尝试在控制台中运行该程序,但它也不起作用。

public static void main(String[] args) {
    URL url = Test.class.getResource("/Test");
    File file = new File(url.toExternalForm());

    if (!file .exists()) {
      System.out.println("File does not exist: " + file.getPath());
      System.exit(-1);
    }
}

我用getResource("Test"),File("Test")也试过了File("/Test"),但也没有用。我不知道为什么会发生这种情况,因为我经常处理文件并且从来没有遇到过问题。

我要加载的文件位于源文件夹中,是的,我检查过,它在 Eclipse 中被识别为源文件夹并且位于类路径中。顺便说一句,该文件实际上只是在Test没有扩展名的情况下调用。

斌文件夹:

bin/
  |___package/Test.class
  |___Test

输出(项目称为“其他”):

File does not exist: file:\F:\Development\CoolDirectory\Other\bin\Test

标签: javafile

解决方案


使用Test.class.getResource("/Test");可能会导致很多麻烦,因为您永远不知道资源是普通文件还是 JAR 文件内部无法直接访问。

因此,首选方法是使用getResourceAsStream(String)which 返回可以直接读取的 InputStream。

以下示例使用 Java 9+ 特色功能:

    byte[] data = null;
    try (InputStream in = Test.class.getResourceAsStream("/Test")) {
        if (in == null) {
            System.out.println("Resource '/Test' does not exist");
            System.exit(-1);
        }
        data = in.readAllBytes();
    }

推荐阅读