從JDK1.5開始,
java.net包對統一資源定位符
(uniform resource locator URL)
和統一資源標識符
(uniform resource identifier URI)
作了非常明確的區分。
(1)URI是個純粹的句法結構,用於指定標識Web資源的字符串的各個不同部分。URL是URI的一個特例,它包含了定位Web資源的足夠信息。其他URI,比如
mailto:cay@horstman.com
則不屬於定位符,因為根據該標識符無法定位任何資源。
URI 是統一資源標識符,而 URL 是統一資源定位符。因此,籠統地說,每個 URL 都是 URI,但不一定每個 URI 都是 URL。這是因為 URI 還包括一個子類,即統一資源名稱 (URN),它命名資源但不指定如何定位資源。上面的 mailto、news 和 isbn URI 都是 URN 的示例。
URI 和 URL 概念上的不同反映在此類和 URL 類的不同中。
此類的實例代表由 RFC 2396 定義的語法意義上的一個 URI 引用。URI 可以是絕對的,也可以是相對的。對 URI 字符串按照一般語法進行解析,不考慮它所指定的方案(如果有)不對主機(如果有)執行查找,也不構造依賴於方案的流處理程序。相等性、哈希計算以及比較都嚴格地根據實例的字符內容進行定義。換句話說,一個 URI 實例和一個支持語法意義上的、依賴於方案的比較、規范化、解析和相對化計算的結構化字符串差不多。
作為對照,URL 類的實例代表了 URL 的語法組成部分以及訪問它描述的資源所需的信息。URL 必須是絕對的,即它必須始終指定一個方案。URL 字符串按照其方案進行解析。通常會為 URL 建立一個流處理程序,實際上無法為未提供處理程序的方案創建一個 URL 實例。相等性和哈希計算依賴於方案和主機的 Internet 地址(如果有);沒有定義比較。換句話說,URL 是一個結構化字符串,它支持解析的語法運算以及查找主機和打開到指定資源的連接之類的網絡 I/O 操作。
在Java類庫中,URI類不包含任何訪問資源的方法,它唯一的作用就是解析。
相反的是,URL類可以打開一個到達資源的流。
因此URL類只能作用於那些 Java類庫知道該如何處理的模式,
例如http:,https:,ftp:,本地文件系統(file:),和Jar文件(jar:)。
URI—Uniform Resource Identifier通用資源標志符
Web上可用的每種資源如HTML文檔、圖像、視頻片段、程序等都是一個來URI來定位的
URI一般由三部組成
①訪問資源的命名機制
②存放資源的主機名
③資源自身的名稱,由路徑表示,着重強調於資源。
URL—Uniform Resource Location統一資源定位符
URL是Internet上用來描述信息資源的字符串,主要用在各種WWW客戶程序和服務器程序上,特別是著名的Mosaic。
采用URL可以用一種統一的格式來描述各種信息資源,包括文件、服務器的地址和目錄等。
URL一般由三部組成
①協議(或稱為服務方式)
②存有該資源的主機IP地址(有時也包括端口號)
③主機資源的具體地址。如目錄和文件名等
應用:
一 、 URI
比如在JDK中sun公司提供的簡易HttpServer實現中
public void handle(final HttpExchange exchange)throws Exception
方法中,根據exchange對象可以拿到訪問Http請求的URI對象,
ps:
http://127.0.0.1:8080/cmd_helloworld/?name=guowuxin
此時URI uri = exchange.getRequestURI();
通過uri可以拿到連接的各部分內容:
uri.getPath() --------------------> /cmd_helloworld 注意有斜杠
uri.getQuery()----------------------> name=guowuxin
當然如果是post請求,請求內容在請求body當中
二、 URL
上面說了,URL 是一個結構化字符串,它支持解析的語法運算以及查找主機和打開到指定資源的連接之類的網絡 I/O 操作。
重要的,URL不僅僅可以進行語法解析運算,還可以查找主機,並且打開指定資源的連接進行網絡IO操作。
介紹URL類的兩個重要方法
openStream()
打開到此 URL 的連接並返回一個用於從該連接讀入的 InputStream。
openConnection()
返回一個 URLConnection 對象,它表示到 URL 所引用的遠程對象的連接。
URL url = new URL("http://www.baidu.com");
InputStream in = url.openStream();
ByteArrayOutputStream output = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while ((len = in.read(buffer)) != -1)
{
output.write(buffer, 0, len);
}
System.err.println(new String(output.toByteArray()));
openConnection()方法就可以getOutputStream()以及 getInputStream()
可以更靈活的進行request和response