流和压缩

流和压缩

  • buffer
  • 压缩

buffer

buffer 是二进制数据。我们都知道,计算机在处理数据时候,最终是转换成二进制来进行处理的。在 js 中,最终只能操作字符串。

nodejs 出现后,js 有了处理二进制数据的能力。

来看下面的例子:

const fs = require('fs');

fs.readFile('./test.txt',(err, data)=>{
    if(err) throw err;
    console.log(data);
});

在上面的例子中,我们使用 readFile 来读取文件,在没有添加指定编码的情况下,读取出来的就是 buffer 数据。

下面介绍一些关于 buffer 的简单操作。

// 创建 buffer
let buf = new Buffer.from([10,20,30]);
console.log(buf); // <Buffer 0a 14 1e>


在计算机中,数据是以流的形式来进行传输。

在 nodejs 中,可以针对流进行操作。

可读流

将一块数据以流的形式一点一点的读取。

const fs = require('fs');
// 创建一个可读流
let readablestream = fs.createReadStream('./test.txt');
readablestream.on('data',function(chunk){
    console.log(chunk.toString());
    console.log('--------------------------------------')
})
可写流
const fs = require('fs');
// 创建可读流
let readablestream = fs.createReadStream('./test.txt');
// 创建可写流
let writeablestream = fs.createWriteStream('./test2.txt');
readablestream.on('data',function(chunk){
    writeablestream.write(chunk);
})
readablestream.on('end',function(){
    writeablestream.end();
})
pipe 方法

pipe 方法就类似于在两个数据容器之间接了一根管子,数据流直接通过这跟管道流向另外一个容器,不需要在监听data事件。

const fs = require('fs');
// 创建可读流
let readablestream = fs.createReadStream('./test.txt');
// 创建可写流
let writeablestream = fs.createWriteStream('./test3.txt');
readablestream.pipe(writeablestream);

压缩

使用到了 nodejs 中内置的模块,zlib,可以通过这个模块来创建压缩文件。

快速入门的示例:

const zlib = require('zlib');
const fs = require('fs');

// 要对一个文件进行压缩

const gzib = zlib.createGzip(); // 压缩对象
const readablesteam = fs.createReadStream('./test.txt');
const output = fs.createWriteStream('./test.txt.gz');
readablesteam.pipe(gzib).pipe(output);
解压缩
const fs = require('fs');  // 引入文件模块
const zlib = require('zlib');  // 引入压缩模块

const gunzip = zlib.createGunzip(); // 解压缩文件创建的是 gunzip 对象
// 和压缩过程相比 , 就是一个反向操作 , 可读流为压缩文件 , 可写流为解压文件
const inFile = fs.createReadStream('./test.txt.gz');
const outFile = fs.createWriteStream('./Hello.txt');
// 同样也是调用可读流的 pipe() 方法 , 写入之前先传入 gunzip 对象进行一下解压 , 然后在进行写入
inFile.pipe(gunzip).pipe(outFile);
服务端解压缩
const http = require('http');
const zlib = require('zlib');
const fs = require('fs');
const filepath = './extra/fileForGzip.html'; // 要向客户端返回的文件

const server = http.createServer(function (req, res) {
    const acceptEncoding = req.headers['accept-encoding']; // 获取 acceptEncoding 的值
    // 判断是否需要 gzip 压缩
    if (acceptEncoding.indexOf('gzip') != -1) {
        // 进入 if 说明 acceptEncoding 里面包含 gzip 值
        // 客户端的浏览器支持压缩文件
        const gzip = zlib.createGzip();
        // 记得响应 Content-Encoding,告诉浏览器:文件被 gzip 压缩过
        res.writeHead(200, {
            'Content-Encoding': 'gzip'
        });
        fs.createReadStream(filepath).pipe(gzip).pipe(res);
    } else {
        // 进入 else , 说明客户端的浏览器不支持压缩文件
        // 直接返回该文件
        fs.createReadStream(filepath).pipe(res);
    }

});
server.listen(3000);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
  作为信息时代象征的Internet的广泛使用是毋庸置疑的,作为Internet的终极用户,您可能经常有这种抱怨,我的机器够快的,但使用Internet时总觉得慢,作为ISP又抱怨用户不愿意掏钱买更好的线路,作为ICP又觉得没有太好的软件可以让数据的量变小,这种受带宽限制的Internet着实让很多人伤心,何不制作一个数据压缩程序,将数据压缩一下,让他变得快些呢,Web Server和IE提供了部分这样的功能,也就是将网页的内容进行压缩,但这仅仅是部分功能。   对于象地理信息系统,图书查询系统,ERP系统等的,Internet要传输的数据量相当大,而象图形数据、XML数据、文本数据其压缩率是相当高的,甚至可以压缩到百分之几,正是由于这个要求,我制作了这么两个软件:一是传输/文件的压缩软件,另一个是基于HTTP的压缩传输软件,这两个软件花费了我很多心血(尽管里面还有一些BUG),但我准备把他作为免费软件,来庆贺我的生日,如果你想使用或想得到源码请发邮件给我。   第一个软件,传输/文件的压缩,利用Internet中惯常使用的gzip, deflate算法,可以和sun java的GZipInputStream和GZipOutputStream互操作   第二个软件,基于HTTP的压缩传输软件,可完全和IE的VBScript和JScript无缝融合   更详细信息请看使用文档Help.doc   例子文件包含这么几个: readme.doc 本文件 help.doc 帮助文档 GZCore.dll gzip,deflate压缩/解压程序,使用前必须注册 GZUtil.dll GZCore.dll的缓冲区处理封装,用于Web的处理,使用前必须注册 GZip4Web.dll 基于Web的压缩文件/的传送,使用前必须注册 Test.zip 第一个产品的例子, C++代码工程 Temp.asp 第一个产品的例子, 直接用压缩程序发送GZip SvrRecv.asp 第二个产品的例子,用于服务端处理接受的压缩 SvrSend.asp 第二个产品的例子,用于服务端处理发送的压缩 default.asp 第二个产品的例子,用于客户端处理处理接受文件,GZip   如果您有好的建议或BUG汇报,请邮件给我,我先表示感谢。   重要说明,此软件不允许使用于商业用途,否则会受到牵连。   另注,由于本软件使用带来的任何损失,软件制作者概不负责。    Ashley Wang ashleywang@21cn.com 2001.12.24

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值