URL和URI(二)URI

URI类

URI是对URL的抽象,不仅包括统一资源定位符(Uniform Resource Locator,URL)还包括统一资源名(Uniform Resource Names,URN)。实际使用的URI大多是URL,正常情况下,假如你想下载一个URL的内容,应当使用URL类,如果想使用URL来完成标识而不是获取,就应当使用URI类;

构造一个URI

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

第一个构造函数根据任何满足条件的字符串创建一个新的URI对象:

URI uri = new URI("http://www.baidu.com");   //如果不遵循URI语法,会抛出URISyntaxException异常

第二个构造函数需要一个模式特定部分。模式(scheme)是URI的协议,如http、urn、tel等;第三个参数包含一个片段标识符(Fragment Identifiers,如果有的话)。为这个参数传入null时,会忽略片段标识符:

URI uri = new URI("http","//www.baidu.com",null);

第三个构造函数用于层次URI:

URI uri = new URI("http","www.baidu.com","/index.html","today");

这会生成URI:http://www.baidu.com/index.html#today
第四个构造函数与前一个基本相同,只是添加了一个查询字符串部分:

URI uri = new URI("http","www.baidu.com","/index.html","name=yd&sex=man","today");

第五个构造函数是前面两个构造函数调用的主层次URI构造函数。这个方法将授权机构分解为用户信息、主机和端口部分:

URI uri = new URI("http", "admin", "www.baidu.com", 80, "/index.htm", "name=yd&sex=man", "#");

URI的各个部分

URI引用包括最多三个部分:模式、模式特定部分和片段标识符:

  • 模式:模式特定部分:片段

在这里插入图片描述

public String getScheme()
public String getSchemeSpecificPart()        //解码相应的组成部分中的任何转义八位组
public String getRawSchemeSpecificPart()     //以原始形式返回它们的相应组成部分的值,不解释任何转义八位组。
public String getFragment()
getRawFragment()

在这里插入图片描述

public boolean isAbsolute()

在许多有用的URI中,模式特定部分都有一个特定的分层格式,划分为授权机构、路径和查询字符串。授权机构进一步划分为用户信息、主机和端口。如果URI是一个层次URI时,isOpaque()返回false,如果不是分层的URI,isOpaque()则返回true:

public boolean isOpaque() {     //Opaque不透明
        return path == null;
    }

在这里插入图片描述
当特定URI不包含某个信息时,相应的方法会返回null。getPort()是个例外。由于它声明为返回一个int,所以它无法返回null。实际上,它会返回-1表示省略了端口;

解析相对URI

URI类提供了3个方法可以在相对和绝对URI之间来回转换:

public URI resolve(URI uri)
public URI resolve(String str)
public URI relativize(URI uri)
URI uri = new URI("http://www.baidu.com"); 
URI uri2 = new URI("/index.html");
URI uri3 = uri.resolve(uri2);
System.out.println(uri3);   //输出http://www.baidu.com/index.html

如果调用URI本身不包含绝对URI,那么resolve()方法将尽可能地解析URI,并返回一个新的相对URI对象作为结果:

URI top = new URI("books/java/"); 
URI resolved = top.resolve("URI/07/index.html");
System.out.println(resolved);    //输出books/java/URI/07/index.html

还可以反向完成以上过程,即从绝对URI变成相对URI。relativize()方法根据相对于调用URI的uri参数创建一个新的URI对象:

URI absolute = new URI("http://www.example.com/images/logo.png"); 
URI top = new URI("http://www.example.com/");
URI relative = top.relativize(absolute);
System.out.println(relative);    //输出images/logo.png

相等性和比较

在这里插入图片描述

字符串表示

有两个方法可以将URI对象转换为字符串:

  • public String toString()
  • public String toASCIIString()

toString()方法返回URI的未编码的字符串形式
toASCIIString()方法返回URI的编码的字符串形式

URLEncoder

要对字符串完成URL编码,需要将这个字符串和字符集名传入URLEncoder.encode()方法:

String encode = URLEncoder.encode("this is a test","UTF-8"); 		  //空格转换为+号
System.out.println(encode);   //输出this+is+a+test

URLDecoder

对应的URLDecoder类有一个静态方法decode(),它会对用x-www-form-url-encoded格式编码的字符串进行解码:

public static String decode(String s, String enc)   //如果不确定使用哪种编码格式,那就选择UTF-8
        throws UnsupportedEncodingException

代理

在这里插入图片描述

以上只是学习所做的笔记!!!
书籍:Java网络编程

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值