我正在嘗試解壓縮 HTTP 請求的“回應”中的檔案。我的觀點是,在收到回應后,我無法將其解壓縮,也無法將其轉換為 blob 以在之后對其進行決議。zip 將始終回傳一個 xml,檔案解壓縮后的想法是將 XML 轉換為 JSON。
這是我嘗試過的代碼:
val client = HttpClient.newBuilder().build();
val request = HttpRequest.newBuilder()
.uri(URI.create("https://donnees.roulez-eco.fr/opendata/instantane"))
.build();
val response = client.send(request, HttpResponse.BodyHandlers.ofString());
然后 response.body() 是不可讀的,我沒有找到合適的方法將它變成一個 blob
我用于直接解壓縮的另一個代碼是這個:
val url = URL("https://donnees.roulez-eco.fr/opendata/instantane")
val con = url.openConnection() as HttpURLConnection
con.setRequestProperty("Accept-Encoding", "gzip")
println("Length : " con.contentLength)
var reader: Reader? = null
reader = InputStreamReader(GZIPInputStream(con.inputStream))
while (true) {
val ch: Int = reader.read()
if (ch == -1) {
break
}
print(ch.toChar())
}
但在這種情況下,它不會接受 gzip
任何想法?
uj5u.com熱心網友回復:
看起來您將zip(一種支持壓縮的存檔格式)與gzip(一種簡單的壓縮格式)混淆了。
下載https://donnees.roulez-eco.fr/opendata/instantane(例如使用curl)并檢查結果表明它是一個 zip 存檔(包含單個檔案,PrixCarburants_instantane.xml)。
但是您嘗試將其解碼為 gzip 流(帶有GZIPInputStream),但事實并非如此 - 因此您的問題。
讀取 zip 檔案比讀取 gzip 檔案稍微復雜一些,因為它可以保存多個壓縮檔案。但這ZipInputStream很容易:您可以讀取第一個 zip 條目(其中包含元資料,包括其未壓縮大小),然后繼續讀取該條目中的實際資料。
更復雜的是,這個特定的壓縮檔案似乎使用 ISO 8859-1 編碼,而不是通常的 UTF-8。因此,在將位元組流轉換為文本時需要考慮到這一點。
這是一些示例代碼:
val zipStream = ZipInputStream(con.inputStream)
val entry = zipStream.nextEntry
val reader = InputStreamReader(zipStream, Charset.forName("ISO-8859-1"))
for (i in 1..entry.size)
print(reader.read().toChar())
顯然,一次一個字符地讀取和列印整個 11MB 檔案的效率不是很高!而且,如果 zip 存檔可能包含多個條目,則您必須通讀所有條目,并在找到具有正確名稱的條目時停止。但我希望這是一個很好的例證。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/444877.html
上一篇:瀏覽器快取如何確定請求是否相同?
