使用Java';找不到文件;s获取资源

使用Java';找不到文件;s获取资源,java,file,Java,File,我试图从我的类中加载一个名为Test的文件,但不知何故Java说,该文件不存在,而它显然存在,URL对象URL既不是空的,也不包含无效路径,当我调试程序时,文件对象file中存储了正确的路径。当我打印出文件.getPath()并将其粘贴到Windows资源管理器中时,它会很好地打开。我正在运行Eclipse,但我尝试在控制台中运行该程序,但它也不起作用 public static void main(String[] args) { URL url = Test.class.getRes

我试图从我的类中加载一个名为
Test
的文件,但不知何故Java说,该文件不存在,而它显然存在,URL对象
URL
既不是空的,也不包含无效路径,当我调试程序时,文件对象
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文件夹:

bin/
  |___package/Test.class
  |___Test
输出(项目称为“其他”):


使用
Test.class.getResource(“/Test”)
会造成很多麻烦,因为您永远不知道资源是普通文件还是JAR文件中的资源是无法直接访问的

因此,首选的方法是使用
getResourceAsStream(String)
,它返回一个可直接读取的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();
    }

FilePath不应该有“file:\”前缀。谢谢@shan,多亏了你,我找到了修复方法。我错误地使用了
url.toExternalForm()
而不是
url.getFile()
请告诉我们您真正想要做什么。通过
getResource(..)
访问资源是一种方法,但非常复杂且容易出错。如果您想读取文件
getresourceastream(..)
是更好的选择。您可以假设
getResource
返回的URL是一个
文件:
;这听起来是个坏主意。如果资源不存在,
getResource
将返回null。您不能使用
url.openStream()
读取文件吗?您提供的“/Test”字符串没有文件扩展名。这是什么类型的文件?将类似“Test.txt”或“Test.pdf”的内容作为参数更有意义。而且,它应该是
!file.exists()
而不是
!文件exists()
-不应该有空格。为什么
getResource()
会在JAR中造成问题?我认为这两者之间唯一的区别是
getResource
返回一个
URL
,而
getresourceastream
返回一个
InputStream
,是
getResource
@Sheldon的简写。Jar文件中的文件不能使用
file
类直接访问。因此,对于每种情况,您都必须实施特定的方法<代码>getResourceAsStream()为您做一切。
    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();
    }