Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java通过长度未知的HTTP下载文件_Java_Http_Download - Fatal编程技术网

使用Java通过长度未知的HTTP下载文件

使用Java通过长度未知的HTTP下载文件,java,http,download,Java,Http,Download,我想用java下载HTTP查询,但下载时下载的文件长度不确定 我认为这将是相当标准的,所以我搜索并找到了它的代码片段: 但是contentLength变量有一个问题。由于长度未知,我得到-1。这会产生一个错误。当我省略了关于contentLength的整个检查时,这意味着我必须始终使用最大缓冲区 但问题是文件还没有准备好。因此,刷新只被部分填充,文件的一部分丢失 如果您尝试下载类似于该代码段的链接,您会注意到错误,并且当您总是下载最大缓冲区以忽略错误时,您最终会得到一个损坏的XML文件 有没有办

我想用java下载HTTP查询,但下载时下载的文件长度不确定

我认为这将是相当标准的,所以我搜索并找到了它的代码片段:

但是contentLength变量有一个问题。由于长度未知,我得到-1。这会产生一个错误。当我省略了关于contentLength的整个检查时,这意味着我必须始终使用最大缓冲区

但问题是文件还没有准备好。因此,刷新只被部分填充,文件的一部分丢失

如果您尝试下载类似于该代码段的链接,您会注意到错误,并且当您总是下载最大缓冲区以忽略错误时,您最终会得到一个损坏的XML文件


有没有办法只下载文件中已准备好的部分?我希望这可以下载大文件(高达几GB)。

这应该可以,我测试了它,它适合我:

void downloadFromUrl(URL url, String localFilename) throws IOException {
    InputStream is = null;
    FileOutputStream fos = null;

    try {
        URLConnection urlConn = url.openConnection();//connect

        is = urlConn.getInputStream();               //get connection inputstream
        fos = new FileOutputStream(localFilename);   //open outputstream to local file

        byte[] buffer = new byte[4096];              //declare 4KB buffer
        int len;

        //while we have availble data, continue downloading and storing to local file
        while ((len = is.read(buffer)) > 0) {  
            fos.write(buffer, 0, len);
        }
    } finally {
        try {
            if (is != null) {
                is.close();
            }
        } finally {
            if (fos != null) {
                fos.close();
            }
        }
    }
}
如果希望在后台运行,只需在线程中调用它:

Thread download = new Thread(){
    public void run(){
        URL url= new URL("http://overpass-api.de/api/interpreter?data=area%5Bname%3D%22Hoogstade%22%5D%3B%0A%28%0A++node%28area%29%3B%0A++%3C%3B%0A%29+%3B%0Aout+meta+qt%3B");
        String localFilename="mylocalfile"; //needs to be replaced with local file path
        downloadFromUrl(url, localFilename);
    }
};
download.start();//start the thread

我注意到真正的问题是file.seek命令在这种情况下不能正常工作。它没有找到文件的结尾,因此覆盖了部分文件。使用FileOutputStream修复了它(在像我已经做的那样去掉错误代码之后)。