54 # 可写流基本用法

简介: 54 # 可写流基本用法

内部也是基于 events 模块,fs.openfs.write,如果文件不存在就会创建文件,默认会清空文件并写入

注意点:可写流的 highWaterMark 表示预期占用的内存(达到或者超过预期后返回的值就是false),默认 16k (指代的不是每次写多少) 不会影响内容的写入,可以利用 highWaterMark 来控制写入的速率。

const fs = require("fs");
const path = require("path");
let ws = fs.createWriteStream(path.resolve(__dirname, "./54/name.txt"), {
    flags: "w", // w 代表写入
    encoding: "utf-8",
    mode: 0o666, // 模式:可读可写
    autoClose: true, // fs.close
    start: 0,
    highWaterMark: 3,
});
console.log(ws);

  • ws.write 写入的内容,它是异步的,内容必须是 string or buffer
  • ws.end 可以关闭文件,相当于 ws.write + ws.close
  • ws.on("drain", () => {})写完之后的通知事件
  • drain 触发的条件
  • 1.必须达到预期或者超过预期
  • 2.内存中的内容全部清空后
  • 文件特有的 ws.openws.close

下面三个是并发的,但是内部会维护一个链表,顺序是固定的,内部会维护一个变量,这个变量会统计写入的个数,当达到 highWaterMark 时,会返回 false,内容写入后,会在统计的数量的基础上减少

let flag = ws.write("h", () => {
    console.log("成功1");
});
console.log("是否符合预期--->", flag);
flag = ws.write("ello kaimo", () => {
    console.log("成功2");
});
console.log("是否符合预期--->", flag);
// ws.end("!!!", () => {
//     console.log("成功3");
// });
ws.on("drain", () => {
    console.log("drain--->");
});

例子:实现写入10个数,只占用一个字节的内存

如果直接按照下面的写法,一口气放入内存中,第一次写入只有一个0,但是还有9个在内存里,由一个链表保持写入的顺序不乱

let ws2 = fs.createWriteStream(path.resolve(__dirname, "./54/number.txt"), {
    highWaterMark: 1, 
});
for (let i = 0; i < 10; i++) {
    ws2.write(i + "");
}

下面利用 flag 来改造一下

let ws2 = fs.createWriteStream(path.resolve(__dirname, "./54/number.txt"), {
    highWaterMark: 1, 
});
let numberIndex = 0;
function write() {
    let flag = true; // 是否可以写入
    while (flag && numberIndex < 10) {
        flag = ws2.write(numberIndex + "");
        numberIndex++;
    }
    if (numberIndex === 10) {
        ws2.end("!!");
    }
}
write();
ws2.on("drain", () => {
    console.log("ws2---drain--->");
    write();
});
ws2.on("close", () => {
    console.log("ws2---close--->");
});

目录
相关文章
|
6月前
|
存储 C++ iOS开发
C++ 文件和流
C++ 文件和流
41 0
|
缓存
55 # 实现可写流
55 # 实现可写流
42 0
|
6月前
|
程序员 C++ iOS开发
c++文件和流
c++文件和流
37 0
|
11月前
|
XML C# 数据格式
C#读取写入文件的三种方式
最近对文件的操作比较频繁。这里记录一下常用的几种文件读写的方式。 我这里使用窗体来做测试,例子在文末,可下载。
90 0
47 # 实现可读流
47 # 实现可读流
39 0
46 # 可读流 readStream
46 # 可读流 readStream
43 0
|
存储 Java
流及其相关操作
流及其相关操作
|
存储 iOS开发 C++
C++之I/0流操作(标准流、文件流、二进制操作等)
C++之I/0流操作(标准流、文件流、二进制操作等)
163 0
|
存储 Java
16 文件与流
16 文件与流
58 0
|
Java
I/O流常用复制和读写文件
I/O流常用复制和读写文件
122 0