在开发中,常常会遇到文件上传下载流量控制的问题,这是一个小程序,简单的实现了这个功能,可以参考一下
public class FlowControlInputStream extends FilterInputStream{
public static void main(String[] args){
try{
byte[] buffer = new byte[8092];
int n;
long start = System.currentTimeMillis();
FileInputStream in = new FileInputStream("E:\\pic.rar");
//限制流量为10000也就是10000=10kbps
FlowControlInputStream fin = new FlowControlInputStream(in, 40000);
// fin.update(1000);
System.out.println("当前速率:"+fin.check()/1000+"kbps");
System.out.println("当前文件大小:"+fin.available()/1024+"kb");
while( (n = fin.read(buffer)) > 0);
fin.close();
long end = System.currentTimeMillis();
System.out.println("读取文件完成,共花掉"+(end-start)/600+"秒");
}catch(IOException e){
e.printStackTrace();
}
}
private long timestamp;
private int maxbps;
private int currentbps;
private int bytesread;
//----------------------------------------------------------
//constructor
public FlowControlInputStream(InputStream in, int maxbps){
super(in);
this.maxbps = maxbps;
this.currentbps = 0;
this.bytesread = 0;
this.timestamp = System.currentTimeMillis();
}
//----------------------------------------------------------
//decorated methods
public int read() throws IOException{
synchronized(in){
int avaliable = check();
if(avaliable == 0){
waitForAvailable();
avaliable = check();
}
int value = in.read();
update(1);
return value;
}
}
public int read(byte[] b) throws IOException{
return read(b, 0, b.length);
}
public int read(byte[] b, int off, int len) throws IOException{
synchronized(in){
int avaliable = check();
if(avaliable == 0){
waitForAvailable();
avaliable = check();
}
int n = in.read(b, off, Math.min(len, avaliable));
update(n);
return n;
}
}
private int check(){
long now = System.currentTimeMillis();
if(now - timestamp >= 1000){
timestamp = now;
currentbps = bytesread;
bytesread = 0;
return maxbps;
}else{
return maxbps - bytesread;
}
}
private void waitForAvailable(){
long time = System.currentTimeMillis() - timestamp;
boolean isInterrupted = false;
while(time < 1000){
try{
Thread.sleep(1000 - time);
}catch(InterruptedException e){
isInterrupted = true;
}
time = System.currentTimeMillis() - timestamp;
}
if(isInterrupted)
Thread.currentThread().interrupt();
return;
}
private void update(int n){
bytesread += n;
}
public int getCurrentbps(){
return currentbps;
}
}
代码很简单!
分享到:
相关推荐
Java作为一种广泛使用的编程语言,同样提供了多种方法来实现流量控制。本篇文章将深入探讨Java如何实现流量控制,并结合具体实例来阐述相关知识点。 首先,我们要理解流量控制的基本原理。在TCP(传输控制协议)中...
本项目“简单的Java多人聊天小程序”就是基于TCP协议实现的一个基础的多用户聊天应用。下面将详细介绍其设计原理、实现方式以及主要涉及的Java编程知识。 1. **TCP协议基础** TCP协议确保数据的可靠传输,通过三次...
【标题】"365赚钱宝养猫小程序流量主广告程序源码下载"涉及的核心知识点主要涵盖以下几个方面: 1. **微信小程序开发**:养猫小程序是基于微信小程序平台开发的应用,利用微信庞大的用户基数来吸引流量。小程序的...
6. **用户体验优化**:一个优秀的微信小程序应该注重用户体验。在这款源码中,可能会有针对用户交互、加载速度、页面布局等方面的优化,以确保用户在寻找合适的名字时能获得流畅的体验。 7. **姓名学原理**:宝宝...
这款小程序后端为WordPress,只需导入壁纸插件就可以轻松对小程序前端进行控制 没有任何复杂的操作,只需要有一定的建站基础就可以以学会,小程序也比较简洁,没有其他花里胡哨的功能, 基于Uniapp开发,使用...
流量主是微信小程序的一个特性,允许小程序开发者通过内置广告赚取收益。当用户点击广告或者完成特定操作时,开发者可以获得广告分成,这样可以为小程序带来持续的运营收入。 4. **支付功能**: 自助发卡小程序...
总结起来,"基于Java开发的微赞社区官方论坛小程序"是一个融合了Java后端技术、微信小程序前端技术和社区功能的综合项目,展现了Java在开发高效、稳定、易维护的应用中的优势,以及现代Web开发中的前后端分离、...
拼多多客京东客蘑菇街小程序V10.0.8是一个集成拼多多、京东和蘑菇街电商平台的第三方小程序解决方案。这个版本的程序已经经过了完整的解密处理,提供了后端源码和小程序前端,允许用户进行深度定制和开发。下面将...
【流量动物救助系统微信...综上所述,【流量动物救助系统微信小程序】是一个集成了微信小程序前端和Java SpringBoot、SSM后端技术的项目,旨在通过信息化手段推动动物救助工作的开展,体现了技术服务于社会公益的理念。
Java基于UDP协议的聊天程序是一种实现...总的来说,Java基于UDP协议的聊天程序是一个实践性的项目,涵盖了网络通信、多线程编程、输入输出处理等多个Java开发的重要领域,对于提升编程能力和理论知识都有很大的帮助。
资源变现小程序源码是开发一款基于微信小程序的平台,它主要功能是实现知识付费,让内容创作者能够将他们的知识和技能...对于希望学习微信小程序开发或了解知识付费平台运作的人来说,这是一个极好的实践和学习资源。
本资源提供的是一个专用于影视行业的微信小程序源码,包括后台管理系统,具备流量主功能,这意味着开发者可以通过广告展示等方式轻松实现商业变现。 1. **微信小程序开发**:微信小程序的开发基于JavaScript、WXML...
- 这个Java程序可以用于安全系统,比如门禁控制,验证用户身份。 - 在社交媒体上,它可以自动标记用户上传照片中的人物。 - 在商业领域,可用于顾客分析,比如零售店的顾客流量统计。 总结来说,这个"人脸识别...
Servlets是Java服务器端编程的基础,它们是运行在服务器上的Java小程序,用于处理HTTP请求并生成响应。Servlets可以与JSP结合使用,JSP主要负责视图层的呈现,而Servlets则处理控制逻辑和业务逻辑。 JPA是Java平台...