从直接下载中下载文件 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 文件,它让我节省了三个步骤(解压、读取、复制)的时间。