zoukankan      html  css  js  c++  java
  • Stream概念的理解

    Stream,流,这个概念,类似于水流,是对传输过程的一个抽象。

    我们要把一堆东西从出发地(source)转移到目标地(dest):

    一种方法,一次性把东西全部运过去,这在数量比较少,重量比较轻,时候可以实现。而大多数情况下,这个难以做到。

    比如,有10吨苹果,要一次性运送,这个难度就太大了。于是,就有了第二种方法。

    二种方法,一车一车的运送,每次只运送1000斤,这样持续的运送,一定可以把所有苹果运送到目的地。

    这样 分批次,持续的,进行处理的过程就是流。

    编程语言对流进行了封装,形成Stream对象。这个对象可以表示小批量,连续处理的过程。

    class Stream{
        constructor(){
            this.buffer = [];
        }
    }

    Stream通常会有一个缓冲区,数据一直读入缓存区,满了就可以写出到使用端。缓冲区空了之后,就可以再次读入,满了再次写出,这样循环往复...
    当缓存区足够小,读取与写入速度足够快,用数学里面极限的思想,就可以达到连续不断的效果,形成类似水流,川流不息的效果。
    而计算机中,实际上,不可能完全连续,就算是中间有间隔,也是流的一种,就像是水一滴一滴的流出,也是流。

    Stream封装了连续操作的过程,表现形式,通常是:

    循环中持续读取

    while ((line=bufferedReader.readLine())!= null){
        //持续读取,并处理数据
        System.out.println(line);
        bufferedWriter.write(line);
        bufferedWriter.newLine();
    }

    事件中持续读取

    readStream.on('data', function(chunk) { // 当有数据流出时,写入数据
        if (writeStream.write(chunk) === false) { // 如果没有写完,暂停读取流
            readStream.pause();
        }
    });

    Stream的一些应用场景

    1. 视频播放

    视频动辄几个G,一次载入内存根本不可能,硬件无法承受,网络传输也不可能这么快。一边传输,一边播放,就是典型的流。

    2. 水桶装水

    要将水桶的水加满,如果一次性加满,可能要费很大的力气,并且有扭伤腰的风险。一次用舀子盛一些水,多次加满,可以比较轻松的完成整个工作。
    一个小孩子也可以完成大人的工作。这也是流的一个应用。

  • 相关阅读:
    编写一个函数将一个十六进制数的字符串参数转换成整数返回?
    设置一段文字的大小为6px?
    写clone()方法时,通常都有一行代码,是什么?
    abstract class和interface有什么区别?
    JDBC中的Statement 和PreparedStatement的区别?
    什么是MVC模式?   
    Struts2的Action中获取request对象的几种方式?
    Struts2的功能扩展点有哪些?
    说说&和&&的区别?
    Struts2里面有什么隐式对象?
  • 原文地址:https://www.cnblogs.com/mengff/p/12815043.html
Copyright © 2011-2022 走看看