Buffer
Buffer是一个存储二进制的数组,数组的每一项对应一个字节的大小;
const buffer3 = Buffer.from("牛皮的JavaScript");
console.log(buffer3);
// <Buffer e7 89 9b e7 9a ae e7 9a 84 4a 61 76 61 53 63 72 69 70 74>
const str = buffer3.toString();
console.log(str);
//牛皮的JavaScript
Buffer的其他用
Buffer的创建方式
Buffer与文件读取
读取文本文件
const fs = require('fs');
fs.readFile('./test.txt', (err, data) => {
console.log(data); //<Buffer 48 65 6c 6c 6f 20 57 6f 72 6c 64><Buffer 48 65 6c 6c 6f 20 57 6f 72 6c 64>
console.log(data.toString());// Hello World
});
Stream
何为Stream
程序中的流可以假想,当我们从某一个文件读取数据时,文件的二进制数据会源源不断的被读取到我们的程序中;而这个一连串的字节,就是我们程序中的流
则流----是连续字节的一种表现形式和抽象概念,流是可读、可写的。
对比前面学过的可以直接使用readFile或者writeFile的方式来读写文件,流有以下特点
①直接读写的方式简单,但是有一些无法控制的细节的操作
②从什么位置开始读,读到什么位置、一次性读多少字节,都是直接读写的缺点
③读到某个位置后,暂停读取,某个时刻恢复读取。
④文件非常大,如一个视频文件,一次性全部读取并不合适。
流的分类
Writable:可以向其写入数据的流---fs.createWriteStream();
Readable:可以从中读取数据的流---fs.createReadStream(();
Duplex:同时为Readable和Writable的流---net.Socket;
Transform:Duplex可以在写入和读取数据时修改或转换数据的流---zlib.createDeflate();
Readable
const read = fs.createReadStream("./foo.txt", { start: 3, end: 8, highWaterMark: 4});
stat:文件读取开始的位置;
end:文件读取结束的位置;
highWaterMark:一次性读取字节的长度,默认为 64KB;
监听文件的读取与关闭
read.on('open', (fd) => { console.log("文件被打开");})read.on('end', () => { console.log("文件读取结束");})read.on('close', () => { console.log("文件被关闭");})
在某一个时刻暂停与恢复读取
read.on("data", (data) => { console.log(data); read.pause(); setTimeout(() => { read.resume(); }, 2000);});
Writable
我们可以使用createWriteStream来实现文件的写入
const writer = fs.createWriteStream("./foo.txt", {
flags: "a+",
start: 8
});
writer.write("你好啊", err => {
console.log("写入成功");
});
flags:默认是w,如果希望是追加写入,可以使用a 或者a+;
start:写入的位置;
监听事件
writer.on("open", () => {
console.log("文件打开");
})
writer.on("finish", () => {
console.log("文件写入结束");
})
writer.on("close", () => {
console.log("文件关闭");
})
end方法
end方法相当于做了两步操作:write传入的数据和调用close方法