Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.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在站点上下载文件的最快方式_Java_Url - Fatal编程技术网

使用java在站点上下载文件的最快方式

使用java在站点上下载文件的最快方式,java,url,Java,Url,我正在编写一个Java代码,使用http协议在站点上下载大量zip文件,每个文件的大小约为1MB(1024KB) 我知道有很多方法可以做到这一点。我只是想知道哪一个是最快的,我想知道每次下载的进度,比如显示一个百分比数字之类的 我只是给出我的代码版本,关于如何改进它有什么想法吗 谢谢大家 public static void downloadFile(String downloadUrl , String fileName) throws Exception { URL url=new

我正在编写一个Java代码,使用http协议在站点上下载大量zip文件,每个文件的大小约为1MB(1024KB)

我知道有很多方法可以做到这一点。我只是想知道哪一个是最快的,我想知道每次下载的进度,比如显示一个百分比数字之类的

我只是给出我的代码版本,关于如何改进它有什么想法吗

谢谢大家

 public static void downloadFile(String downloadUrl , String fileName) throws Exception {
    URL url=new URL(downloadUrl); 
    URLConnection connection = url.openConnection();
    int filesize = connection.getContentLength(); 
    float totalDataRead=0; 
    java.io.BufferedInputStream in = new java.io.BufferedInputStream(connection.getInputStream()); 
    java.io.FileOutputStream fos = new java.io.FileOutputStream(fileName); 
    java.io.BufferedOutputStream bout = new BufferedOutputStream(fos,1024);
    byte[] data = new byte[1024]; 
    int i=0; 
    while((i=in.read(data,0,1024))>=0) { 
        totalDataRead=totalDataRead+i; 
        bout.write(data,0,i); 
        float Percent=(totalDataRead*100)/filesize;
        System.out.println((int)Percent);
    }    
    bout.close(); 
    in.close();
}

您正在过早地进行优化。网络带宽瓶颈可能远远超过您正在进行的任何处理

您不需要将InputStream包装在BufferedInputStream中。您可能希望更大的读取缓冲区大小,但这可能会产生最小的影响,具体取决于连接返回的InputStream的底层实现、内核级缓冲等


对于进度条,获取到目前为止阅读的内容,并将其除以connection.getContentLength(),但请注意,如果长度未知,则getContentLength()可能返回-1(它只提供内容长度头的值)。当您读取数据时,将进度信息传递到您选择执行的任何操作,以便将其显示给用户。

我不知道,我的花了8个小时。为了减少24小时的下载时间,我取消了所有其他下载,不使用互联网,并取消了所有其他后台任务

除非你有一个专用的1GB连接到互联网,否则你如何在一个代码中做到这一点其实并不重要。i、 瓶颈不是你的代码。您可以做的主要改进是确保您使用了所有带宽,使用的带宽超过了您的公平份额。我会考虑使用至少1.5 KB的缓冲区,因为这是数据包的大小。e、 g.试试2 kb谢谢你的明确回答。我完全同意你的观点,带宽是主要的瓶颈。那么有没有开源库能比自己编写更好,也许我可以使用它。@xuqin1019您可以使用Apache commons IO,它将为您节省几行代码(但添加一个库)