Stream文件流
- 文件特别大时,同步会阻塞程序,异步会等待结果,所以引入流的概念。
- 流的概念,就跟水流一样。比如在看电影时,电影的资源并不是一瞬间就下载到我们客户端中的,而是一点一点过来的。在理想状态下,读一部分,就写一部分,在时间允许情况下,总会处理完。
- 管道流(pipe):把文件比作装水的桶,而水就是文件里的内容,我们用一根管子(pipe)连接两个桶使得水从一个桶流入另一个桶,这样就慢慢的实现了大文件的复制过程。
Buffer(缓冲区)
- 为什么要使用Buffer?
- 因为javascript中的字符串是以utf-8的格式存储的,处理二进制的能力很弱,而网络层对于不同资源的请求和响应都是用二进制的形式来交互的。
- 数据流是从一个地方向另一个地方传输数据的过程,通常情况下,我们传输数据往往是为了处理它,或者读它,或者基于这些数据做处理等。
- 如果处理数据的时间比到达的时间快,而这一时刻仅仅到达了一小部分数据,那这小部分数据需要等待剩下的数据填满,然后再送过去统一处理。
- 这个”等待区域”就是buffer! 它是你电脑上的一个很小的物理地址,一般在RAM中,在这里数据暂时的存储、等待,最后在流(stream)中,发送过去并处理。
- 当你看在线视频时,当你网络连接很慢,当处理完当前的数据后,你的播放器就会暂停,或出现”缓冲”(buffer)字样,意思是正在收集更多的数据,或者等待更多的数据到来,才能下一步处理。当buffer装满并处理好,播放器就会显示数据,也就是播放视频了。在播放当前内容的时候,更多的数据也会源源不断的传输、到达和在buffer等待。
- 如果播放器已经处理完或播放完前一个数据,buffer仍然没有填满,”buffering”(缓冲)字符就会再次出现,等待和收集更多的数据。
Buffer的操作
// 创建一个长度为 10、且用 0 填充的 Buffer。
const buf1 = Buffer.alloc(10);
// 创建一个长度为 10、且用 0x1 填充的 Buffer。
const buf2 = Buffer.alloc(10, 1);
// 根据内容直接创建buffer
const buf3 = Buffer.from("hello buffer");
buf1.toJSON()
// 一个空的buffer
buf3.toJSON()
// { type: 'Buffer',data: [ 104, 101, 108, 108, 111, 32, 98, 117, 102, 102, 101, 114 ] }
// the toJSON() 方法可以将数据进行Unicode编码并展示
buf3.length //12 根据数据自动盛满并创建
//写入数据到buffer
buf1.write("Buffer really rocks!")
//解码buffer
buf1.toString() // 'Buffer rea'
//因为buf1只能承载10个字节的内容,所有多处的东西会被截断
参考文章:https://blog.csdn.net/qq_34629352/article/details/88037778
网友评论