Buffer与Stream

作者: 姜治宇 | 来源:发表于2020-04-12 07:50 被阅读0次

    Buffer缓冲器

    Buffer就是缓冲器的意思,这个类主要是内存用来处理原始二进制数据的。
    我们知道,二进制是0和1表示的数据,比如1001这样的,但人们很难看懂这是什么意思,因此会提供一部“字典对照表”进行翻译,这个字典也叫字符集
    字符集有ascII、utf-8、gb2312、big5、ansi等等,而Buffer支持的字符集有:

    'ascii' - 仅支持 7 位 ASCII 数据。如果设置去掉高位的话,这种编码是非常快的。
    'utf8' - 多字节编码的 Unicode 字符。许多网页和其他文档格式都使用 UTF-8 。
    'utf16le' - 2 或 4 个字节,小字节序编码的 Unicode 字符。支持代理对(U+10000 至 U+10FFFF)。
    'ucs2' - 'utf16le' 的别名。
    'base64' - Base64 编码。当从字符串创建 Buffer 时,这种编码可接受“URL 与文件名安全字母表”。
    'latin1' - 一种把 Buffer 编码成一字节编码的字符串的方式。
    'binary' - 'latin1' 的别名。
    'hex' - 将每个字节编码为两个十六进制字符。
    

    下面看看具体使用。
    1、初始化
    我们看一下如何创建Buffer。6以上的版本中舍弃了new的方式,改用了alloc和from方法创建。

    let buf = Buffer.alloc(5);//创建一个buffer对象
    console.log(buf);//<Buffer 00 00 00 00 00>
    
    let buf2 = Buffer.from([1,2,3])//创建Buffer,初始化为一个数组
    console.log(buf2)//<Buffer 01 02 03>
    
    let buf3 = Buffer.from(buf2)//传Buffer也是可以的
    console.log(buf3)//<Buffer 01 02 03>
    
    let buf4 = Buffer.from('hello','utf8') //传字符串也行
    
    console.log(buf4)//<Buffer 68 65 6c 6c 6f>
    

    2、写入缓冲器

    let buf = Buffer.alloc(5);//创建一个buffer对象
    buf.write('hi','utf8')
    console.log(buf)//<Buffer 68 69 00 00 00>
    

    3、读取缓冲器

    let buf = Buffer.from('hi,你好')
    console.log(buf.toString('utf8'))//hi,你好
    

    4、拼接缓冲器
    Buffer也可以拼接。

    let buf1 = Buffer.from('你好')
    let buf2 = Buffer.from(',我是')
    let buf3 = Buffer.from('jack')
    
    let buf = Buffer.concat([buf1,buf2,buf3])
    console.log(buf.toString('utf8'))//你好,我是jack
    

    Stream

    我们知道,要读取一个二进制文件,一般是要先读到内存Buffer里面的,对小型文件来说没啥问题,但是对于音频、视频这样动辄几个G的大文件来说就行不通了,因为一下子就会被把内存撑死,也称为“爆仓”现象。
    Buffer反正是不成的了,我们应该用一种部分传输(chunk)的方式来解决,这就引入了流的概念。
    Stream最常用的有两种:可读流和可写流。

    可读流:
    let fs = require('fs')
    let total = ''
    
    let readableStream = fs.createReadStream('./test.txt')
    
    readableStream.setEncoding('UTF8')
    readableStream.on('data',(chunk)=>{
        total += chunk
    })
    readableStream.on('end',()=>{
        console.log(total)
    })
    readableStream.on('error',(err)=>{
        console.log(err)
    })
    
    可写流:
    let fs = require('fs')
    
    let readableStream = fs.createReadStream('./test.txt')
    
    let writableStream = fs.createWriteStream('./output.txt')
    
    readableStream.setEncoding('UTF8')
    
    readableStream.on('data',(chunk)=>{
    
        writableStream.write(chunk)//写入文件
    })
    
    readableStream.on('end',()=>{
        writableStream.end()//关闭写入流
    })
    
    readableStream.on('error',(err)=>{
        console.log(err)
    })
    

    pipe

    pipe就是管子的意思,在gulp中这个方法比较常见。

    let fs = require('fs')
    
    let readableStream = fs.createReadStream('./input.txt')
    
    let writableStream = fs.createWriteStream('./output.txt')
    
    if(readableStream.pipe(writableStream)){
        console.log('文件复制成功')
    }else {
     console.log('文件复制失败')
    }
    

    相关文章

      网友评论

        本文标题:Buffer与Stream

        本文链接:https://www.haomeiwen.com/subject/ssnpmhtx.html