java代码提升下载速度 java实现高速下载

用java程序来做限速,下载文件的代码修改用java程序来做限速,方向就有问题,如果大并发量,都要控制速度你程序早就挂了 。应该用应用服务器(我想你用的tomcat吧)+http服务器控制,这里用apache就可以了 。用apache来做限速才是正确的 , 用程序代码几乎是没法限速,http 协议是无状态的协议 。
当然你一定要做, 那就是写一定数量流,拿这个数据流的大小与你限速的平均量比,如果超过了就程序暂停一会 。(这样设计很不合理,但可以达到你的要求)
还有两个,快了
怎么提高java爬虫下载的速度呢首先声明下: 请合法,合规的使用技术!~
你的需要并不是爬虫的爬取速度, 而是相关资源的下载速度.
1: 那么你可以使用 java的多线,来实现. 比如把资源分成几块,然后每一块都交给一个线程去处理.
2: 或者使用Fork/Join框架,把下载任务分成多个小任务, 在把多个小任务的结果合并成一个最终结果.
【java代码提升下载速度 java实现高速下载】3: 配合上JavaFX/ControlsFX 做个图形化的界面, 就可以图形化,可视化 整个过程.
用java实现文件的下载,如何提高下载速度(非web开发)下面贴出的代码是一个简单的读取远程文件保存到本地的实现,至于提高下载速度你可以利用多线程,具体可参考最下面的那个网址——
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
public class DownloadTester {
public static void main(String[] args) throws IOException {
String urlStr = "";
String path = "D:/";
String name = urlStr.substring(urlStr.trim().lastIndexOf("/"));
URL url = new URL(urlStr);
InputStream in = url.openConnection().getInputStream();
File file = new File(path + name);
FileOutputStream out = new FileOutputStream(file, true);
int counter = 0;
int ch;
byte[] buffer = new byte[1024];
while ((ch = in.read(buffer)) != -1) {
out.write(buffer, 0, ch);
counter += ch;
System.out.println(counter + ":byte");
}
out.flush();
in.close();
out.close();
}
}
某公司面试题java11使用并发多线程加速下载文件 , 如何写?先建一个用于下载文件的多线程类,通常要指明下载文件的位置(URL)和文件名以及保存到本地的路径
public class FileDownloader implements Runnable
{
private static File file;//要下载的文件
private static String url;//文件所在URL
private static File storagePath;//保存路径
public static void initialize(File file, String url, File storagePath)//初始化静态字段,初始化的代码不用我写吧
}
然后,指明同步块,目的是让各个线程共享一个文件资源,那样它们可以知道同一个文件的下载状况(即获取其他线程下载文件到哪个位置,以防重复下载)
public synchronized void fileDownload()//此方法用于下载文件,一般的Java程序员都会写,实在不会我可以帮你补上
或者
public void fileDownload(){
synchronized(file){
synchronized(url){
synchronized(storagePath){
}}}}//给每个字段加上同步块
run()方法的实现就以自己的喜好去写吧,只要里面调用了fileDownload()方法就行 。
public void run(){

fileDownload();//下载文件

}
然后,在主类的main方法中创建一个多线程数组:
Runnable[] fds=new FileDownloader[线程数量];//fds为file_downloaders缩写
Thread[] threads=new Thread[线程数量];
最后使用循环把所有的线程逐一启动 。
for(int i=0;i线程数量;i++){
threads[i]=new Thread(fds[i]);

推荐阅读