淺談Java中的URL和URLConnection
URI 和 URLConnection
java.net.URL 類將 URL 地址進(jìn)行了封裝,并提供了解析 URL 地址的基本方法,比如獲取 URL 的主機(jī)名和端口號(hào)。
java.net.URLConnection 則代表了應(yīng)用程序和 URL 之間的通信鏈接,可用于讀取和寫入此 URL 引用的資源。
- URI = Universal Resource Identifier ,中文釋義為統(tǒng)一資源標(biāo)志符
- URL = Universal Resource Locator ,中文釋義為統(tǒng)一資源定位符
- URN = Universal Resource Name ,中文釋義為統(tǒng)一資源名稱
URI 可以分為 URL 和 URN,或者是 URL 和 URN 的結(jié)合體(同時(shí)具備 Locator 和 Name)。
URN 就好像一個(gè)人的名字,URL 就像一個(gè)人的地址。
換句話說:URN 確定了身份,URL 提供了找到它的方式。
URL其實(shí)是一種資源
URL代表的是一種資源,它使用的是統(tǒng)一資源定位格式,形如:https://juejin.cn, 其實(shí)我們還可以用URL來構(gòu)造對(duì)象的,使用字符串嗎?
不是的,java中有大量的構(gòu)造函數(shù)允許使用一個(gè)個(gè)的分串來指定URL,有了URL對(duì)象就可以通過幾個(gè)不用的方法來獲取URL對(duì)應(yīng)的內(nèi)容,沒錯(cuò),我說的就是網(wǎng)頁:
import java.net.*; import java.io.*; public class IntTest{ public static void main(String [] args) throws Exception{ URL url = new URL(args[0]); InputStream html = url.openStream(); int c; do{ c = html.read(); if(c != -1){ System.out.print((char) c); } }while(c != -1); } }
URLConnection
一般靜態(tài)的操作就都是很容易的,使用一個(gè)URL對(duì)象讀取一個(gè)URL簡直不要太容易,剛才說的靜態(tài)是我自己起的,其實(shí)并沒有這個(gè)說法,而是我聯(lián)想到數(shù)據(jù)結(jié)構(gòu),像讀取這樣的操作都是靜態(tài)的 ,于是我在這里也算是做相同的比喻;
如果你想對(duì)HTTP事務(wù)做更多的控制呢?
比如說我們肯定需要往服務(wù)器提交一些數(shù)據(jù),需要URL對(duì)象的 openConnection 函數(shù),這個(gè)函數(shù)可以返回一個(gè) URLConnection 對(duì)象,如果URL使用了HTTP協(xié)議,那么URLConnection 對(duì)象會(huì)返回一個(gè)URLConnection的子類:HttpURLConnection;
import java.net.*; import java.io.*; public class Handin{ public static void main(String [] args) throws Exception{ URL url=new URL(""http//com.aaaaa.com"");//網(wǎng)址瞎編的 HttpURLConnection con=(HttpURLConnection)url.openConnection(); int c; con.setDoInput(true); con.setDoOutput(true); con.setrequestMethod("POST"); con.setRequestProperty("Content-type","application/X-WWW-form-urlencoded"); con.connect(); PrintWriter pri=new PrintWriter{ new OutputStreamWriter{con.getOutputStream(),"12321",true} pri.print("sasd"+URLEncoder.encode(args[0]+'dasda')); pri.flush(); System.out.println(con.getResponseMessage()); InputStream in=con.getInputStream(); do{ char x; c=in.read(); x=(char)c; if(c!=-1){ System.out.print(x); } }while(c!=-1); } }
關(guān)于HttpURLConnection,獲取HttpURLConnection對(duì)象只能是用 //URL (注意我這里只是寫了一個(gè)格式而已)來創(chuàng)建,并調(diào)用HttpURLConnection對(duì)象的openConnection函數(shù),然后把返回的URLConnection值賦給HttpURLConnection。
URLStreamHandler
URL和URLConnection都是指派URLStreamHandler和URLConnection來干活,經(jīng)過封裝之后,URL對(duì)象會(huì)檢查他的URL協(xié)議端口,然后調(diào)用URLStreamHandlerFactory的一個(gè)對(duì)象,這個(gè)對(duì)象主要用于創(chuàng)建URLStreamHandler子類,使得與指定的協(xié)議相符合;
子類URLStreamHandler創(chuàng)建一個(gè)相應(yīng)的URLConnection對(duì)象,也解析URL,這樣你可以定義用戶化URL格式,對(duì)象URLConnection通常都是和服務(wù)器打交道的。
import java.net.*; import java.io.*; public class TimeURLConnection extends URLConnection{ private Socket con; public final static int de=13; public TimeURLConnection void connect() throws IOException{ if(!=connected){ int port=url.getPort(); if(port<0) port=de; con=new Socket(url.getHost(),port); connected=true; } } public synchronized InputStream getInputStream() throws IOException{ connect(); return con.getInputStream(); } }
到此這篇關(guān)于淺談Java中的URL和URLConnection的文章就介紹到這了,更多相關(guān)Java的URL和URLConnection內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot項(xiàng)目為何引入大量的starter?如何自定義starter?
這篇文章主要介紹了SpringBoot項(xiàng)目為何引入大量的starter?如何自定義starter?文章基于這兩個(gè)問題展開全文,需要的小伙伴可以參考一下2022-04-04Java代碼為例講解堆的性質(zhì)和基本操作以及排序方法
堆數(shù)據(jù)結(jié)構(gòu)可以看作一顆完全二叉樹,因而又被成為二叉堆,這里我們以Java代碼為例講解堆的性質(zhì)和基本操作以及排序方法,需要的朋友可以參考下2016-06-06JavaCV實(shí)現(xiàn)圖片中人臉檢測的示例代碼
這篇文章主要介紹了如何利用JavaCV實(shí)現(xiàn)圖片中人臉檢測的功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的可以了解一下2022-11-11VSCode中開發(fā)JavaWeb項(xiàng)目的詳細(xì)過程(Maven+Tomcat+熱部署)
這篇文章主要介紹了VSCode中開發(fā)JavaWeb項(xiàng)目(Maven+Tomcat+熱部署),本文分步驟通過圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09SpringBoot實(shí)現(xiàn)AOP切面的三種方式
Spring,SpringBoot框架憑借多種高效機(jī)制,顯著增強(qiáng)了代碼的功能性,并實(shí)現(xiàn)了切面編程(AOP)的精髓,其核心亮點(diǎn)之一,是運(yùn)用動(dòng)態(tài)代理技術(shù),無需觸動(dòng)源代碼即可在Bean的運(yùn)行時(shí)為其動(dòng)態(tài)織入額外功能,本文給大家介紹了SpringBoot通過3種方式實(shí)現(xiàn)AOP切面,需要的朋友可以參考下2024-08-08druid ParserException類錯(cuò)誤問題及解決
這篇文章主要介紹了druid ParserException類錯(cuò)誤問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12Spring Boot 定制與優(yōu)化內(nèi)置的Tomcat容器實(shí)例詳解
本文主要記錄對(duì)內(nèi)置容器優(yōu)化和定制的方式,用于自己加深對(duì)SpringBoot理解。本文給大家介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-12-12