当前位置: 首页 > 面试题库 >

类加载器的资源路径总是绝对的吗?

淳于恺
2023-03-14
问题内容

在关于类加载方法之间差异的一个流行答案中,乔恩·斯凯特(Jon
Skeet)说,

类加载器资源路径始终被视为绝对路径。

一个更受欢迎的答案通过一个例子肯定了这一说法。

ClassLoader.getResourceAsStream(path)将所有路径视为绝对路径。因此,调用
String.getClassLoader().getResourceAsString("myfile.txt")
String.getClassLoader().getResourceAsString("/myfile.txt")都会在您的类路径中的以下位置查找文件:
./myfile.txt

忽略示例无法编译的事实,共识表明领先的正斜杠与ClassLoader无关。

一个简单的测试则相反。

Foo.class.getClassLoader().getResource("test.xml") // file
Foo.class.getClassLoader().getResource("/test.xml") // null

我只是将路径添加files/test.xml到测试项目的类路径中,而一个名为的类Foo包含一个main()打印这两个调用的结果的方法。自数百人投票赞成上述答案以来,我缺少什么?ClassLoader是绝对的,还是取决于输入名称的结构?

这篇Oracle博客文章有助于我的理解。

最终根据资源名称构造URL的方法是URLClassPath.JarLoader.checkResource()。


问题答案:

显然不是。

它是由类装载器来解释namegetResource(name)

检查的源代码URLClassLoader,最终它调用

new URL(baseURL, name)

在这里重要的name是绝对的还是相对的

对于某些变量baseURL,绝对变量/foo/bar和相对变量foo/bar可能具有相同的效果。特别是,类路径中的“
jar文件URL”
总是如此

baseURL:       jar:file:/home/duke/duke.jar!/

 foo/bar  ->   jar:file:/home/duke/duke.jar!/foo/bar 
/foo/bar  ->   jar:file:/home/duke/duke.jar!/foo/bar


 类似资料:
  • 我正在尝试将资源csv文件传递到我的Sprint Boot应用程序使用的jar中。尽管方法获取的资源参数=ReactiveWebContext资源[src/main/Resources/file.csv],但我总是得到该文件不存在的响应 > 在我的项目中,文件位于src/main/resources/file中。csv 正在应用中。属性,我定义: 在config类中: 在内部jar:Config类

  • 问题内容: 在Java中,您可以使用相同的API,但使用不同的URL协议来加载各种资源: 这很好地将资源的实际加载与需要资源的应用程序分离开来,并且由于URL只是一个字符串,因此资源加载也很容易配置。 是否有使用当前类加载器加载资源的协议?这类似于Jar协议,除了我不需要知道资源来自哪个jar文件或类文件夹。 我当然可以使用来做到这一点,但这需要我使用不同的API,因此需要对现有代码进行更改。我希

  • 问题内容: 是否有API可以获取类路径资源(例如,我将从中获得的资源)?理想情况下,我想将新的API与类路径资源一起使用。 问题答案: 这对我有用:

  • 是否有API来获取类路径资源(例如,我从)作为获取的类路径资源?理想情况下,我希望使用带有类路径资源的新的API。

  • 本文向大家介绍相对路径和绝对路径的写法总结,包括了相对路径和绝对路径的写法总结的使用技巧和注意事项,需要的朋友参考一下 在C#中 “\”是特殊字符,要表示它的话需要使用“\\”。由于这种写法不方便,C#语言提供了@对其简化。 只要在字符串前加上@即可直接使用“\”。所以上面的路径在C#中应该表示为“Book”,@“\Tmp\Book”,@“C:\Tmp\Book”。 相对路径使用“/”字符作为目录

  • 上面是我的程序,错误显示为: 可能的问题是什么?请帮忙,因为我是新来的 我面临着同样的问题,我该如何解决?