java.net
類 URL
java.net.URL
所有已實現的接口:
public final class URL
extends Object
implements Serializable
類URL 代表一個統一資源定位符,它是指向互聯網“資源”的指針。資源可以是簡單的文件或目錄,也可以是對更為復雜的對象的引用,例如對數據庫或搜索引擎的查詢。有關 URL 的類型和格式的更多信息,可從以下位置找到:
http://www.socs.uts.edu.au/MosaicDocs-old/url-primer.html
通常,URL 可分成幾個部分。上面的 URL 示例指示使用的協議為 http (超文本傳輸協議)並且該信息駐留在一台名為www.socs.uts.edu.au 的主機上。主機上的信息名稱為/MosaicDocs-old/url-primer.html。主機上此名稱的准確含義取決於協議和主機。該信息一般存儲在文件中,但可以隨時生成。該 URL 的這一部分稱為路徑 部分。
URL 可選擇指定一個“端口”,它是用於建立到遠程主機 TCP 連接的端口號。如果未指定該端口號,則使用協議默認的端口。例如,http 協議的默認端口為 80。還可以指定一個備用端口,如下所示:
http://www.socs.uts.edu.au:80/MosaicDocs-old/url-primer.html
URL 的語法由此文檔定義:RFC 2396:Uniform ResourceIdentifiers (URI):Generic Syntax;在此文件中對其內容又進行了修正:RFC 2732:Format forLiteral IPv6 Addresses in URLs。字面值 IPv6 地址格式還支持 scope_id。scope_id 的語法和用法在此處進行了描述。
URL 后面可能還跟有一個“片段”,也稱為“引用”。該片段由井字符"#" 指示,后面跟有更多的字符。例如,
http://java.sun.com/index.html#chapter1
從技術角度來講,URL 並不需要包含此片段。但是,使用此片段的目的在於表明,在獲取到指定的資源后,應用程序需要使用文檔中附加有 chapter1 標記的部分。標記的含義特定於資源。
應用程序也可以指定一個“相對 URL”,它只包含到達相對於另一個 URL 的資源的足夠信息。HTML 頁面中經常使用相對 URL。例如,假設 URL 的內容是:
http://java.sun.com/index.html
其中包含的相對 URL:
FAQ.html
為以下形式的縮寫:
http://java.sun.com/FAQ.html
相對 URL 不需要指定 URL 的所有組成部分。如果缺少協議、主機名稱或端口號,這些值將從完整指定的 URL 中繼承。但是,必須指定文件部分。可選的片段部分不繼承。
URL 類自身並不根據 RFC2396 中定義的轉義機制編碼或解碼任何 URL 部分。由調用方對任何需要在調用 URL 前進行轉義的字段進行編碼,並對從 URL 返回的任何經過轉義的字段進行解碼。進一步而言,由於 URL 不懂 URL 轉義,所以它不會識別同一 URL 的對等編碼和解碼形式。例如,對於這兩個 URL:
http://foo.com/hello world/ 和http://foo.com/hello%20world
將被視為互不相等。
注意,URI 類在某些特定情況下對其組成字段執行轉義。建議使用 URI 管理 URL 的編碼和解碼,並使用 toURI()和 URI.toURL()實現這兩個類之間的轉換。
也可以使用 URLEncoder 和 URLDecoder 類,但是只適用於 HTML 形式的編碼,它與 RFC2396 中定義的編碼機制不同。
從以下版本開始:
JDK1.0
另請參見:
|
|
URL(String protocol, String host, int port, String file) |
|
URL(String protocol, String host, int port, String file, URLStreamHandler handler) |
|
URL(String protocol, String host, String file) |
|
URL(URL context, String spec) |
|
URL(URL context, String spec, URLStreamHandler handler) |
|
方法摘要 |
|
boolean |
|
getAuthority() |
|
getContent() |
|
getContent(Class[] classes) |
|
int |
getDefaultPort() |
getFile() |
|
getHost() |
|
getPath() |
|
int |
getPort() |
getProtocol() |
|
getQuery() |
|
getRef() |
|
getUserInfo() |
|
int |
hashCode() |
openConnection() |
|
openConnection(Proxy proxy) |
|
openStream() |
|
boolean |
|
protected void |
set(String protocol, String host, int port, String file, String ref) |
protected void |
set(String protocol, String host, int port, String authority, String userInfo, String path, String query, String ref) |
static void |
setURLStreamHandlerFactory(URLStreamHandlerFactory fac) |
toExternalForm() |
|
toString() |
|
從類 java.lang.Object 繼承的方法 |
clone, finalize, getClass, notify, notifyAll, wait, wait, wait |
構造方法詳細信息 |
URL
public URL(String protocol,
String host,
int port,
String file)
throws MalformedURLException
根據指定 protocol、host、port 號和 file 創建 URL 對象。
host 可用主機名或字面值 IP 地址表示。如果使用 IPv6 字面值地址,則應將其括在方括號('[' 和 ']')中,如 RFC 2732 中指定的那樣;但是,在以下文檔中定義的字面值 IPv6 地址格式也可以接受:RFC 2373:IP Version 6 AddressingArchitecture。
指定 port 號為 -1 指示 URL 應使用協議的默認端口。
如果這是用指定協議創建的第一個 URL 對象,則還會為該協議創建一個流協議處理程序 對象(類 URLStreamHandler 的一個實例):
1. 如果該應用程序已經預先設置了一個URLStreamHandlerFactory 的實例作為流處理程序工廠,則將調用該實例的createURLStreamHandler 方法(協議字符串為其中的一個參數)以創建流協議處理程序。
2. 如果尚未建立URLStreamHandlerFactory,或者該工廠的 createURLStreamHandler 方法返回 null,則該構造方法將查找如下系統屬性的值:
3. java.protocol.handler.pkgs
如果該系統屬性的值為非 null,則它被轉換為一個由垂直線字符'|'分隔的包列表。構造方法嘗試加載如下名稱的類:
<package>.<protocol>.Handler
其中,<package> 用包的名稱替換,<protocol> 用協議的名稱替換。如果不存在此類,或者此類存在但它不是 URLStreamHandler 的子類,則嘗試列表中的下一個包。
4. 如果上面的步驟中未找到協議處理程序,則構造方法將嘗試從系統默認包加載。
5. <system default package>.<protocol>.Handler
如果不存在此類,或者該類存在但它不是 URLStreamHandler 的子類,則拋出 MalformedURLException。
應確保搜索路徑中包含以下協議的協議處理程序:
http、https、ftp、file 和 jar
還可以有其他協議的協議處理程序。
此構造方法不執行對輸入的驗證。
參數:
protocol - 要使用的協議名稱。
host - 主機名稱。
port - 主機端口號。
file - 主機上的文件
拋出:
MalformedURLException - 如果指定了未知協議。
另請參見:
System.getProperty(java.lang.String),setURLStreamHandlerFactory(java.net.URLStreamHandlerFactory), URLStreamHandler, URLStreamHandlerFactory.createURLStreamHandler(java.lang.String)
URL
public URL(String protocol,
String host,
String file)
throws MalformedURLException
根據指定的 protocol 名稱、host 名稱和 file 名稱創建URL。使用指定協議的默認端口。
此方法等同於調用帶四個參數的構造方法,四個參數為 protocol、host、-1 和 file。此構造方法不執行對輸入的驗證。
參數:
protocol - 要使用的協議名稱。
host - 主機名稱。
file - 主機上的文件。
拋出:
MalformedURLException - 如果指定了未知協議。
另請參見:
URL(java.lang.String,java.lang.String, int, java.lang.String)
public URL(String protocol,
String host,
intport,
String file,
URLStreamHandler handler)
throws MalformedURLException
根據指定的 protocol、host、port 號、file 和 handler 創建 URL 對象。指定 port 號為 -1 指示 URL 應使用協議的默認端口。指定 handler 為 null 指示URL 應使用協議的默認流處理程序,大致如下:java.net.URL#URL(java.lang.String,java.lang.String, int, java.lang.String)
如果處理程序為非 null,並且有安全管理器,則使用NetPermission("specifyStreamHandler") 權限調用安全管理器的 checkPermission 方法。結果可能是一個SecurityException 異常。 此構造方法不執行對輸入的驗證。
參數:
protocol - 要使用的協議名稱。
host - 主機名稱。
port - 主機端口號。
file - 主機上的文件
handler - URL 的流處理程序。
拋出:
MalformedURLException - 如果指定了未知協議。
SecurityException - 如果安全管理器存在並且其 checkPermission 方法不允許顯式指定流處理程序。
另請參見:
System.getProperty(java.lang.String),setURLStreamHandlerFactory(java.net.URLStreamHandlerFactory), URLStreamHandler, URLStreamHandlerFactory.createURLStreamHandler(java.lang.String), SecurityManager.checkPermission(java.security.Permission),NetPermission
public URL(String spec)
throws MalformedURLException
根據 String 表示形式創建 URL 對象。
此構造方法等同於調用兩個參數的構造方法,其中,第一個參數為 null。
參數:
spec - 將作為 URL 解析的 String。
拋出:
MalformedURLException - 如果字符串指定未知協議。
另請參見:
URL(java.net.URL,java.lang.String)
public URL(URL context,
String spec)
throws MalformedURLException
通過在指定的上下文中對給定的spec 進行解析創建 URL。 新的 URL 從給定的上下文 URL 和 spec 參數創建,這在以下文檔中進行了描述:RFC2396 "Uniform Resource Identifiers : Generic * Syntax":
<scheme>://<authority><path>?<query>#<fragment>
該引用被解析為方案、授權、路徑、查詢和片段部分。如果路徑部分為空,方案、授權和查詢部分未定義,則新的 URL 為對當前文檔的引用。否則,新的 URL 中將使用 spec 中出現的片段和查詢部分。
如果給定的 spec 中定義了方案部分,但與上下文的方案不匹配,則只根據 spec 創建新的絕對 URL。否則,方案部分從上下文 URL 繼承。
如果 spec 中有授權部分,則將該 spec 視為絕對的,並用 spec 的授權和路徑替換上下文授權和路徑。如果 spec 中沒有授權部分,則新的 URL 的授權將從上下文繼承。
如果 spec 的路徑部分以斜線字符 "/" 開始,則將該路徑視為絕對的,並用 spec 的路徑替換上下文路徑。
否則,如 RFC2396 中所述,該路徑將被視為相對路徑,並被添加到上下文路徑中。此外,在這種情況下,還將通過刪除由 ".." 和 "." 產生的目錄更改對路徑進行規范化處理。
有關 URL 解析的更詳細的描述,請參考 RFC2396。
參數:
context - 要在其中解析規范的上下文。
spec - 將作為 URL 解析的 String。
拋出:
MalformedURLException - 如果未指定任何協議,或者找到了未知協議。
另請參見:
URL(java.lang.String,java.lang.String, int, java.lang.String), URLStreamHandler, URLStreamHandler.parseURL(java.net.URL,java.lang.String, int, int)
public URL(URL context,
String spec,
URLStreamHandler handler)
throws MalformedURLException
通過在指定的上下文中用指定的處理程序對給定的 spec 進行解析來創建 URL。如果處理程序為 null,則使用兩參數構造方法進行解析。
參數:
context - 要在其中解析規范的上下文。
spec - 將作為 URL 解析的 String。
handler - URL 的流處理程序。
拋出:
MalformedURLException - 如果未指定任何協議,或者找到了未知協議。
SecurityException - 如果安全管理器存在並且其 checkPermission 方法不允許指定流處理程序。
另請參見:
URL(java.lang.String,java.lang.String, int, java.lang.String), URLStreamHandler, URLStreamHandler.parseURL(java.net.URL,java.lang.String, int, int)
set
protected void set(String protocol,
String host,
int port,
String file,
String ref)
設置 URL 的字段。這不是一個公共方法,所以只有 URLStreamHandler 才能修改 URL 字段。其他情況下,URL 為常量。
參數:
protocol - 要使用的協議名稱
host - 主機名稱
port - 主機端口號
file - 主機上的文件
ref - URL 中的內部引用
protected void set(String protocol,
String host,
int port,
String authority,
String userInfo,
String path,
String query,
String ref)
設置 URL 的指定的 8 個字段。這不是一個公共方法,所以只有 URLStreamHandler 才能修改 URL 字段。其他情況下,URL 為常量。
參數:
protocol - 要使用的協議名稱
host - 主機名稱
port - 主機上的端口號
authority - url 的授權部分
userInfo - 用戶名和密碼
path - 主機上的文件
ref - URL 中的內部引用
query - 此 URL 的查詢部分
從以下版本開始:
1.3
public String getQuery()
獲取此 URL 的查詢部分。
返回:
此 URL 的查詢,如果沒有查詢,則返回 null
從以下版本開始:
1.3
public String getPath()
獲取此 URL 的路徑部分。
返回:
此 URL 的路徑部分,如果沒有路徑,則返回一個空字符串
從以下版本開始:
1.3
public String getUserInfo()
獲取此 URL 的 userInfo 部分。
返回:
此 URL 的 userInfo 部分,如果沒有用戶信息,則返回 null
從以下版本開始:
1.3
public String getAuthority()
獲取此 URL 的授權部分。
返回:
此 URL 的授權部分
從以下版本開始:
1.3
public int getPort()
獲取此 URL 的端口號。
返回:
端口號,如果未設置端口號,則返回-1
public int getDefaultPort()
獲取與此 URL 關聯協議的默認端口號。如果 URL 方案或 URL 的URLStreamHandler 未定義默認的端口號,則返回 -1。
返回:
端口號
從以下版本開始:
1.4
public String getProtocol()
獲取此 URL 的協議名稱。
返回:
此 URL 的協議。
public String getHost()
獲取此 URL 的主機名(如果適用)。主機的格式遵守 RFC 2732,即對於一個字面值 IPv6 地址,該方法將返回括在方括號 ('[' 和 ']') 中的 IPv6地址。
返回:
此 URL 的主機名稱。
public String getFile()
獲取此 URL 的文件名。返回的文件部分將與 getPath() 相同,再加上 getQuery() 值的規范化形式(如果有)。如果沒有查詢部分,此方法和 getPath() 將返回相同的結果。
返回:
此 URL 的文件名,如果沒有文件名,則返回一個空字符串
public String getRef()
獲取此 URL 的錨點(也稱為“引用”)。
返回:
此 URL 的錨點(也稱為“引用”),如果沒有錨點,則返回null
public boolean equals(Object obj)
比較此 URL 是否等於另一個對象。
如果給定的對象不是一個 URL,則此方法立即返回 false。
如果兩個 URL 具有相同的協議,引用相同的主機,主機上具有相同的端口號,文件相同,片段也都相同,則這兩個 URL 對象相等。
如果兩個主機名可解析為同一 IP 地址,則認為兩個主機相同;如果有一個主機名無法解析,但兩個主機名相等(不區分大小寫),或者兩個主機名都為 null,則也認為這兩個主機相同。
由於主機比較需要進行名稱解析,所以此操作為阻塞操作。
注:equals 定義的行為已知與 HTTP 的虛擬主機行為不一致。
覆蓋:
參數:
obj - 要與其比較的 URL。
返回:
如果對象相同,則返回 true;否則,返回 false。
另請參見:
public int hashCode()
創建一個適合哈希表索引的整數。
哈希碼基於所有與 URL 比較相關的 URL 部分。因此,此操作為阻塞操作。
覆蓋:
返回:
此 URL 的哈希碼。
另請參見:
Object.equals(java.lang.Object),Hashtable
public boolean sameFile(URL other)
比較兩個 URL,不包括片段部分。
如果此 URL 和 other 參數相等,則返回 true,不考慮片段部分。
參數:
other - 要與其比較的 URL。
返回:
如果它們引用相同的遠程對象,則返回 true;否則返回 false。
public String toString()
構造此 URL 的字符串表示形式。字符串是通過調用此對象的流協議處理程序的 toExternalForm 方法創建的。
覆蓋:
返回:
此對象的字符串表示形式。
另請參見:
URL(java.lang.String,java.lang.String, int, java.lang.String), URLStreamHandler.toExternalForm(java.net.URL)
public String toExternalForm()
構造此 URL 的字符串表示形式。字符串是通過調用此對象的流協議處理程序的 toExternalForm 方法創建的。
返回:
此對象的字符串表示形式。
另請參見:
URL(java.lang.String,java.lang.String, int, java.lang.String), URLStreamHandler.toExternalForm(java.net.URL)
public URI toURI()
throws URISyntaxException
返回與此 URL 等效的 URI。此方法的作用與 new URI (this.toString()) 相同。
注意,任何 URL 實例只要遵守 RFC 2396 就可以轉化為 URI。但是,有些未嚴格遵守該規則的 URL 將無法轉化為 URI。
返回:
與此 URL 等效的 URI 實例。
拋出:
URISyntaxException - 如果由於該 URL 格式未嚴格遵守 RFC2396 而無法轉化為 URI。
從以下版本開始:
1.5
public URLConnection openConnection()
throws IOException
返回一個URLConnection 對象,它表示到 URL 所引用的遠程對象的連接。
每次調用此 URL 的協議處理程序的 openConnection方法都打開一個新的連接。
如果 URL 的協議(例如,HTTP 或 JAR)存在屬於以下包或其子包之一的公共、專用 URLConnection 子類:java.lang、java.io、java.util、java.net,返回的連接將為該子類的類型。例如,對於 HTTP,將返回 HttpURLConnection,對於 JAR,將返回 JarURLConnection。
返回:
到該 URL 的 URLConnection。
拋出:
IOException - 如果發生 I/O 異常。
另請參見:
URL(java.lang.String,java.lang.String, int, java.lang.String), URLConnection, URLStreamHandler.openConnection(java.net.URL)
public URLConnection openConnection(Proxy proxy)
throws IOException
與openConnection() 類似,所不同是連接通過指定的代理建立;不支持代理方式的協議處理程序將忽略該代理參數並建立正常的連接。 調用此方法會提示系統的默認 ProxySelector 設置。
參數:
proxy - 進行此連接所需的代理。如果希望使用直接連接,則應指定 Proxy.NO_PROXY。
返回:
到該 URL 的 URLConnection。
拋出:
IOException - 如果發生 I/O 異常。
SecurityException - 如果有安全管理器並且調用方沒有連接到代理的權限。
IllegalArgumentException - 如果代理為 null,或代理的類型錯誤
UnsupportedOperationException - 如果實現該協議處理程序的子類不支持此方法。
從以下版本開始:
1.5
另請參見:
URL(java.lang.String,java.lang.String, int, java.lang.String), URLConnection, URLStreamHandler.openConnection(java.net.URL,java.net.Proxy)
public final InputStream openStream()
throws IOException
打開到此 URL 的連接並返回一個用於從該連接讀入的 InputStream。此方法是下面方法的縮寫:
openConnection().getInputStream()
返回:
從 URL 連接讀入的輸入流。
拋出:
IOException - 如果發生 I/O 異常。
另請參見:
openConnection(),URLConnection.getInputStream()
public final Object getContent()
throws IOException
獲取此 URL 的內容。此方法是下面方法的縮寫:
openConnection().getContent()
返回:
此 URL 的內容。
拋出:
IOException - 如果發生 I/O 異常。
另請參見:
public final Object getContent(Class[] classes)
throws IOException
獲取此 URL 的內容。此方法是下面方法的縮寫:
openConnection().getContent(Class[])
參數:
classes - Java 類型的數組
返回:
此 URL 的內容對象,它為 classes 數組中指定的類型的第一個匹配項。如果所有請求類型都不受支持,則返回null。
拋出:
IOException - 如果發生 I/O 異常。
從以下版本開始:
1.3
另請參見:
URLConnection.getContent(Class[])
public static void setURLStreamHandlerFactory(URLStreamHandlerFactory fac)
設置應用程序的URLStreamHandlerFactory。在一個給定的 Java 虛擬機中,此方法最多只能調用一次。
URLStreamHandlerFactory 實例用於從協議名稱構造流協議處理程序。
如果有安全管理器,此方法首先調用安全管理器的 checkSetFactory 方法以確保允許該操作。這可能會導致 SecurityException 異常。
參數:
fac - 需要的工廠。
拋出:
Error - 如果應用程序已經設置了工廠。
SecurityException - 如果安全管理器存在並且其 checkSetFactory 方法不允許進行此操作。
另請參見:
URL(java.lang.String,java.lang.String, int, java.lang.String), URLStreamHandlerFactory, SecurityManager.checkSetFactory()