我期待在一段Java代码,现在,它需要一个路径作为字符串,并使用获得其URL URL resource = ClassLoader.getSystemClassLoader().getResource(pathAsString);
,然后调用String path = resource.getPath()
最后执行new File(path);
。
哦,也有来电URL url = resource.toURI();
和String file = resource.getFile()
我现在完全糊涂了 - 大部分的术语,因为,我猜。 可有人请走我走过的差异,或提供一些链接到虚拟防爆材料? 特别是URI到URL和资源文件 ? 对我来说,感觉就像他们应该是同样的事情,分别...
之间的差别getFile()
和getPath()
在这里解释说: 有什么url.getFile()和的getPath()有什么区别? (有趣的是,他们似乎都返回字符串,这可能增加了一大堆我的心态......)
现在,如果我有一个定位器,它引用一个JAR文件中的类或包,将那两个(即路径的文件中的字符串)有什么区别?
resource.toString()
会给你jar:file:/C:/path/to/my.jar!/com/example/
,毕竟(注意感叹号)。
是Java URI和URL之间的区别在于,前者不编码空间? 参看 文件的URI和URL在Java中发生冲突 (这个答案解释这两个词之间的一般概念上的差异相当好: URI的识别和URL定位; )
最后-也是最重要的- 为什么我需要File
对象; 为什么不是资源( URL
)就够了吗? (而且是有资源的对象?)
很抱歉,如果这个问题是有点无组织的; 它只是反映了混乱我... :)
UPDATE 2017年4月12日入住杰威尔的答案 ,因为它包含了更为详尽和确切的解释!
请注意,我不认为自己100%的能力来回答,但尽管如此,这里有一些意见:
-
File
表示通过文件系统中的文件或目录的访问 - 资源是通用术语,对于能够由应用程序加载的数据对象
- 通常资源与应用程序/库分布和经由类加载机构加载的文件时(当它们驻留类路径上)
-
URL#getPath
是URL的路径部分的吸气剂( protocol://host/path?query
) -
URL#getFile
按JavaDoc的返回path+query
在Java中, URI
是只用于操作通用标识符本身的数据结构。
URL
,另一方面确实是一个资源定位器,并提供你拥有真正读通过注册的资源URLStreamHandler
秒。
网址可能会导致文件系统资源,并可以通过使用构建每一个文件系统资源的URL file://
协议(因此File
< - > URL
关系)。
另外要注意的是URL#getFile
无关java.io.File
。
为什么我需要的文件对象; 为什么不是资源(URL)就够了吗?
这是不够的。 只有当你想将资源传递给一些组件可与文件只工作,你需要得到File
从它。 然而,并非所有的资源URL可以转换为File
秒。
,是有资源的对象?
从视JRE点,它只是一个术语。 一些框架为您提供这样的类(如Spring的资源 )。
我现在完全糊涂了 - 大部分的术语,因为,我猜。 可有人请走我走过的差异,或提供一些链接到虚拟防爆材料? 特别是URI到URL和资源文件? 对我来说,感觉就像他们应该是同样的事情,分别...
该术语是混乱的,有时令人迷惑,而且大多从进化生两个Java作为一个API和平台随着时间的推移。 要了解这些字词如何来代表他们做什么,要认识到影响Java的设计两件事情是很重要的:
- 向后兼容性。 旧的应用程序应该在较新的设备上运行,最好不用修改。 这意味着旧的API(其名称和术语)需要通过所有新版本进行维护。
- 跨平台。 该API应该提供其底层平台的可用抽象,不管是一个操作系统或浏览器。
我会通过概念走,他们是如何走过来的。 之后,我会回答你的其他具体的问题,因为我可能要参考的东西在第一部分。
什么是“资源”?
一个抽象的,通用的片可以位于和读取数据的。 松松说,Java使用这指的是“文件”,可能不是一个文件,但确实代表了一个名为一块数据。 它不具有Java中的直接类或接口的表示 ,但由于其性质(可定位的,可读的)它是由URL常常表示。
由于Java的早期设计目标之一是要在浏览器内具有非常有限的权限/特权/安全检查运行,为沙盒应用程序(applets!),Java使得文件之间存在明显的(理论上的)差异(在本地的东西文件系统)和资源(东西它需要读取)。 这就是为什么读点相对于应用程序(图标类文件,等等)通过完成ClassLoader.getResource
而不是通过文件类。
不幸的是,因为“资源”也是这种解释之外的有用的总称,它也被用来命名非常具体的东西(如类资源包 , UIResource的 , 资源 )都没有,从这个意义上讲,资源。
表示(一个路径)的资源的主要类别是java.nio.file.Path , java.io.File的 , java.net.URI中 ,和的java.net.URL 。
文件 (java.io,1.0)
文件和目录路径名的抽象表示。
File类代表一个资源,那就是通过平台的本地文件系统的访问 。 它包含文件的唯一名称,因此实在是多路径(见下文),该主机平台根据自身设置,规则和语法解释。
请注意,文件并不需要指向本地的东西,只是一些主机平台在文件访问的情况下,例如在Windows UNC路径的理解。 如果您在OS安装一个ZIP文件作为文件系统,然后将文件读取其包含的条目就好了。
URL (java.net,1.0)
类URL代表一个统一资源定位符,它指向万维网上的“资源”。 资源可以作为一个文件或目录一样简单,也可以是如查询数据库或搜索引擎更复杂的对象,参考。
在与资源的概念串联,该URL代表的资源文件类表示在主机平台上的文件的方式:为指向资源的结构化字符串。 URL还包含,在如何达到资源提示的方案(用“文件:”被“问主机平台”),所以允许在资源,通过HTTP,FTP指点,一个JAR,和诸如此类的东西里面。
不幸的是,网址,带着自己的语法和词汇,包括使用“文件”和“路径”的。 在案件的网址是一个文件的URL,URL.getFile将返回一个字符串等同于被引用的文件的路径字符串。
Class.getResource
返回一个URL:它比返回文件更灵活,并一直担任该系统的需要,在90年代初的想象。
URI (java.net,1.4)
代表一个统一资源标识符(URI)的参考。
URI是在一个URL(轻微)的抽象。 URI和URL之间的区别是概念和主要学术,但URI是正式意义上的更好的定义,并且涵盖了更广泛的使用情况。 由于URL和URI是/不一样的东西,被引入了一个新类来表示他们,方法URI.toURL和URL.toURI一个和另一个之间移动。
在Java中,URL和URI之间的主要区别是,URL携带被解析的预期 ,一些应用程序可能需要从InputStream; 一个URI被视为更像是一个抽象的thingamajig 可能指向东西解析(通常如此),但是这意味着什么,以及如何去实现它的上下文和解释更加开放。
路径 (java.nio.file,1.7)
可用于定位在文件系统中的文件中的对象。 它通常会代表一个系统的文件路径。
新的文件API,在Path的界面图标化,允许比File类更大的灵活性,可以提供。 该路径接口是文件类的抽象 ,是一部分新的IO文件API 。 其中file必然指向所理解的主机平台上的“文件”,路径是更通用的:它代表在任意文件系统中的文件(资源)。
路径带走上的文件的主机平台概念的依赖。 这可能是在一个ZIP文件中的条目,通过FTP或SSH-FS到达的文件,应用程序类路径的多根表示,或可以通过文件系统接口和驱动程序,FileSystemProvider进行有意义的真正代表什么。 它带来的“安装”文件系统的能力到Java应用程序的情况下。
主机平台是通过“默认文件系统”表示; 当你调用File.toPath
,你会得到默认的文件系统上的路径。
现在,如果我有一个定位器,它引用一个JAR文件中的类或包,将那两个(即路径的文件中的字符串)有什么区别?
不太可能。 如果jar文件是本地文件系统上,你不应该有一个查询组件,所以URL.getPath
和URL.getFile
应该返回相同的结果。 但是,挑一个你需要的:文件的URL可能通常没有查询组件,但我可以肯定添加一个反正。
最后 - 也是最重要的 - 为什么我需要的文件对象; 为什么不是资源(URL)就够了吗?
因为文件,您可以访问总务数据,如权限(可读,可写,可执行文件),文件类型(我是一个目录?),以及搜索和操作本地文件系统的能力网址可能是不够的。 如果这些是你需要的功能,然后文件名或路径提供给他们。
如果你有机会到路径不需要的文件。 一些较旧的API可能需要的文件,但。
(而且是有资源的对象?)
不,没有。 有一个名为喜欢很多东西,但他们不是意义上的资源ClassLoader.getResource
。
帕维尔Horal的回答是不错的。
正如他所说,单词“文件”有着完全不同的(几乎不相关的)的含义URL#getFile
VS java.io.File
-可能是这混乱的一部分。
我想补充:
Java中的资源是一个抽象的概念,数据源可以读取。 一个资源的位置(或地址)是用Java由a表示URL
对象。
资源可以对应于本地文件系统中一个普通文件(特别是当其URL
开头file://
)。 但资源是更普遍的(它也可以存储在一个罐子里,或者一些数据的一些文件,从网络读取,或从存储器,或......)。 而且它也较为有限,因为一个File
(除了是其他的东西不是一个常规文件:一个目录,链接)也可以创建和writen来。
请记住,在Java中的File
对象并不真正代表“一号文件”,但位置(全名,用路径)的文件。 所以,一个File
对象可以找到(并打开)的文件,作为一个URL
,您可以访问(开放的)的资源。 (有没有Resource
的Java类代表一个资源,但也有一个代表一个文件一次: File
不是一个文件,它是一个文件的路径)。
据我了解,你可以将其分为以下几点:
基于Web的:URI和URL。
- 网址:一个URL是在Internt的一个明确的位置(只是一个普通的webaddress像 - stackoverflow.com)
- URI的:自从URL是URI。 而是URIs也可以包含像“的mailto:”,所以他们都还可以,还有一些是“剧本”什么,我会说。
和地方:资源,路径和文件
- 资源:资源是JAR文件中的文件。 它们被用来加载文件出罐/容器。
- 路径:路径基本上是一个字符串。 但它与一些方便的功能来连接多个字符串,或将文件添加到字符串。 它可以确保你正在建设的路径是否有效。
- 文件:这是一个目录或文件的引用。 它用于修改文件,打开它们等。
这将是更容易,如果他们将被合并为一类 - 他们是真正的困惑:d
我希望这可以帮助你 :)
(我刚刚看了一下文档 - 看docs.oracle.com)
一个文件在本地文件系统的实体的抽象表示。
路径通常是指示文件系统内的文件的位置的字符串。 它通常不包括文件名。 所以C:\文件\的MyStuff \ stuff.txt将有以“C:\文档\的MyStuff”的值的路径显然绝对文件名和路径的格式会从文件系统文件系统千差万别。
URL是URI与URL一个susbset通常较HTTP访问的资源。 我不认为有任何形式的约当事情已经是一个URI Vs的URL铁定的规律的。 URI是在“协议://资源标识符”的形式字符串,例如比特币://参数,可以http://something.com?param=value 。 像URL类通常包裹串并提供字符串就没有理由提供实用方法。
因为资源没有这样的事情,至少不是在这个意义上,你是在谈论。 仅仅因为一个方法命名的getResource并不意味着它返回一个类型资源的对象。
最终,最好的办法找出一个类的方法做的是在你的代码来创建它的一个实例,调用的方法,然后要么在调试模式下步或将结果发送到System.out。