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. 水桶装水

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

猜你喜欢

转载自www.cnblogs.com/mengff/p/12815043.html