>[success] # Writable -- 可写流
1. Node的`Writable`是可写流的抽象类,用于将数据写入一个目标文件或者网络连接等输出源
2. 常见提供api
| 方法名 | 描述 |
| --- | --- |
| write(chunk, \[encoding\], \[callback\]) | 向可写流中写入数据块,chunk为要写入的数据,encoding为数据的编码方式,callback为写入操作的回调函数。 |
| end(\[chunk\], \[encoding\], \[callback\]) | 写入数据并结束可写流的操作,可以传递数据块和编码方式。当写入操作完成后,会自动触发“finish”事件,callback函数会在此时执行。 |
| cork() | 在写入数据时启动缓存机制,可以提高写入效率。 |
| uncork() | 在缓存数据写入操作之前,手动刷新缓存并立即写入数据。 |
| setDefaultEncoding(encoding) | 设置默认的编码方式。 |
| destroy() | 中断可写流的操作,并触发“close”事件。 |
| on(event, listener) | 绑定事件监听器,如“close”、“error”、“finish”等事件。 |
| once(event, listener) | 一次性绑定事件监听器,在事件触发后自动解绑。 |
>[info] ## fs.createWriteStream(path\[, options\])
| 参数 | 类型 | 描述 | 默认值 |
| --- | --- | --- | --- |
| path | string \| Buffer \| URL | 文件路径或buffer或URL | 无 |
| options | string \| Object | 可选参数,可以是字符串或对象,定义写入的选项 | { flags: 'w', encoding: 'utf8', fd: null, mode: 0o666, autoClose: true, emitClose: true, start: undefined, fs: null } |
| options.flags | string | 文件系统标志 | 'w' |
| options.encoding | string | 字符编码 | 'utf8' |
| options.fd | integer \| FileHandle | 文件描述符,在打开文件的情况下使用 | null |
| options.mode | integer | 设置文件的权限,类似于chmod(2) | 0o666 |
| options.autoClose | boolean | 是否自动关闭文件流 | true |
| options.emitClose | boolean | 是否在关闭文件流时发出 'close' 事件 | true |
| options.start | integer | 写入文件的起始位置 | undefined |
| options.fs | Object \| null | 可自定义使用的 fs 模块实现 | null |
* 返回值可以使用的方法
`createWriteStream()`方法返回的是一个可写流对象,该对象具有以下常用方法:
* **write(chunk, \[encoding\], \[callback\])**: 写入数据到文件中,返回值为`Boolean`。 第一个参数chunk为写入的数据,可以是字符串或者二进制数据; 第二个参数encoding为指定字符编码格式。可选参数,如果省略则使用默认编码格式“UTF-8”; 第三个参数callback是写入操作完成后的回调函数,可选参数。如果写入操作失败则回调函数的第一个参数为Error对象,否则为null。
* **end(\[chunk\], \[encoding\], \[callback\])**:结束写入操作,返回值为`void`。第一个参数chunk为写入的数据,可以是字符串或者二进制数据; 第二个参数encoding为指定字符编码格式。可选参数,如果省略则使用默认编码格式“UTF-8”; 第三个参数callback是写入操作完成后的回调函数。
* **on(event, listener)**:监听可写流事件,返回值为`void`。event为事件名称,listener为事件处理函数。
| 方法 | 简介 |
| --- | --- |
| `.write()` | 向可写流中写入数据 |
| `.end()` | 结束写入操作 |
| `.on()` | 绑定事件处理函数 |
| `.emit()` | 触发指定的事件 |
| `.addListener()` | 添加事件监听器 |
| `event: 'close'` | 当写入流被关闭时触发 |
| `event: 'drain'` | 当底层的缓冲区变空时触发 |
| `event: 'error'` | 当流发生错误时触发 |
| `event: 'finish'` | 当流结束写入操作时触发 |
>[danger] ##### 案例
~~~
const fs = require('fs')
const writeStream = fs.createWriteStream('./a.txt', { flags: 'w', start: 10 })
// 写入内容
writeStream.write('aaaa')
writeStream.write('bbbb')
writeStream.write('我是水')
// 写入完成后关闭
writeStream.on('close', () => {
console.log('全部写入完毕')
})
//绑定事件监听
writeStream.on('drain', () => {
console.log('缓冲区已经被消耗,可以继续写入。')
})
writeStream.on('finish', () => {
console.log('文件写入完成!')
})
writeStream.on('error', (err) => {
console.log(`写入文件发生错误:${err.message}`)
})
// 写入后要告诉 系统写入完了可以关闭
// writeStream.end('最后写入内容');
// writeStream.close() 强制关闭
writeStream.end()
~~~
打印结果:
~~~
文件写入完成!
全部写入完毕
~~~
>[danger] ##### 注意如果你使用windows
* 如果你使用windows 运行系统问题导致,当你使用start 参数指定追加位置,要注意要使用'r+',不要使用'a+'
- 基础
- 什么是Node.js
- 理解 I/O 模型
- 理解node 中 I/O
- 对比node 和java 使用场景
- node 模块管理
- 内置模块 -- buffer
- 内置模块 -- fs
- fs -- 文件描述符
- fs -- 打开文件 api
- fs -- 文件读取 api
- fs -- 文件写入 api
- fs -- 创建目录 api
- fs -- 读取文件目录结构 api
- fs -- 文件状态(信息) api
- fs -- 删除文件/目录 api
- fs -- 重命名 api
- fs -- 复制文件 api
- 内置模块 -- events
- 内置模块 -- stream
- 可读流 -- Readable
- 可写流 -- Writable
- Duplex
- Transform
- 内置模块 -- http
- http -- 从客户端发起
- http -- 从服务端发起
- 内置模块 -- url
- 网络开发