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