Java中的资源、URI、URL、路径和文件有什么区别?
我现在正在看一段Java代码,它将路径作为字符串,使用URL resource = ClassLoader.getSystemClassLoader().getResource(pathAsString);
获取其URL,然后调用String path = resource.getPath()
,最后执行new File(path);
哦,还有对URL url = resource.toURI();
和String file = resource.getFile()
的呼叫
我现在完全糊涂了——我想主要是因为术语。有人能告诉我这些差异吗,或者提供一些虚拟证据材料的链接?尤其是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/
(注意感叹号)
Java中的URI和URL之间的区别是前者不编码空格吗?Cf.Files, URIs, and URLs conflicting in Java(这个答案很好地解释了这两个术语之间的一般概念性的差异:URIs identify and URLs locate;)
最后——也是最重要的——为什么我需要File
对象;为什么资源(URL
)不够(有资源对象吗?)
抱歉,如果这个问题有点杂乱无章;这只是反映了我的困惑…:)
# 1 楼答案
Pavel Horal's answer很好
正如他所说,“文件”这个词在
URL#getFile
和java.io.File
中有着完全不同的(实际上不相关的)含义——这可能是混淆的一部分我想补充一下:
Java中的资源是一个抽象概念,是可以读取的数据源。资源的位置(或地址)在Java中由
URL
对象表示资源可以对应于本地文件系统中的常规文件(特别是当其
URL
以file://
开头时)。但资源更一般(它也可以是存储在jar中的某个文件,或从网络、内存中读取的某些数据,或…)。而且它也更有限,因为File
(除了是常规文件之外的其他东西:目录、链接)也可以创建和写入请记住,在Java中,
File
对象实际上并不表示“文件”,而是表示文件的位置(全名和路径)。因此,File
对象允许您定位(并打开)一个文件,就像URL
对象允许您访问(并打开)一个资源一样。(Java中没有表示资源的Resource
类,但也没有表示文件的类!再说一遍:File
不是文件,而是文件的路径)# 2 楼答案
文件是本地文件系统中实体的抽象表示
路径通常是一个字符串,指示文件在文件系统中的位置。它通常不包括文件名。所以c:\documents\mystuff\stuff。txt将有一个值为“C:\documents\mystuff”的路径。显然,绝对文件名和路径的格式在不同的文件系统之间会有很大的差异
URL是一组URI,URL通常表示通过http访问的资源。我不认为有任何关于什么时候必须是URI和URL的铁一般的规则。URI是字符串,格式为“protocol://resource-identifier“比如bitcoin://params,http://something.com?param=value。像URL这样的类通常会包装字符串,并提供字符串没有理由提供的实用方法
没有所谓的资源,至少在你所说的意义上没有。方法名为getResource并不意味着它返回Resource类型的对象
最终,了解类的方法的最佳方法是在代码中创建它的实例,调用这些方法,然后在调试模式下逐步执行,或者将结果发送到系统。出去
# 3 楼答案
据我所知,你可以将其分类如下:
基于Web的:URI和URL
和本地:资源、路径和文件
如果将它们合并到一个类中会更容易——它们确实令人困惑:D
我希望这对你有帮助:)
(我只是看了一下文档——看看docs.oracle.com)
# 4 楼答案
更新2017-04-12检查JvR's answer,因为它包含更详尽和准确的解释
请注意,我不认为自己有能力回答100%个问题,但是这里有一些评论:
File
表示可通过文件系统访问的文件或目录URL#getPath
是URL的路径部分的getter(protocol://host/path?query
)URL#getFile
根据JavaDoc返回path+query
在Java中,
URI
只是一个用于操作通用标识符本身的数据结构另一方面
URL
实际上是一个资源定位器,它为您提供了通过注册的URLStreamHandler
来实际读取资源的功能URL可以指向文件系统资源,您可以使用
file://
协议为每个文件系统资源构造URL(因此File
<;->;URL
关系)还要注意
URL#getFile
与java.io.File
无关够了。只有当您想将资源传递给只能处理文件的组件时,才需要从中获取
File
。但是,并非所有资源URL都可以转换为File
s从JRE的角度来看,这只是一个术语。一些框架为您提供了这样的类(例如Spring's Resource)