【发布时间】:2015-03-06 20:50:45
【问题描述】:
我现在正在查看一段 Java 代码,它将路径作为字符串并使用 URL resource = ClassLoader.getSystemClassLoader().getResource(pathAsString); 获取其 URL,然后调用 String path = resource.getPath(),最后执行 new File(path);。
哦,还有对URL url = resource.toURI();和String file = resource.getFile()的调用。
我现在完全糊涂了——我猜主要是因为术语。有人可以带我了解这些差异,或者提供一些指向 Dummy-proof 材料的链接吗?尤其是 URL 的 URI 和 文件的资源?对我来说,感觉它们应该是相同的东西,分别......
getFile() 和 getPath() 之间的区别在这里解释:What's the difference between url.getFile() and getpath()?(有趣的是,它们似乎都返回字符串,这可能会增加很多我的心态……)
现在,如果我有一个引用 jar 文件中的类或包的定位器,这两个(即文件字符串的路径)会有所不同吗?
毕竟resource.toString() 会给你jar:file:/C:/path/to/my.jar!/com/example/(注意感叹号)。
URI 和 URL in Java 的区别是前者不编码空格吗?参照。 Files, URIs, and URLs conflicting in Java(这个答案很好地解释了这两个术语之间的一般概念区别:URIs identify and URLs locate;)
最后 - 也是最重要的 - 为什么我需要File 对象;为什么 Resource (URL) 不够?(还有 Resource 对象吗?)
对不起,如果这个问题有点杂乱无章;它只是反映了我的困惑...... :)
【问题讨论】:
-
你甚至还没有开始看 NIO 的
Path和 FileSystem :) -
@eckes 请一次头痛。 ;)
-
好吧,在您的问题的上下文中,文件/URL+URI 不相关。一种是命名和操作文件的方法,另一种是命名和读取资源(可以是文件)的方法。 getFile 和 getPath 方法处理 URL 的组件,这些组件(令人困惑地)命名为文件对象。类加载器资源不表示为文件,因为它们可以有不同的来源(或嵌套在 JAR 文件中)。
-
我会注意到这段代码不太可能按预期工作。
URL是不透明的 - 如您所见,它是jar:file:,即.jar存档中的资源。把它改成File不太可能产生任何有用的东西。 -
问题的核心在于,resource 和 path 这两个词可能有不同的含义,具体取决于上下文。
标签: java url terminology