fs.createWriteStream创建可写流

2021-02-24  本文已影响0人  静昕妈妈芦培培

fs.createWriteStream(path[, options])#

options 还可以包括 start 选项,用于写入数据到文件开头之后的某个位置,允许的值在 [0, Number.MAX_SAFE_INTEGER] 的范围内。
若要修改文件而不是覆盖文件,则需要 flags 选项被设置为 r+ 而不是默认的 w
encoding 可以是能被 Buffer 接受的任何一种字符编码。

如果 autoClose 被设置为 true(默认的行为),则当 'error''finish' 事件时,文件描述符会被自动地关闭。 如果 autoClose 为 false,则即使发生错误,文件描述符也不会被关闭。 应用程序需要负责关闭它并确保没有文件描述符泄漏。

默认情况下,流被销毁之后不会触发 'close' 事件。 这与其他 Writable 流的默认设置是相反的。 设置 emitClose 选项为 true 可以更改此行为。

ReadStream 一样,如果指定了 fd,则 WriteStream 会忽略 path 参数,并且会使用指定的文件描述符。 这意味着不会触发 'open' 事件。 fd 必须是阻塞的,非阻塞的 fd 应该传给 net.Socket

如果 options 是字符串,则它指定字符编码。

例1:创建fs.WriteStream类的对象的时候,如果不传第二个参数,则默认options.flags为w,创建的可写流调用write方法写入数据的时候,会直接覆盖文件原所有的内容,
options.flags为'w',再设置start无效,因为没有意义,不管怎样写入的时候都会覆盖掉文件原内容

image.png
const fs = require('fs')

//创建可写流 fs.WriteStream 类的对象,继承自 <stream.Writable>
const writer = fs.createWriteStream('./a.txt', {
    //默认值为w, 通过调用writer.write方法写入数据的时候,会直接覆盖文件所有的内容,
    // 即会把文件之前的内容全部再删除,写入新的数据
    flags: 'w'
})


//写入数据到流
writer.write('aaa')

执行结果:


image.png

例2:如果要修改文件内容,而不是覆盖文件原内容,把options.flags设置为'r+',然后通过options.start设置从文件内容的哪个字节开始修改


image.png
const fs = require('fs')

const writer = fs.createWriteStream('./a.txt', {
    flags: 'r+', //如果要修改文件内容,而不是覆盖文件原有的所有内容,则设置flags为'r+'
    start: 24, //从文件内容的第24个字节开始修改
})

//写入数据到流
writer.write('适合去郊游,', 'utf8')
//再次向文件写入数据,会从当前位置开始写入
writer.write('咱们出发把!', 'utf8')

//关闭写入流,表明已没有数据要被写入可写流
writer.end()

执行结果:


image.png

例3:如果要把内容追加到文件原有的内容的后面,则设置flags为'a',此时设置start无效


image.png
const fs = require('fs')

const writer = fs.createWriteStream('./a.txt', {
    flags: 'a', //如果要把内容追加到文件原有的内容的后面,则设置flags为'a',此时设置start无效
})

//写入数据到流
writer.write(',适合去郊游,', 'utf8')
//再次向文件写入数据,会从当前位置开始写入
writer.write('咱们出发把!', 'utf8')

//关闭写入流,表明已没有数据要被写入可写流
writer.end()

writer.on('open', () => {
    console.log('文件已被打开', writer.pending)
})
writer.on('ready', () => {
    console.log('文件已为写入准备好', writer.pending)
})
writer.on('close', () => {
    console.log('文件已被关闭')
    console.log("总共写入了%d个字节", writer.bytesWritten)
    console.log('写入的文件路径是'+ writer.path)
})


执行结果:


image.png
image.png
上一篇下一篇

猜你喜欢

热点阅读