现在的位置: 首页 > 综合 > 正文

关于URI、URL、URN区别和JAVA中对应类

2014年02月07日 ⁄ 综合 ⁄ 共 4473字 ⁄ 字号 评论关闭

URI、URL、URN区别和JAVA中对应类

 

URI(Universal Resource Identifier:统一资源标识) :

它是以某种统一的(标准化的)方式标识资源的简单字符串。Web上可用的每种资源 - HTML文档、图像、视频片段、程序等 - 由一个通过统一资源标识进行定位。

URI的格式:(URI一般由三部分组成)

访问资源的命名机制。
存放资源的主机名。
资源自身的名称,由路径表示。

其实URL是URI一个子集。

URL(Uniform Resoure Locator:统一资源定位器)

URL是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上。采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。

URL的格式(URL的格式由下列三部分组成)

第一部分是协议(或称为服务方式)https,http,ftp
第二部分是存有该资源的主机IP地址和端口号(默认80,而且会被省略)
第三部分是主机资源的具体地址。如目录和文件名等。
第一部分和第二部分之间用“://”符号隔开,第二部分和第三部分用“/”符号隔开。第一部分和第二部分是不可缺少的,第三部分有时可以省略。

文件的URL:
用URL表示文件时,服务器方式用file表示,后面要有主机IP地址、文件的存取路径(即目录)和文件名等信息。有时可以省略目录和文件名,但“/”符号不能省略。
例一:file://ftp.yoyodyne.com/pub/files/foobar.txt
代表存放主机ftp.yoyodyne.com上的pub/files/目录下的一个文件,文件名是foobar.txt。

URN (Uniform Resource Name, 统一资源名称) : 也用来标识Internet上的资源,但是它们通过使用一个独立于位置的名称来实现。

三者区别:

体系中的URI、URL和URN是彼此关联的。URI的范畴位于体系的顶层,URL和URN的范畴位于体系的底层。这种排列显示URL和URN都是URI的子范畴

URI不能定位或读取/写入资源。这是URL的任务。URL是一种URI,但是它的大纲组件是已知的网络协议(简称协议),并且它把URI组件与某种协议处理程序(一种资源定位器和根据协议建立的约束规则与资源通讯的读/写机制)。

URI一般不能为资源提供持久不便的名称。这是统一的资源命名(URN)的任务。URN也是一种URI,但是全球唯一的、持久不便的,即使资源不在存在或不再使用。

URI是一个更广泛的概念,如URL,URN都是一种URI,可以说URI是抽象的,而具体使用URL,URN来定位。

URI是用来标识Internet资源的字符串。 URI严格的与Web上一个对象的Internet地址等价。

URI,URN以及URL具有相似的目标,因此可以互用。 URI最抽象最概括;因此,它们通常用于技术规范之中。例如URI的语法定义可以作为URN与URL语法定义的基础。 URN最为通用,但是它们依赖命名来查找服务,因此依赖于并非总是可以用的额外的服务。URL最为常用,并且是HTTP与Web软件的基础。

JAVA中的URI和URL:

URL和URI都属于JAVA.NET下面的一个类。URI是URL的一个抽象,它不仅包括了统一资源定位符(URL),还包括了统一资源名 (URN).大多数实际应用中使用的URI都是URL,但是许多规范和标准像XML都是用URI来定义的.在java1.4和更新的版本中, URL被java.net.URI 类所表示.这个类与java.net.URL 相比有如下3点重要的区别:

1.URI 类只关心资源的标识和对URI的解析.它没有方法来检索它的URI所标识的资源。
2.URI 类与URL 类相比,它更能适应相关的规范。
3.一个URI 对象能表示一个相对URI 。URL 类在存放之前,就已经对所有的URI进行了“绝对化”的处理。

简而言之,一个URL 对象就是网络应用层协议进行网络检索的一个代理,而一个URI 对象就只纯粹地做string的解析和操作的工作。URI 类没有进行网络检索的能力。URL 类有一些进行string解析的方法。比如getFile( ) 和 getRef( ) 方法,但很多都是蹩脚的方法,总是不完全像有关的规范上所说的那样好用。假如你现在用的是java1.4版本或更新的版本,这时你就可以做出选择,如果你 想下载一个URL指示的内容时,你应该使用 URL类;如果你想使用URI类来进行标识的工作而不是用来检索的时候,你应该用URI类。例如,去标识一个XML
namespace 的URI。在一些情况下,当你同时需要实现这两种功能时,你可以用方法toURL( ) 把一个URI 转换成一个 URL 。在java1.5中,你还能用类URL 中的方法toURI( )把一个URL 转换成一个URI e。

JAVA中构造一个URI

  URI 从字符串构建。与 URL 类不同,URI 类不依赖于底层协议处理器。只要是 URI 语法上正确,Java 就不需要为了创建用于表示的 URI 对象而理解其协议。这样,与 URL 类不同,URI 类可以用于新的试验性的URI 模式。

  public URI(String uri) throws URISyntaxException

  这是基本的构造函数,根据任何满足条件的字符串创建一个新的 URI 对象。例如:

  URI voice = new URI("tel:+1-800-9988-9938");
  URI web = new URI("http://www.xml.com/pub/a/2003/09/17/stax.html#id=_hbc");
  URI book = new URI("urn:isbn:1-565-92870-9");

  如果字符串参数不遵循URI 语法( 例如,如果 URI 以冒号开头) 此构造函数将抛出 URISyntaxException 异常。这是一个受查异常,所以需要捕获此异常,或者在调用构造函数的方法中声明并抛出该异常。但是,有一条语法规则不会检查。与 URI 规范不同的是,URI 中使用的字符不限于 ASCII。它可以包括其他 Unicode 字符,如 é。在语法上 URI 没有多少限制,特别是,如果不再需要对非 ASCII 字符编码,并且允许相对 URI 的话,那就真没有什么限制了。几乎所有字符串都可以解释为
URI。

  public URI(String scheme, String schemeSpecificPart, String fragment)   throwsURISyntaxException

  这个构造函数主要用于非层次 URI。模式(scheme)是 URI 的协议,如 http、urn、tel 等等。它必须由ASCII 字母、数字及三个标点字符 +、- 和 . 组成。模式必须以字母开头。若此参数为 null,则省略模式,这样会创建一个相对 URI。例如:

  URI absolute = new URI("http", "//www.ibiblio.org" , null);
  URI relative = new URI(null, "/javafaq/index.shtml", "today");

  模式特有的部分取决于URI 模式的语法;对于 http URI 是一种情况,对于 mailto URI 是另一种情况,对于 tel URI 又是其他情况。因为 URI 类会用百分号转义字符来对无效字符编码,实际上这部分不会有任何语法错误。

  最后,第三个参数包含一个片段标识符(如果存在的话)。再次说明,片段标识符中禁止的字符会被自动转义。为此参数传递 null 就会忽略片段标识符。

  public URI(String scheme, String host, String path, String fragment)
  throws URISyntaxException

  这个构造函数用于层次 URI,如 http 和 ftp URL。主机和路径一起(用/ 分隔)组成 URI 的模式特有部分

  例如:

  URI today= new URI("http", "www.ibiblio.org", "/javafaq/index.html", "today");

  将生成 URI http://www.ibiblio.org/javafaq/index.html#today。如果此构造函数无法根据提供的各部分形成有效的层次 URI(例如,如果存在模式,所以 URI 必须为绝对 URI,但路径没有以 / 开头),那么它将抛出 URISyntaxException 异常。

  public URI(String scheme, String authority, String path, String query,String fragment)   throws URISyntaxException

  这个构造函数与前一个基本相同,只是添加了一个查询字符串部分。例如:

  URI today= new URI("http", "www.ibiblio.org", "/javafaq/index.html",
  "referrer=cnet&date=2004-08-23", "today");

  通常,任何不可转义的语法错误都会导致抛出 URISyntaxException 异常,所有参数都可以传递 null 来忽略这一部分。

  public URI(String scheme, String userInfo, String host, int port, String
  path, String query, String fragment) throws URISyntaxException

  这是前面两个构造函数所调用的主要 URI 构造函数,它有层次性。此方法将授权机构分解为用户信息、主机和端口各部分,每个部分都有自己的语法规则。例如:

  URI styles = new URI("ftp", "anonymous:elharo@metalab.unc.edu","ftp.oreilly.com", 21, "/pub/stylesheet", null, null);

  但是,生成的 URI 仍然必须遵循 URI 的所有通用规则,再次说明,任何参数都可以传入 null,以忽略结果中的这一部分。

  public static URI create(String uri)

  这不是构造函数,而是一个静态工厂方法。与构造函数不同,它不抛出 URISyntax-Exception 异常。如果你确定你的 URI 是有效的,不违反任何规则,就可以使用这个方法。例如,下面的调用将创建使用电子邮件地址作为口令进行匿名 FTP 访问的 URI:

  URI styles =   URI.create("ftp://anonymous:elharo%40metalab.unc.edu@ftp.oreilly.com:21/pub/stylesheet");

  如果此 URI 证明是不正确的,这个方法会抛出一个 IllegalArgumentException 异常。这是运行时异常,所以不必显式声明或捕获它。

 

抱歉!评论已关闭.