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编程语言中,输入/输出(I/O)是处理数据传输的核心部分。过滤流(Filter Stream)是Java I/O框架中的一个重要概念,它提供了一种优雅的方式来进行数据的读写操作,同时允许我们添加额外的功能,如字符编码...
视频流带宽计算是视频监控系统设计中的关键环节,它涉及到视频质量、存储需求和网络传输效率。在视频监控中,比特率(BitRate)是衡量数据传输速率的指标,通常以bps(Bits Per Second)表示。比特率越高,意味着...
为了减少入口节点处的数据突发时延,提出了一种基于业务流带宽约束的前向资源预留(FRR-BC) 策略。该策略使用一种新的基于业务流带宽约束的数据突发长度预测方法,以降低数据突发在入口节点处的处理 时间,同时通过...
HTML5图片瀑布流带筛选功能代码.rar HTML5图片瀑布流带筛选功能代码.rar HTML5图片瀑布流带筛选功能代码.rar HTML5图片瀑布流带筛选功能代码.rar HTML5图片瀑布流带筛选功能代码.rar HTML5图片瀑布流带筛选功能代码....
"Vitamio网络视频流带缓冲"指的是在使用Vitamio库时,通过缓存技术来改善网络视频播放的流畅性,避免因网络波动导致的播放中断或卡顿。 首先,我们需要在项目中集成Vitamio库。这通常涉及将Vitamio的AAR库或者JAR库...
CSS则用于定义图片的基本样式和布局规则,如设置元素的宽高比,以便在不同屏幕尺寸下保持一致的视觉效果。 筛选功能则是为了增强用户体验,允许用户根据自己的兴趣或需求选择显示特定类型的图片。这可能通过添加...
电子政务-双路恒流带LED指示的固态继电器.zip
在数字视频监控系统设计与实际应用中,经常需要规划数字视频系统的网络带宽及存储带宽,这对于整个系统的应用非常重要,而如何规划网络,涉及到系统实际配置、最终使用及存储、编解码设备、工作站等分布等等因素,是...
在这个"HTML5图片瀑布流带筛选功能特效代码"中,开发者为用户提供了更高级的交互体验,允许用户通过筛选条件来过滤显示的图片。 首先,让我们了解一下HTML5在其中发挥的作用。HTML5是超文本标记语言的最新版本,...
【基于PLC的大型电力变压器冷却控制】 电力变压器在现代电力系统中扮演着核心角色,其稳定运行至关重要。随着电力需求的增长,大型电力变压器的散热问题变得尤为突出。本研究聚焦于利用PLC(可编程逻辑控制器)技术...
golang rtsp 转码到web 无插件播放
【基于PLC的大型电力变压器冷却控制】 电力变压器在现代电力系统中扮演着核心角色,其稳定运行至关重要。随着电力系统规模的扩大和电压等级的提升,变压器的使用量显著增加,对系统的安全性产生了直接影响。变压器...
### 零序方向保护详解 #### 一、零序方向保护的...通过对零序电流、电压和功率的有效监测和控制,可以大大提高电力系统的稳定性和可靠性。随着技术的进步,现代微机保护装置的应用使得零序方向保护更加灵活和高效。
现在,我们可以创建一个邮件服务类,例如`EmailService.java`,来处理邮件发送的逻辑。首先,我们定义一个`sendEmail`方法,用于发送普通邮件: ```java import org.springframework.beans.factory.annotation....
基于 PLC的大型电力变压器冷却控制的研究 本文研究的背景是电力系统中的变压器冷却控制问题。随着电力系统规模的不断扩大和电压等级的提高,变压器的效率虽然很高,但系统中每年变压器总的电能耗仍然是一个相当大的...