`

Java I/O流带宽控制

阅读更多
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 过滤流-带格式的读写操作

    在Java编程语言中,输入/输出(I/O)是处理数据传输的核心部分。过滤流(Filter Stream)是Java I/O框架中的一个重要概念,它提供了一种优雅的方式来进行数据的读写操作,同时允许我们添加额外的功能,如字符编码...

    视频流带宽计算.docx

    视频流带宽计算是视频监控系统设计中的关键环节,它涉及到视频质量、存储需求和网络传输效率。在视频监控中,比特率(BitRate)是衡量数据传输速率的指标,通常以bps(Bits Per Second)表示。比特率越高,意味着...

    一种基于业务流带宽约束的前向资源预留策略" (2007年)

    为了减少入口节点处的数据突发时延,提出了一种基于业务流带宽约束的前向资源预留(FRR-BC) 策略。该策略使用一种新的基于业务流带宽约束的数据突发长度预测方法,以降低数据突发在入口节点处的处理 时间,同时通过...

    HTML5图片瀑布流带筛选功能代码.rar

    HTML5图片瀑布流带筛选功能代码.rar HTML5图片瀑布流带筛选功能代码.rar HTML5图片瀑布流带筛选功能代码.rar HTML5图片瀑布流带筛选功能代码.rar HTML5图片瀑布流带筛选功能代码.rar HTML5图片瀑布流带筛选功能代码....

    Vitamio网络视频流带缓冲

    "Vitamio网络视频流带缓冲"指的是在使用Vitamio库时,通过缓存技术来改善网络视频播放的流畅性,避免因网络波动导致的播放中断或卡顿。 首先,我们需要在项目中集成Vitamio库。这通常涉及将Vitamio的AAR库或者JAR库...

    HTML5图片瀑布流带筛选功能代码.zip

    CSS则用于定义图片的基本样式和布局规则,如设置元素的宽高比,以便在不同屏幕尺寸下保持一致的视觉效果。 筛选功能则是为了增强用户体验,允许用户根据自己的兴趣或需求选择显示特定类型的图片。这可能通过添加...

    电子政务-双路恒流带LED指示的固态继电器.zip

    电子政务-双路恒流带LED指示的固态继电器.zip

    数字网络视频的带宽计算方法介绍

    在数字视频监控系统设计与实际应用中,经常需要规划数字视频系统的网络带宽及存储带宽,这对于整个系统的应用非常重要,而如何规划网络,涉及到系统实际配置、最终使用及存储、编解码设备、工作站等分布等等因素,是...

    HTML5图片瀑布流带筛选功能特效代码

    在这个"HTML5图片瀑布流带筛选功能特效代码"中,开发者为用户提供了更高级的交互体验,允许用户通过筛选条件来过滤显示的图片。 首先,让我们了解一下HTML5在其中发挥的作用。HTML5是超文本标记语言的最新版本,...

    基于大plc大型电力变压器冷却控制的研究毕业论文.doc

    【基于PLC的大型电力变压器冷却控制】 电力变压器在现代电力系统中扮演着核心角色,其稳定运行至关重要。随着电力需求的增长,大型电力变压器的散热问题变得尤为突出。本研究聚焦于利用PLC(可编程逻辑控制器)技术...

    golang rtsp流带声音 转码到web 无插件播放

    golang rtsp 转码到web 无插件播放

    基于大plc大型电力变压器冷却控制的研究毕业论文定稿.doc

    【基于PLC的大型电力变压器冷却控制】 电力变压器在现代电力系统中扮演着核心角色,其稳定运行至关重要。随着电力系统规模的扩大和电压等级的提升,变压器的使用量显著增加,对系统的安全性产生了直接影响。变压器...

    零序方向保护

    ### 零序方向保护详解 #### 一、零序方向保护的...通过对零序电流、电压和功率的有效监测和控制,可以大大提高电力系统的稳定性和可靠性。随着技术的进步,现代微机保护装置的应用使得零序方向保护更加灵活和高效。

    springboot发送邮件(含带附件的邮件,定时任务等功能)

    现在,我们可以创建一个邮件服务类,例如`EmailService.java`,来处理邮件发送的逻辑。首先,我们定义一个`sendEmail`方法,用于发送普通邮件: ```java import org.springframework.beans.factory.annotation....

    大学毕业论文-—基于大plc大型电力变压器冷却控制的研究.doc

    基于 PLC的大型电力变压器冷却控制的研究 本文研究的背景是电力系统中的变压器冷却控制问题。随着电力系统规模的不断扩大和电压等级的提高,变压器的效率虽然很高,但系统中每年变压器总的电能耗仍然是一个相当大的...

Global site tag (gtag.js) - Google Analytics