1. 程式人生 > >URL和URI(二)URI

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 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網路程式設計