什么';Java中的资源、URI、URL、路径和文件之间有什么区别?

什么';Java中的资源、URI、URL、路径和文件之间有什么区别?,java,url,terminology,Java,Url,Terminology,我现在正在看一段Java代码,它将路径作为字符串,并使用URL resource=ClassLoader.getSystemClassLoader().getResource(pathAsString)获取其URL,然后调用String path=resource.getPath(),最后执行新文件(path) 哦,还有对URL=resource.toURI()的调用和String file=resource.getFile() 我现在完全糊涂了——我想主要是因为术语。有人可以带我了解这些差异,

我现在正在看一段Java代码,它将路径作为字符串,并使用
URL resource=ClassLoader.getSystemClassLoader().getResource(pathAsString)获取其URL
,然后调用
String path=resource.getPath()
,最后执行
新文件(path)

哦,还有对
URL=resource.toURI()的调用
String file=resource.getFile()

我现在完全糊涂了——我想主要是因为术语。有人可以带我了解这些差异,或者提供一些虚拟证据材料的链接吗?特别是URL的URI和文件的资源?对我来说,感觉他们应该是一样的东西,分别

这里解释了
getFile()
getPath()
之间的区别:(有趣的是,它们似乎都返回字符串,这可能会大大增加我的思维状态……)

现在,如果我有一个引用jar文件中的类或包的定位器,这两个(即文件字符串的路径)会有所不同吗

resource.toString()
将为您提供
jar:file:/C:/path/to/my.jar/com/example/
,毕竟(注意感叹号)

Java中URIURL之间的区别是前者不编码空格吗?Cf.(这个答案很好地解释了这两个术语在概念上的一般差异:)

最后——也是最重要的——为什么我需要
文件
对象;为什么资源(
URL
)不够?
(有资源对象吗?)


对不起,如果这个问题有点杂乱无章;这只是反映了我的困惑…:)

更新2017-04-12检查,因为它包含更详尽和准确的解释


请注意,我不认为自己有能力回答100%个问题,但是这里有一些评论:

  • 文件
    表示可通过文件系统访问的文件或目录
  • 资源是可由应用程序加载的数据对象的
    • 通常资源是随应用程序/库一起分发的文件,并通过类加载机制加载(当它们位于类路径上时)
  • URL#getPath
    是URL的路径部分的getter(
    protocol://host/path?query
  • URL#getFile
    根据JavaDoc返回
    path+query
在Java中,
URI
只是一个用于操作通用标识符本身的数据结构

另一方面,
URL
实际上是一个资源定位器,为您提供了通过注册的
URLStreamHandler
s实际读取资源的功能

URL可以指向文件系统资源,您可以使用
file://
协议为每个文件系统资源构造URL(因此
file
URL
关系)

还要注意,
URL#getFile
java.io.File
无关


为什么我需要文件对象;为什么资源(URL)不够

够了。只有当您想将资源传递给某个只能使用文件的组件时,才需要从中获取
File
。但是,并非所有资源URL都可以转换为
文件
s

还有资源对象吗


从JRE的角度来看,这只是一个术语。一些框架为您提供了这样的类(例如)。

据我所知,您可以将它们分类如下:

基于Web的:URI和URL

  • URL:URL是Internet上的一个确定位置(只是一个普通的网址,如-stackoverflow.com)
  • URI:URL是一个URI。但URI也可以包含“mailto:”之类的内容,所以它们也可以说是某种“脚本”
和本地:资源、路径和文件

  • 资源:资源是jar中的文件。它们用于从jar/容器中加载文件
  • 路径:路径基本上是一个字符串。但是它附带了一些方便的函数来连接多个字符串,或者将文件添加到一个字符串中。它确保您正在构建的路径有效
  • 文件:这是对目录或文件的引用。它用于修改文件、打开文件等
如果将它们合并到一个类中会更容易——它们确实令人困惑:D

我希望这对你有帮助:)


(我刚刚看了一下文档-看看docs.oracle.com)

文件是本地文件系统中实体的抽象表示

路径通常是一个字符串,指示文件在文件系统中的位置。它通常不包括文件名。因此c:\documents\mystuff\stuff.txt将有一个值为“c:\documents\mystuff”的路径。显然,不同文件系统的绝对文件名和路径的格式会有很大的差异

URL是URI的susbset,URL通常表示通过http访问的资源。我不认为有任何关于什么时候必须是URI和URL的铁一般的规则。URI是字符串,格式为“protocol://resource-identifier“比如bitcoin://params, . 像URL这样的类通常包装字符串,并提供字符串没有理由提供的实用程序方法

没有所谓的资源,至少在你所说的意义上没有。方法名为getResource并不意味着它返回Resource类型的对象

最终,了解类的方法的最佳方法是在代码中创建它的实例,调用这些方法,然后在调试模式下逐步执行,或者将结果发送到System.out

很好

正如他所说,“文件”一词在
URL#getFile
vs
java.io.file