在 Java 中使用 URLConnection 尋找 Web 檔案的大小
1. 概述
HTTP 協定提供有關所要求的 Web 資源的全面資訊。其標頭欄位之一Content-Length,指定資源的大小(以位元組為單位)。我們可以使用URLConnection類別來提取此資訊。
下載前先了解網路檔案的大小有助於估計下載資源所需的網路資料量。
在本教學中,我們將探討如何使用URLConnection類別的getContentLengthLong()和getHeaderField()方法來取得 Web 檔案的大小。
2.HTTP Content-Length
Content-Length屬性指定 HTTP 標頭中 Web 檔案的大小。由於 HTTP 是傳輸協議,因此它提供傳入回應的詳細資訊。簡單地說, Content-Length欄位表示回應正文的大小(以位元組為單位) 。
此外,可以指定Transfer-Encoding欄位並將其設定為分塊而不是Content-Length欄位。在這種情況下,我們無法確定網路檔案的大小,因為下載是分塊完成的。
值得注意的是, Content-Length標頭並不總是準確的。伺服器可以將此欄位設為任意值,該值可能不代表真實的檔案大小。例如,當在 Spring 應用程式中使用ResponseEntity時,開發人員可以將標頭欄位設為任意值,該值可能與回應正文的實際大小不對應。
3. getContentLength()和getContentLengthLong()方法
Java 中的URLConnection類別提供了與 URL 資源建立連線以進行寫入或讀取操作的方法。
它提供了一個名為getContentLength()的方法,該方法以整數形式傳回 HTTP 標頭欄位的內容長度。但是,此方法無法表示大於Integer.MAX_VALUE的數字,這表示它無法處理大於 2 GiB 的檔案大小。
為了解決getContentLength()方法的限制, URLConnection類別提供了getContentLengthLong()方法,該方法以long值形式傳回內容長度。此方法更可取,因為它可以檢索超過Integer.MAX_VALUE的大檔案。
值得注意的是,當 HTTP 標頭中缺少Content-Length欄位時, getContentLength()和getContentLengthLong()方法傳回 -1。
4. 使用getContentLengthLong()方法
讓我們來看一個從「 https://www.ingka.com/wp-content/uploads/2020/11/dummy.pdf 」檢索虛擬 PDF 檔案大小的範例。
首先,我們定義一個URL實例來表示 Web 檔案的 URL:
String fileUrl = "https://www.ingka.com/wp-content/uploads/2020/11/dummy.pdf";
URL url = new URL(fileUrl);
接下來,我們建立一個URLConnection物件並開啟到該 URL 的連線:
URLConnection urlConnection = url.openConnection();
然後,讓我們取得網路檔案的大小:
long fileSize = urlConnection.getContentLengthLong();
if (fileSize != -1) {
assertEquals(29789, fileSize);
} else {
fail("Could not determine file size");
}
在上面的程式碼中,我們呼叫urlConnection物件的getContentLengthLong()方法來取得估計的檔案大小。然後,我們斷言估計檔案大小等於預期大小。
此外,我們也處理網頁檔案大小無法確定網頁檔案大小的情況。
5. 使用getHeaderField()方法
或者,我們可以使用getHeaderField()方法來檢索 Web 檔案大小。該方法傳回它接受作為參數的名稱欄位值。
以下是使用getHeaderField()方法的範例:
@Test
void givenUrl_whenGetFileSizeUsingURLConnectionAndGetHeaderField_thenCorrect() throws IOException {
URL url = new URL(fileUrl);
URLConnection urlConnection = url.openConnection();
String headerField = urlConnection.getHeaderField("Content-Length");
if (headerField != null && !headerField.isEmpty()) {
long fileSize = Long.parseLong(headerField);
assertEquals(29789, fileSize);
} else {
fail("Could not determine file size");
}
}
在上面的程式碼中,我們呼叫URLConnection物件上的getHeaderField()方法並指定Content-Length標頭欄位。由於該方法傳回字串,因此我們將其值解析為long類型,並斷言返回大小等於預期大小。
六,結論
在本教學中,我們了解如何使用URLConnection.getContentLengthLong()和URLConnection.getHeaderField()方法來擷取已知 Web 檔案的大小。我們利用 HTTP 標頭的Content-Length欄位來確定 Web 檔案的大小。當無法確定檔案大小時,它會傳回負一 (-1) 值。
與往常一樣,範例的完整原始程式碼可 在 GitHub 上取得。