>[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
- 網絡開發