有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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中的URIURL之间的区别是前者不编码空格吗?Cf.Files, URIs, and URLs conflicting in Java(这个答案很好地解释了这两个术语之间的一般概念性的差异:URIs identify and URLs locate;

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

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


共 (4) 个答案

  1. # 1 楼答案

    Pavel Horal's answer很好

    正如他所说,“文件”这个词在URL#getFilejava.io.File中有着完全不同的(实际上不相关的)含义——这可能是混淆的一部分

    我想补充一下:

    • Java中的资源是一个抽象概念,是可以读取的数据源。资源的位置(或地址)在Java中由URL对象表示

    • 资源可以对应于本地文件系统中的常规文件(特别是当其URLfile://开头时)。但资源更一般(它也可以是存储在jar中的某个文件,或从网络、内存中读取的某些数据,或…)。而且它也更有限,因为File(除了是常规文件之外的其他东西:目录、链接)也可以创建和写入

    • 请记住,在Java中,File对象实际上并不表示“文件”,而是表示文件的位置(全名和路径)。因此,File对象允许您定位(并打开)一个文件,就像URL对象允许您访问(并打开)一个资源一样。(Java中没有表示资源的Resource类,但也没有表示文件的类!再说一遍:File不是文件,而是文件的路径)

  2. # 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. # 3 楼答案

    据我所知,你可以将其分类如下:

    基于Web的:URI和URL

    • URL:URL是互联网上的一个确定位置(只是一个普通的网址,比如-stackoverflow.com)
    • URI:任何URL都是一个URI。但URI也可以包含“mailto:”之类的内容,所以它们也可以说是某种“脚本”

    和本地:资源、路径和文件

    • 资源:资源是jar中的文件。它们用于从罐子/容器中加载文件
    • 路径:路径基本上是一个字符串。但是它附带了一些方便的函数来连接多个字符串,或者向一个字符串添加文件。它确保你正在构建的路径是有效的
    • 文件:这是对目录或文件的引用。它用于修改文件、打开文件等

    如果将它们合并到一个类中会更容易——它们确实令人困惑:D

    我希望这对你有帮助:)

    (我只是看了一下文档——看看docs.oracle.com)

  4. # 4 楼答案

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


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

    • File表示可通过文件系统访问的文件或目录
    • resource是应用程序可以加载的数据对象的generic term
      • 通常资源是与应用程序/库一起分发的文件,并通过类加载机制加载(当它们位于类路径上时)
    • URL#getPath是URL的路径部分的getter(protocol://host/path?query
    • URL#getFile根据JavaDoc返回path+query

    在Java中,URI只是一个用于操作通用标识符本身的数据结构

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

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

    还要注意URL#getFilejava.io.File无关


    Why do I need File object; why isn't a Resource (URL) enough?

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

    And is there a Resource object?

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