我正在嘗試下載以下檔案,并使用此鏈接將您重定向到直接下載:http ://www.lavozdegalicia.es/sitemap_sections.xml.gz
我已經完成了自己的研究,但我看到的所有結果都與 HTTP URL 重定向 [3xx] 相關,而不是直接下載重定向(也許我使用了錯誤的術語來進行研究)。
我嘗試了以下代碼(參考:https ://programmerclick.com/article/7719159084/ ):
// Using Java IO
private static void downloadFileFromUrlWithJavaIO(String fileName, String fileUrl) {
BufferedInputStream inputStream = null;
FileOutputStream outputStream = null;
try {
URL url = new URL(fileUrl);
inputStream = new BufferedInputStream(url.openStream());
outputStream = new FileOutputStream(fileName);
byte data[] = new byte[1024];
int count;
while ((count = inputStream.read(data, 0, 1024)) != -1) {
outputStream.write(data, 0, count);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (inputStream != null) {
inputStream.close();
}
if (outputStream != null) {
outputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
// Using Apache common IO
private static void downloadFileFromUrlWithCommonsIO(String fileName, String fileUrl) {
try {
FileUtils.copyURLToFile(new URL(fileUrl), new File(fileName));
} catch (IOException e) {
e.printStackTrace();
}
}
// Using NIO
private static void downloadFileFromURLUsingNIO(String fileName, String fileUrl) {
try {
URL url = new URL(fileUrl);
ReadableByteChannel readableByteChannel = Channels.newChannel(url.openStream());
FileOutputStream fileOutputStream = new FileOutputStream(fileName);
fileOutputStream.getChannel().transferFrom(readableByteChannel, 0, Long.MAX_VALUE);
fileOutputStream.close();
readableByteChannel.close();
} catch (IOException e) {
e.printStackTrace();
}
}
但是我使用這三個選項中的任何一個得到的結果都是一個空檔案,我的想法是問題與檔案是 .xml.gz 有關,因為當我除錯它時 inputStream 似乎沒有任何內容。
我沒有選擇,任何人都知道如何處理這個案例,或者我應該使用什么正確的術語來研究這個具體案例?
uj5u.com熱心網友回復:
我找到了一個解決方案,可能有一種更禮貌的方法可以達到相同的結果,但這對我來說效果很好:
//Download the file and decompress it
filecount=0;
URL compressedSitemap = new URL(urlString);
HttpURLConnection con = (HttpURLConnection) compressedSitemap.openConnection();
con.setRequestMethod("GET");
if (con.getResponseCode() == HttpURLConnection.HTTP_MOVED_TEMP || con.getResponseCode() == HttpURLConnection.HTTP_MOVED_PERM) {
String location = con.getHeaderField("Location");
URL newUrl = new URL(location);
con = (HttpURLConnection) newUrl.openConnection();
}
String file = "/home/user/Documentos/Decompression/decompressed" filecount ".xml";
GZIPInputStream gzipInputStream = new GZIPInputStream(con.getInputStream());
FileOutputStream fos = new FileOutputStream(file);
byte[] buffer = new byte[1024];
int len = 0;
while ((len = gzipInputStream.read(buffer)) > 0) {
fos.write(buffer, 0, len);
}
fos.close();
filecount ;
有兩點需要注意:
- 當我嘗試 HTTPGet 作為重定向的 url 時,回應代碼是 301 或 302(取決于我使用的示例),我通過 if 檢查克服了這個問題,它遵循重定向并針對下載的檔案。
- 瞄準檔案后,為了獲取壓縮檔案的內容,我找到了GZIPInputStream包,它允許我直接從壓縮檔案中獲取 inputStream 并將其轉儲到 xml 檔案中,這節省了我在三個步驟中完成它的時間(解壓、閱讀、復制)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/470874.html
上一篇:如何使用.htaccessrewrite將根URL重定向到子目錄,但在沒有找到任何內容時也有回退?
下一篇:使用git移動檔案時丟失歷史記錄