Heim >Web-Frontend >js-Tutorial >Ein Artikel über Streams in Node
Was ist Flow? Wie versteht man den Fluss? Der folgende Artikel wird Ihnen ein tiefgreifendes Verständnis von Streams in Nodejs vermitteln. Ich hoffe, er wird Ihnen hilfreich sein!
Stream ist ein Stream, der als eine Reihe von Bytes verstanden werden kann, die wie ein Wasserfluss existieren. Gemäß der Erklärung des offiziellen Dokuments:
Ein Stream ist eine abstrakte Schnittstelle zum Arbeiten mit Streaming-Daten in der Node.js-Schnittstelle. Es gibt vier grundlegende Arten von Streams. In diesem Artikel werden hauptsächlich zwei davon vorgestellt: lesbare Streams und beschreibbare Streams.
Readable
readableStream
über fs.createReadStream()
erstellen. Der erste Parameter kann der zu lesende Wert sein. Der Dateipfad, z Der Inhalt der vorhandenen Datei test.txt lautet beispielsweise: hello juejin
]fs.createReadStream()
创建一个可读流 readableStream
,第 1 个参数可以是要读取的文件路径,比如现有文件 test.txt 内容为:
const fs = require('fs') const readableStream = fs.createReadStream('./test.txt', { start: 6, end: 11 })
第 2 个参数(可选)可以传入一个选项对象,用来控制读取数据的起止位置等: 【相关教程推荐:nodejs视频教程】
readableStream.on('data', data => { console.log(data) console.log(data.toString()) })
注意,读取的数据是包括了 start
和 end
的。 在之前介绍 events 模块时说过,所有的流都是 EventEmitter
的实例。所以获取数据是通过监听 'data'
事件:
const readableStream = fs.createReadStream('./test.txt', { start: 6, end: 11, highWaterMark: 2 // 默认为 64 * 1024 }) readableStream.on('data', data => { console.log(data) console.log(data.toString()) readableStream.pause() // 暂停读取 setTimeout(() => { readableStream.resume() // 恢复读取 }, 2000) })
打印结果如下,默认是 Buffer 对象,可以通过 toString()
方法转为字符串:
注意,读取数据时一次最多读取 64 * 1024 字节,如果想改变该数值,可以通过 highWaterMark
选项更改。另外还可以使用 pause()
进行暂停操作,使用 resume()
继续读取:
readableStream.on('data', data => console.log(data)) readableStream.on('open', fd => console.log(`${fd}文件打开了`)) readableStream.on('end', () => console.log('文件读取到 end 位置了')) readableStream.on('close', () => console.log('文件已关闭'))
执行结果如下:
除了 'data'
事件,可读流还有其它一些事件,比如监听文件被打开的 'open'
(回调会被传入 fd 参数),监听文件读取到 end
(默认为读取到最后)的 'end'
,监听文件关闭的 'close'
(文件读取完会自动关闭):
const writableStream = fs.createWriteStream('test.txt', { flags: 'a' }) writableStream.write('养成', err => console.log(`错误信息:${err}`)) // 错误信息:undefined writableStream.write('写作的') writableStream.end('好习惯')
打印结果如下:
使用 fs.createWriteStream()
可以创建可写流,第 1 个参数传入要写入的文件,第 2 个同样是用于配置的可选参数,这里我们将 flags
由表示覆盖写入的 'w'
改为 'a'
,即追加写入(如果还指定了写入的起始位置 start
,则为了兼容 windows 系统, flags
应该写成 'r+'
):
writableStream.on('close', () => { console.log('关闭') })
写入数据是通过 write
方法,上方代码执行的结果就是在原本的 "hello juejin" 后添加上了 "养成写作的好习惯"。最后一次写入可以使用 end
方法,这样就能监听到可写流的 'close'
事件了:
const readableStream = fs.createReadStream('./test.txt') const writableStream = fs.createWriteStream('./copy.txt') readableStream.pipe(writableStream)
否则,可写流需要手动 writableStream.close()
关闭才能监听到 'close'
事件。如果写入成功,则作为 write()/end()
的第 2 个参数传入的回调的 err
就为 undefined
。
可读流还有另外一些事件,比如文件打开时的 'open'
事件,当 close()
或 end()
被调用后文件写入完成的 'finish'
事件。
可读流与可写流可以通过 pipe
rrreee
start code> und enthalten <code>ende
. Als ich das Events-Modul vorstellte, habe ich das alles gesagt Streams sind Instanzen von EventEmitter
. Die Daten werden also durch Abhören des Ereignisses 'data'
erhalten: rrreee
Das Druckergebnis ist wie folgt, der Standardwert ist Buffer-Objekt kann über die Methode toString()
in einen String konvertiert werden:
highWaterMark
ändern. Darüber hinaus können Sie auch pause()
verwenden, um den Vorgang anzuhalten, und resume()
verwenden, um mit dem Lesen fortzufahren: 🎜rrreee🎜Die Ausführungsergebnisse lauten wie folgt: 🎜🎜 🎜🎜Ausgenommen 'data'
Ereignisse, lesbare Streams und andere Ereignisse, wie z. B. 'open'
, das das Öffnen von Dateien überwacht (der Rückruf wird in fd🎜 Parameter), überwachen Sie die Datei, die bis end
gelesen wird (der Standardwert ist bis zum Ende lesen) >'end', 'close'
, der das Schließen der Datei überwacht (die Datei wird nach dem Lesen automatisch geschlossen): 🎜rrreee🎜Das Druckergebnis ist wie folgt: 🎜🎜🎜🎜🎜 Beschreibbar (Beschreibbar)🎜🎜🎜Mit fs.createWriteStream()
kann der erste Parameter in der zu schreibenden Datei übergeben werden Wir werden flags
von 'w'
ändern, um das Überschreiben des Schreibens in 'a'
anzuzeigen, d. h. das Anhängen des Schreibens (wenn die Startposition des Schreibens wird auch start
angegeben, um mit Windows-Systemen kompatibel zu sein, flags
sollte als 'r+'
geschrieben werden): 🎜rrreee🎜Daten werden geschrieben ist durch write
Methode, das Ergebnis der Ausführung des obigen Codes ist das Hinzufügen von „Entwickeln Sie eine gute Gewohnheit des Schreibens“ nach dem ursprünglichen „Hallo Juejin“. Beim letzten Schreibvorgang kann die Methode end
verwendet werden, sodass das Ereignis 'close'
des beschreibbaren Streams überwacht werden kann: 🎜rrreee🎜 Andernfalls muss der beschreibbare Stream manuell erstellt werden WritableStream.close()
muss geschlossen sein, um das Ereignis 'close'
abzuhören. Wenn der Schreibvorgang erfolgreich ist, ist der err
des Rückrufs, der als zweiter Parameter von write()/end()
übergeben wird, undefiniert
. 🎜🎜Lesbare Streams haben auch andere Ereignisse, wie zum Beispiel das 'open'
-Ereignis, wenn eine Datei geöffnet wird, wenn close()
oder end()
Wird vom Ereignis 'finish'
aufgerufen, nachdem das Schreiben der Datei abgeschlossen ist. 🎜🎜🎜Verbindung von lesbaren Streams und beschreibbaren Streams🎜🎜🎜Lesbare Streams und beschreibbare Streams können über die pipe
-Methode zum Kopieren von Dateien verbunden werden: 🎜rrreee🎜Auf diese Weise können Sie den Text in ./ test.txt wird nach ./copy.txt kopiert. 🎜🎜Weitere Informationen zu Knoten finden Sie unter: 🎜nodejs-Tutorial🎜! 🎜Das obige ist der detaillierte Inhalt vonEin Artikel über Streams in Node. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!