从直接下载中下载文件 URL
Download File from Direct Download URL
我正在尝试下载以下文件,link 会将您重定向到直接下载: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 没有好像有什么内容。
我 运行 没有选择,任何人都知道如何处理这个案例,或者我应该使用什么正确的术语来研究这个具体案例?
我找到了一个解决方案,可能有一种更礼貌的方法可以达到相同的结果,但这对我来说效果很好:
//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++;
需要注意两点:
- 当我尝试执行重定向的 url HTTPGet 时,响应代码是 301 或 302(取决于我使用的示例),我通过 if 检查克服了这个问题,如下所示重定向并指向下载的文件。
- 一旦瞄准文件,为了获取压缩文件的内容,我找到了 GZIPInputStream 包,它允许我直接从压缩文件中获取一个 inputStream 并将其转储到一个 xml 文件,它让我节省了三个步骤(解压、读取、复制)的时间。
我正在尝试下载以下文件,link 会将您重定向到直接下载: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 没有好像有什么内容。
我 运行 没有选择,任何人都知道如何处理这个案例,或者我应该使用什么正确的术语来研究这个具体案例?
我找到了一个解决方案,可能有一种更礼貌的方法可以达到相同的结果,但这对我来说效果很好:
//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++;
需要注意两点:
- 当我尝试执行重定向的 url HTTPGet 时,响应代码是 301 或 302(取决于我使用的示例),我通过 if 检查克服了这个问题,如下所示重定向并指向下载的文件。
- 一旦瞄准文件,为了获取压缩文件的内容,我找到了 GZIPInputStream 包,它允许我直接从压缩文件中获取一个 inputStream 并将其转储到一个 xml 文件,它让我节省了三个步骤(解压、读取、复制)的时间。