Java篇:Java網絡編程(三)URL


3 URI/URL

 

3.1 概念

3.1.1 URI和URL概念

URL(Uniform Resource Locator):統一資源定位符,它表示Internet上某一資源的地址。

通過URL我們可以訪問Internet上的各種網絡資源,比如最常見的www,ftp站點。瀏覽器通過解析給定的URL可以在網絡上查找相應的文件或其他資源。

URI=URL+URN

  • URI:Uniform Resource Identifier ,統一資源標志符。

  • URL:Uniform Resource Locator,統一資源定位符。

  • URN:Uniform Resource Name,統一資源命名。

網絡三大基石:HTML,HTTP,URL

3.1.2格式

URL的基本結構由5部分組成:

<傳輸協議>://<主機名>:<端口號>/<文件名>#片段名?參數列表

片段名:即錨點,例如看小說,直接定位到章節 參數列表格式:參數名=參數值&參數名=參數值...... 例如: http://localhost:8080/index.jsp#a?username=Tom&password=123456

3.2 URI

URI是一個final修飾的類,它的實例創建包含4個構造方法以及一個靜態方法create。

  static void testuri(){
        try {
            String uu = "https://blog.csdn.net/allenfoxxxxx/article/details/90707505";
            System.out.println(uu);
            URI uri1 = new URI(uu);
            URI uri2 = URI.create(uu);
            System.out.println(" uri1、uri2相等時返回0--"+uri1.compareTo(uri2));
​
            //查看其他構造方法所涉及的參數信息
            System.out.println(String.format(" scheme:%s \n ssp:%s \n fragment:%s \n userInfo:%s \n host:%s \n port:%s \n path:%s \n query:%s \n authority:%s\n\n",
                    uri1.getScheme(),
                    uri1.getSchemeSpecificPart(),
                    uri1.getFragment(),
                    uri1.getUserInfo(),
                    uri1.getHost(),
                    uri1.getPort(),
                    uri1.getPath(),
                    uri1.getQuery(),
                    uri1.getAuthority()
​
                    ));
​
​
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
​
    }

 

URI 構造方法  
URI(String str) 通過解析給定的字符串構造一個URI。
URI(String scheme, String ssp, String fragment) 從給定的組件構造一個URI。
URI(String scheme, String userInfo, String host, int port, String path, String query, String fragment) 從給定的組件構造一個分層URI。
URI(String scheme, String host, String path, String fragment) 從給定的組件構造一個分層URI。
URI(String scheme, String authority, String path, String query, String fragment) 從給定的組件構造一個分層URI。

 

URI 所有方法  
static URI create(String str) 通過解析給定的字符串創建一個URI。
int compareTo(URI that) 將此URI與另一個對象進行比較,該對象必須是URI。
boolean equals(Object ob) 測試此URI以與另一個對象相等。
String getAuthority() 返回此URI的已解碼權限組件。
String getFragment() 返回此URI的解碼片段組件。
String getHost() 返回此URI的主機組件。
String getPath() 返回此URI的解碼路徑組件。
int getPort() 返回此URI的端口號。
String getQuery() 返回此URI的解碼查詢組件。
String getRawAuthority() 返回此URI的原始權限組件。
String getRawFragment() 返回此URI的原始片段組件。
String getRawPath() 返回此URI的原始路徑組件。
String getRawQuery() 返回此URI的原始查詢組件。
String getRawSchemeSpecificPart() 返回此URI的原始方案特定部分。
String getRawUserInfo() 返回此URI的原始用戶信息組件。
String getScheme() 返回此URI的方案組件。
String getSchemeSpecificPart() 返回此URI的解碼方案特定部分。
String getUserInfo() 返回此URI的解碼的用戶信息組件。
int hashCode() 返回此URI的哈希碼值。
boolean isAbsolute() 告訴這個URI是否是絕對的。
boolean isOpaque() 告知這個URI是否不透明。
URI normalize() 規范此URI的路徑。
URI parseServerAuthority() 嘗試將此URI的權限組件(如果已定義)解析為用戶信息,主機和端口組件。
URI relativize(URI uri) 相對於此URI的給定URI。
URI resolve(String str) 通過解析給定的字符串構造一個新的URI,然后根據此URI進行解析。
URI resolve(URI uri) 根據此URI解析給定的URI。
String toASCIIString() 將此URI的內容作為US-ASCII字符串返回。
String toString() 以字符串形式返回此URI的內容。
URL toURL() 從此URI構造一個URL。

3.3 URL

URL是一個final修飾的類。

其中:

  • 靜態方法setURLStreamHandlerFactory設置應用程序的 URLStreamHandlerFactory(工廠類),相關類是URLStreamHandler

  • 方法openStream提供了創建讀取url指定資源的方法

  • 方法openConnection,相關類是URLConnection

   static void testurl(){
        try {
            String uu = "https://blog.csdn.net/allenfoxxxxx/article/details/90707505";
            System.out.println(uu);
            URL url = new URL(uu);
​
            InputStream inputStream = url.openStream();
            int il = 1024;
            byte[] bytes = new byte[il];
​
            int n=5;
            //輸出部分內容
            while (n-->0){
                inputStream.read(bytes,0,il-1);
                System.out.println(new String(bytes));
​
            }
​
​
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

 


 

URL 構造方法  
URL(String spec) 從 String表示形成一個 URL對象。
URL(String protocol, String host, int port, String file) 創建 URL從指定對象 protocol , host , port數,和 file 。
URL(String protocol, String host, int port, String file, URLStreamHandler handler) 創建 URL從指定對象 protocol , host , port數, file和 handler 。
URL(String protocol, String host, String file) 從指定的 protocol名稱, host名稱和 file名稱創建一個URL。
URL(URL context, String spec) 通過在指定的上下文中解析給定的規范來創建一個URL。
URL(URL context, String spec, URLStreamHandler handler) 通過在指定上下文中使用指定的處理程序解析給定規范來創建URL。

 

URL 所有方法  
static void setURLStreamHandlerFactory(URLStreamHandlerFactory fac) 設置應用程序的 URLStreamHandlerFactory 。
URLConnection openConnection() 返回一個URLConnection實例,表示與URL引用的遠程對象的URL 。
URLConnection openConnection(Proxy proxy) 與openConnection()相同,但連接將通過指定的代理進行; 不支持代理的協議處理程序將忽略代理參數並進行正常連接。
InputStream openStream() 打開與此 URL ,並返回一個 InputStream ,以便從該連接讀取。
URI toURI() 返回相當於此URL的URI 。
boolean equals(Object obj) 將此URL與其他對象進行比較。
String getAuthority() 獲取此的授權部分 URL 。
Object getContent() 獲取此URL的內容。
Object getContent(Class[] classes) 獲取此URL的內容。
int getDefaultPort() 獲取與此 URL的協議的默認端口號。
String getFile() 獲取此 URL的文件名。
String getHost() 獲取此 URL的主機名(如適用)。
String getPath() 獲取此 URL的路徑部分。
int getPort() 獲取此 URL的端口號。
String getProtocol() 獲取此 URL的協議名稱。
String getQuery() 獲取此 URL的查詢部分。
String getRef() 獲取此的錨定(也稱為“參考”) URL 。
String getUserInfo() 獲取該 URL的userInfo部分。
int hashCode() 創建適合哈希表索引的整數。
boolean sameFile(URL other) 比較兩個URL,不包括片段組件。
String toExternalForm() 構造這個 URL的字符串 URL 。
String toString() 構造此 URL的字符串表示 URL 。

 

3.4 Connection 連接對象

URLConnection及其子類HttpURLConnection、JarURLConnection都是抽象類,其實例都是通過特定URL調用openConnection方法創建連接對象返回。

3.4.1 URLConnection

URLConnection是一個抽象類,是表示應用程序和URL之間的通信鏈接的所有類的超類。其子接子類包含HttpURLConnection和JarURLConnection。

URLCONNECTION 構造方法  
URLConnection(URL url) 構造與指定URL的URL連接。

 

URLCONNECTION 所有方法  
protected boolean allowUserInteraction 如果 true ,則在上下文中檢查該 URL ,其中允許用戶交互(例如彈出認證對話)是有意義的。
protected boolean connected 如果 false ,此連接對象尚未創建指定URL的通信鏈接。
protected boolean doInput 該變量由 setDoInput方法設置。
protected boolean doOutput 該變量由 setDoOutput方法設置。
protected long ifModifiedSince 某些協議支持跳過對象的提取,除非對象在某個時間以前已被更新。
protected URL url URL表示打開此連接的萬維網上的遠程對象。
protected boolean useCaches 如果 true ,協議允許使用緩存,只要它可以。

抽象類URLConnection是表示應用程序和URL之間的通信鏈接的所有類的超類。 該類的實例可以用於從URL引用的資源中讀取和寫入。 通常,創建與URL的連接是一個多步驟過程:

  1. 通過在URL上調用openConnection方法創建連接對象。

  2. 設置參數和一般請求屬性被操縱。

  3. 使用connect方法實現與遠程對象的實際連接。

  4. 遠程對象變得可用。 可以訪問頭字段和遠程對象的內容。

使用以下方法修改設置參數:

  • setAllowUserInteraction

  • setDoInput

  • setDoOutput

  • setIfModifiedSince

  • setUseCaches

並且使用以下方法修改一般請求屬性:

  • setRequestProperty :可以使用方法setDefaultAllowUserInteraction和setDefaultUseCaches設置AllowUserInteraction和UseCaches參數的默認值。

上述set方法中的每一個都具有相應的get方法來檢索參數或一般請求屬性的值。 適用的具體參數和一般請求屬性是特定於協議的。

使用以下方法訪問頭域和連接遠程對象后的內容:

  • getContent

  • getHeaderField

  • getInputStream

  • getOutputStream

某些頭字段經常被訪問。 方法:

  • getContentEncoding

  • getContentLength

  • getContentType

  • getDate

  • getExpiration

  • getLastModifed

提供方便的訪問這些領域。 getContentType方法由getContent方法用於確定遠程對象的類型; 子類可能會方便地覆蓋getContentType方法。

在常見情況下,所有預連接參數和一般請求屬性都可以忽略:預連接參數和請求屬性默認為明智的值。 對於這個界面的大多數客戶端,只有兩個有趣的方法: getInputStream和getContent ,它們通過方便的方法鏡像在URL類中。

在請求屬性和報頭字段的更多信息http連接可以被發現在: http://www.ietf.org/rfc/rfc2616.txt

調用close()上方法InputStream或OutputStream一個的URLConnection的請求后,可能釋放與此實例相關聯的網絡資源,除非特定的協議規范為其指定不同的行為。

3.4.2 HttpURLConnection

HttpURLConnection是支持HTTP特定功能的URLConnection,也是一個抽象類。

每個HttpURLConnection實例用於單個請求,但是到HTTP服務器的底層網絡連接可能被其他實例透明地共享。 在請求之后,在HttpURLConnection的InputStream或OutputStream上調用close()方法可以釋放與該實例關聯的網絡資源,但對任何共享持久連接沒有影響。 調用disconnect()方法可能會關閉底層套接字,如果持久連接當時是空閑的。

HTTP協議處理程序有一些可以通過系統屬性訪問的設置。 這包括Proxy settings以及various other settings 。

  • 安全權限

如果安裝了一個安全管理器,並且如果調用了一種方法,導致嘗試打開一個連接,則調用方必須擁有:

  1. 一個“連接” SocketPermission到主機/端口組合的目標URL或

  2. 一個允許這個請求的URLPermission 。

如果啟用了自動重定向,並且此請求被重定向到另一目的地,則呼叫者還必須具有連接到重定向主機/ URL的權限。

HttpURLConnection定義了多個靜態變量,用以表示多個HTTP狀態碼。

HTTPURLCONNECTION 定義的成員變量  
protected int chunkLength 使用分塊編碼流模式進行輸出時的塊長度。
protected int fixedContentLength 使用固定長度流式傳輸模式時的固定內容長度。
protected long fixedContentLengthLong 使用固定長度流式傳輸模式時的固定內容長度。
protected boolean instanceFollowRedirects 如果 true ,協議將自動跟隨重定向。
protected String method HTTP方法(GET,POST,PUT等)。
protected int responseCode 一個 int代表三位數的HTTP狀態碼。
protected String responseMessage HTTP響應消息。
static int HTTP_ACCEPTED HTTP狀態碼202:接受。
static int HTTP_BAD_GATEWAY HTTP狀態碼502:壞網關。
static int HTTP_BAD_METHOD HTTP狀態代碼405:不允許的方法。
static int HTTP_BAD_REQUEST HTTP狀態代碼400:錯誤請求。
static int HTTP_CLIENT_TIMEOUT HTTP狀態碼408:請求超時。
static int HTTP_CONFLICT HTTP狀態代碼409:沖突。
static int HTTP_CREATED HTTP狀態代碼201:創建。
static int HTTP_ENTITY_TOO_LARGE HTTP狀態碼413:請求實體太大。
static int HTTP_FORBIDDEN HTTP狀態碼403:禁止。
static int HTTP_GATEWAY_TIMEOUT HTTP狀態代碼504:網關超時。
static int HTTP_GONE HTTP狀態代碼410:沒有。
static int HTTP_INTERNAL_ERROR HTTP狀態碼500:內部服務器錯誤。
static int HTTP_LENGTH_REQUIRED HTTP狀態碼411:需要長度。
static int HTTP_MOVED_PERM HTTP狀態代碼301:永久移動。
static int HTTP_MOVED_TEMP HTTP狀態碼302:臨時重定向。
static int HTTP_MULT_CHOICE HTTP狀態代碼300:多個選擇。
static int HTTP_NO_CONTENT HTTP狀態代碼204:無內容。
static int HTTP_NOT_ACCEPTABLE HTTP狀態碼406:不可接受
static int HTTP_NOT_AUTHORITATIVE HTTP狀態碼203:非授權信息。
static int HTTP_NOT_FOUND HTTP狀態碼404:未找到。
static int HTTP_NOT_IMPLEMENTED HTTP狀態碼501:未實現。
static int HTTP_NOT_MODIFIED HTTP狀態碼304:未修改。
static int HTTP_OK HTTP狀態碼200:確定。
static int HTTP_PARTIAL HTTP狀態碼206:部分內容。
static int HTTP_PAYMENT_REQUIRED HTTP狀態碼402:需要支付。
static int HTTP_PRECON_FAILED HTTP狀態碼412:前提條件失敗。
static int HTTP_PROXY_AUTH HTTP狀態碼407:需要代理驗證。
static int HTTP_REQ_TOO_LONG HTTP狀態代碼414:請求URI太大。
static int HTTP_RESET HTTP狀態碼205:重置內容。
static int HTTP_SEE_OTHER HTTP狀態碼303:查看其他。
static int HTTP_SERVER_ERROR 已棄用,它是錯誤的,不應該存在。
static int HTTP_UNAUTHORIZED HTTP狀態碼401:未經授權
static int HTTP_UNAVAILABLE HTTP狀態碼503:服務不可用。
static int HTTP_UNSUPPORTED_TYPE HTTP狀態碼415:不支持的媒體類型。
static int HTTP_USE_PROXY HTTP狀態碼305:使用代理。
static int HTTP_VERSION HTTP狀態碼505:不支持HTTP版本。

 

HTTPURLCONNECTION 構造方法  
protected HttpURLConnection(URL u) HttpURLConnection的構造方法。

 

HTTPURLCONNECTION 所有方法  
abstract void disconnect() 表示在不久的將來不太可能對服務器的其他請求。
InputStream getErrorStream() 如果連接失敗但服務器發送有用的數據,則返回錯誤流。
static boolean getFollowRedirects() 返回一個 boolean指示是否應自動遵循HTTP重定向(3xx)。
String getHeaderField(int n) 返回的值 n th頭字段。
long getHeaderFieldDate(String name, long Default) 返回以日期解析的命名字段的值。
String getHeaderFieldKey(int n) 返回的關鍵 n th頭字段。
boolean getInstanceFollowRedirects() 返回此 HttpURLConnection的 instanceFollowRedirects字段的值。
Permission getPermission() 返回一個表示連接到目標主機和端口所需的權限的SocketPermission對象。
String getRequestMethod() 獲取請求方法。
int getResponseCode() 從HTTP響應消息獲取狀態代碼。
String getResponseMessage() 獲取與服務器的響應代碼一起返回的HTTP響應消息(如果有)。
void setChunkedStreamingMode(int chunklen) 當內容長度 未提前知道時,此方法用於啟用HTTP請求體的流式傳輸,而無需內部緩沖。
void setFixedLengthStreamingMode(int contentLength) 當預先知道內容長度時,此方法用於啟用HTTP請求體的流式傳輸,而無需內部緩沖。
void setFixedLengthStreamingMode(long contentLength) 當預先知道內容長度時,此方法用於啟用HTTP請求體的流式傳輸,而無需內部緩沖。
static void setFollowRedirects(boolean set) 設置HTTP重定向(具有響應代碼3xx的請求)是否應該在該類之后自動跟隨。
void setInstanceFollowRedirects(boolean followRedirects) 設置HTTP重定向(響應代碼為3xx的請求)是否應該由此 HttpURLConnection實例自動跟隨。
void setRequestMethod(String method) 設置URL請求的方法,其中之一是:GET POST HEAD OPTIONS PUT DELETE TRACE是符合協議限制的合法的。
abstract boolean usingProxy() 指示連接正在通過代理。

3.4.3 JarURLConnection

JarURLConnection是與Java ARchive(JAR)文件或JAR文件中的條目的URL連接,也是抽象類。

JAR URL的語法是: jar:<url>!/{entry}

例如: jar:http://www.foo.com/bar/baz.jar!/COM/foo/Quux.class

JAR URL應用於引用JAR文件或JAR文件中的條目。 上面的示例是一個引用JAR條目的JAR URL。 如果省略條目名稱,則URL引用整個JAR文件: jar:http://www.foo.com/bar/baz.jar!/

當他們知道他們創建的URL是一個JAR URL,並且他們需要JAR特定的功能時,用戶應該將通用URLConnection轉換為JarURLConnection。 例如:

  URL url = new URL("jar:file:/home/duke/duke.jar!/");
JarURLConnection jarConnection = (JarURLConnection)url.openConnection();
Manifest manifest = jarConnection.getManifest();

JarURLConnection實例只能用於從JAR文件讀取。 使用此類不可能獲得OutputStream修改或寫入底層JAR文件。

例子:

  • 罐子入口

    jar:http://www.foo.com/bar/baz.jar!/COM/foo/Quux.class

  • 一個jar文件

    jar:http://www.foo.com/bar/baz.jar!/

  • 一個罐子目錄

    jar:http://www.foo.com/bar/baz.jar!/COM/foo/

!/被稱為分離器

當通過構建一個JAR URL new URL(context, spec) ,適用下列規則:

  • 如果沒有上下文URL,並且傳遞給URL構造函數的規范不包含分隔符,則該URL被認為是引用JarFile。

  • 如果存在上下文URL,則假定上下文URL是指JAR文件或Jar目錄。

  • 如果規范以'/'開始,Jar目錄將被忽略,並且該規范被認為是Jar文件的根目錄。

    例子:

 

JARURLCONNECTION 構造方法  
protected JarURLConnection(URL url) 創建新的JarURLConnection到指定的URL。

 

JARURLCONNECTION 所有方法  
Attributes getAttributes() 如果該連接的URL指向JAR文件條目,則返回此連接的Attributes對象,否則返回null。
Certificate[] getCertificates() 如果它的URL指向JAR文件條目,則返回此連接的證書對象,否則返回null。
String getEntryName() 返回此連接的條目名稱。
JarEntry getJarEntry() 返回此連接的JAR條目對象(如果有)。
abstract JarFile getJarFile() 返回此連接的JAR文件。
URL getJarFileURL() 返回此連接的Jar文件的URL。
Attributes getMainAttributes() 返回此連接的JAR文件的主要屬性。
Manifest getManifest() 返回此連接的清單,否則返回null。

3.4.4 簡單應用

    
static void testConnection(){
        try {
            System.out.println("HttpURLConnection------------------------");
​
            //HTTP
            String uu = "https://blog.csdn.net/allenfoxxxxx/article/details/90707505";
            System.out.println(uu);
            URL url = new URL(uu);
​
            HttpURLConnection connection = (HttpURLConnection)url.openConnection();
            //輸出響應頭
            System.out.println(connection.getHeaderFields());
            //輸出請求方式
            System.out.println(connection.getRequestMethod());
            //讀取網頁內容
            InputStream inputStream = connection.getInputStream();
            int il = 1024;
            byte[] bytes = new byte[il];
            int n=1;
            //輸出部分內容
            while (n-->0){
                inputStream.read(bytes,0,il-1);
                System.out.println(new String(bytes));
​
            }
            System.out.println("\n\n\n");
​
            System.out.println("JarURLConnection------------------------");
​
​
            //JAR
            URL url2 = new URL("jar:file:D://ProgramData/Fun/jce.jar!/");
            JarURLConnection jarConnection = (JarURLConnection)url2.openConnection();
            //Manifest類用於維護清單條目名稱及其相關屬性。 有主要的清單屬性以及每個入口屬性。
            Manifest manifest = jarConnection.getManifest();
​
            //返回此清單中包含的條目的Map。
            System.out.println(manifest.getEntries());
            //返回清單的主要屬性。
            Set<Map.Entry<Object,Object>> set = manifest.getMainAttributes().entrySet();
​
            Iterator<Map.Entry<Object,Object>> iterator =  set.iterator();
            Map<Object,Object> map = new HashMap<>(set.size());
​
            while (iterator.hasNext()){
                Map.Entry<Object,Object> entry = iterator.next();
                //System.out.println(entry.getKey()+": "+entry.getValue());
                map.put(entry.getKey(),entry.getValue());
​
            }
            System.out.println(map);
​
            //將清單寫入指定的OutputStream。
​
            String ofile = "1.txt";
            OutputStream outputStream = new FileOutputStream(ofile);
            manifest.write(outputStream );
            outputStream.close();
            System.out.println(System.getProperty("user.dir")+ File.separator+ofile);
​
​
​
​
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
​
    }

 

 

3.5 URLStreamHandler 流協議處理

抽象類 URLStreamHandler是所有流協議處理程序的通用超類。

流協議處理程序知道如何為特定協議類型建立連接,例如http或https 。

在大多數情況下, URLStreamHandler子類的實例不是由應用程序直接創建的。 更確切地說,在第一時間構建時的協議名稱遇到URL ,適當的流協議處理程序被自動加載

URLStreamHandler所提供的方法都由protected 所修飾。

URLSTREAMHANDLER 構造方法  
URLStreamHandler()  

 

URLSTREAMHANDLER 所有方法  
protected boolean equals(URL u1, URL u2) 提供默認的equals計算。
protected int getDefaultPort() 返回此處理程序解析的URL的默認端口。
protected InetAddress getHostAddress(URL u) 獲取我們的主機的IP地址。
protected int hashCode(URL u) 提供默認散列計算。
protected boolean hostsEqual(URL u1, URL u2) 比較兩個URL的主機組件。
protected abstract URLConnection openConnection(URL u) 打開與 URL參數引用的對象的 URL 。
protected URLConnection openConnection(URL u, Proxy p) 與openConnection(URL)相同,但連接將通過指定的代理進行; 不支持代理的協議處理程序將忽略代理參數並進行正常連接。
protected void parseURL(URL u, String spec, int start, int limit) 解析的字符串表示 URL成 URL對象。
protected boolean sameFile(URL u1, URL u2) 比較兩個URL以查看它們是否引用相同的文件,即具有相同的協議,主機,端口和路徑。
protected void setURL(URL u, String protocol, String host, int port, String file, String ref) 已棄用,使用setURL(URL,String,String,int,String,String,String,String);
protected void setURL(URL u, String protocol, String host, int port, String authority, String userInfo, String path, String query, String ref) 將 URL參數的字段設置為指示的值。
protected String toExternalForm(URL u) 將 URL的特定協議轉換為 String

 

 

3.6 URLClassLoader URL類加載器

此類加載器用於從引用JAR文件和目錄的URL的搜索路徑加載類和資源。任何以“/”結尾的URL都假定是指一個目錄。否則,URL被認為是指根據需要打開的JAR文件。

當后續加載類和資源時,將使用創建URLClassLoader實例的線程的AccessControlContext。

加載的類默認授權只能訪問URLClassLoader創建時指定的URL。

URLCLASSLOADER 構造方法  
URLClassLoader(URL[] urls) 使用默認委托父級 ClassLoader為指定的URL構造一個新的 ClassLoader 。
URLClassLoader(URL[] urls, ClassLoader parent) 為給定的URL構造一個新的URLClassLoader。
URLClassLoader(URL[] urls, ClassLoader parent, URLStreamHandlerFactory factory) 為指定的URL,父類加載器和URLStreamHandlerFactory構造一個新的URLClassLoader。

 

URLCLASSLOADER 所有方法  
protected void addURL(URL url) 將指定的URL附加到URL列表中以搜索類和資源。
void close() 關閉此URLClassLoader,以使其不能再用於加載由此加載程序定義的新類或資源。
protected Package definePackage(String name, Manifest man, URL url) 在此ClassLoader中按名稱定義新包。
protected Class<?> findClass(String name) 從URL搜索路徑查找並加載具有指定名稱的類。
URL findResource(String name) 在URL搜索路徑上查找具有指定名稱的資源。
Enumeration<URL> findResources(String name) 返回表示URL搜索路徑上具有指定名稱的所有資源的URL的枚舉。
protected PermissionCollection getPermissions(CodeSource codesource) 返回給定的代碼源對象的權限。
InputStream getResourceAsStream(String name) 返回用於讀取指定資源的輸入流。
URL[] getURLs() 返回加載類和資源的URL的搜索路徑。
static URLClassLoader newInstance(URL[] urls) 為指定的URL和默認父類加載器創建URLClassLoader的新實例。
static URLClassLoader newInstance(URL[] urls, ClassLoader parent) 為指定的URL和父類加載器創建URLClassLoader的新實例。

 

3.7 URL編碼解碼

3.7.1 URLEncoder

HTML表單編碼的實用類。 此類包含將String轉換為application/x-www-form-urlencoded MIME格式的靜態方法。 有關HTML表單編碼的更多信息,請參閱HTML specification 。 編碼字符串時,適用以下規則:

  • “ a ”至“ z ”,“ A ”至“ Z ”和“ 0 ”至“ 9 ”保持不變。

  • 特殊字符“ . ”,“ - ”,“ * ”和“ _ ”保持不變。

  • 空格字符“”被轉換為加號“ + ”。

  • 所有其他字符都不安全,並且首先使用一些編碼方案將其轉換為一個或多個字節。 然后每個字節由3個字符串“ %xy ”表示,其中xy是字節的兩位十六進制表示。 推薦使用的編碼方案是UTF-8。 但是,出於兼容性原因,如果未指定編碼,則使用平台的默認編碼。

例如,使用UTF-8作為編碼方案,字符串“Ã@ foo-bar”將被轉換為“The + string +%C3%BC%40foo-bar”,因為在UTF-8中,字符¼被編碼為2字節C3(十六進制)和BC(十六進制),字符@被編碼為一個字節40(十六進制)。

URLENCODER 所有方法  
static String encode(String s) 已棄用,結果字符串可能會因平台的默認編碼而異。 而是使用encode(String,String)方法來指定編碼。
static String encode(String s, String enc) 使用特定的編碼方案將字符串轉換為 application/x-www-form-urlencoded格式。

3.7.2 URLDecoder

HTML表單解碼的實用類。 該類包含用於從application/x-www-form-urlencoded MIME格式解碼字符串的靜態方法。 轉換過程與URLEncoder類使用的轉換過程相反。 假設編碼字符串中的所有字符都是以下之一:“ a ”至“ z ”,“ A ”至“ Z ”,“ 0 ”至“ 9 ”和“ - ”,“ _ ”,“ . “和” * “。 字符“ % ”被允許,但被解釋為特殊轉義序列的開始。

在轉換中應用以下規則:

  • “ a ”至“ z ”,“ A ”至“ Z ”和“ 0 ”至“ 9 ”保持不變。

  • 特殊字符“ . ”,“ - ”,“ * ”和“ _ ”保持不變。

  • 加號“ + ”被轉換為空格字符“”。

  • 格式“ %xy ”的序列將被視為表示一個字節,其中xy是8位的兩位十六進制表示。 然后,連續包含這些字節序列中的一個或多個的所有子字符串將被編碼將導致這些連續字節的字符替換。 可以指定用於解碼這些字符的編碼方案,或者如果未指定,則將使用平台的默認編碼。

這種解碼器可以處理非法字符串的兩種可能方式。 它可以單獨留下非法字符,也可以拋出一個IllegalArgumentException 。 解碼器采用的方法是實現。

URLDECODER 所有方法  
static String decode(String s) 已棄用,結果字符串可能會因平台的默認編碼而異。 而是使用decode(String,String)方法來指定編碼。
static String decode(String s, String enc) 使用特定的編碼方案解碼 application/x-www-form-urlencoded字符串。

 

3.7.3 IDN

提供在正常Unicode表示和ASCII兼容編碼(ACE)表示之間轉換國際化域名(IDN)的方法。國際化的域名可以使用整個Unicode范圍內的字符,而傳統的域名僅限於ASCII字符。ACE是僅使用ASCII字符的Unicode字符串的編碼,可以與僅了解傳統域名的軟件(如域名系統)一起使用。

國際化域名定義在RFC 3490中 。 RFC 3490定義了兩個操作:ToASCII和ToUnicode。 這兩個操作采用Nameprep算法,即StringprepPunycode算法來轉換域名字符串的算法。

上述轉換過程的行為可以通過各種標志進行調整:

  • 如果使用ALLOW_UNASSIGNED標志,則要轉換的域名字符串可以包含Unicode 3.2中未分配的代碼點,這是以IDN轉換為基礎的Unicode版本。 如果不使用標志,則將這種未分配的代碼點的存在視為錯誤。

  • 如果使用USE_STD3_ASCII_RULES標志, 則會根據RFC 1122RFC 1123檢查ASCII字符串。 如果不符合要求,這是一個錯誤。

這些標志可以在邏輯上進行OR。

安全考慮在國際化域名支持方面很重要。 例如,英文域名可能被重新分類 - 惡意拼寫錯誤地替換非拉丁字母。 Unicode Technical Report #36討論了IDN支持的安全問題以及可能的解決方案。 應用程序負責在使用國際域名時采取足夠的安全措施。

IDN 所有成員  
static int ALLOW_UNASSIGNED 標志允許處理未分配的代碼點
static int USE_STD3_ASCII_RULES 標志打開對STD-3 ASCII規則的檢查
static String toASCII(String input) 從Unicode轉換字符串為ASCII兼容性編碼(ACE),通過的ToASCII操作中的定義 RFC 3490 。
static String toASCII(String input, int flag) 從Unicode轉換字符串為ASCII兼容性編碼(ACE),通過的ToASCII操作中的定義 RFC 3490 。
static String toUnicode(String input) 轉換來自ASCII兼容性編碼(ACE)為Unicode字符串,通過的ToUnicode操作中所定義的 RFC 3490 。
static String toUnicode(String input, int flag) 轉換來自ASCII兼容性編碼(ACE)為Unicode字符串,通過的ToUnicode操作中所定義的 RFC 3490

 

3.7.4 簡單應用

    static void testcoding(){
        String text1 = "12345DD一二三@@@@###/////\\__%%";
        System.out.println("原本字符串: "+text1);
        String text2 = URLEncoder.encode(text1);
        System.out.println("URLEncoder: "+text2);
        String text3 = URLDecoder.decode(text2);
        System.out.println("URLEncoder: "+text3);
​
        String text4 = IDN.toASCII(text1);
        System.out.println("IDN.toASCII: "+text4);
        String text5 = IDN.toUnicode(text4);
        System.out.println("IDN.toUnicode: "+text5);
    }

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM