Heim > Web-Frontend > js-Tutorial > Hauptteil

Ein Artikel über Streams in Node

青灯夜游
Freigeben: 2023-02-27 19:18:48
nach vorne
1550 Leute haben es durchsucht

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!

Ein Artikel über Streams in Node

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

Wir können einen lesbaren Stream 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
Nach dem Login kopieren

Der zweite Parameter (optional) kann in einem Optionsobjekt übergeben werden, um die Start- und Endpositionen von Lesedaten usw. zu steuern: [Verwandte Tutorial-Empfehlungen: nodejs Video-Tutorial

]fs.createReadStream() 创建一个可读流 readableStream,第 1 个参数可以是要读取的文件路径,比如现有文件 test.txt 内容为:

const fs = require('fs')

const readableStream = fs.createReadStream('./test.txt', {
  start: 6,
  end: 11
})
Nach dem Login kopieren

第 2 个参数(可选)可以传入一个选项对象,用来控制读取数据的起止位置等: 【相关教程推荐:nodejs视频教程

readableStream.on('data', data => {
  console.log(data)
  console.log(data.toString())
})
Nach dem Login kopieren

注意,读取的数据是包括了 startend 的。 在之前介绍 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)
})
Nach dem Login kopieren

打印结果如下,默认是 Buffer 对象,可以通过 toString() 方法转为字符串:

Ein Artikel über Streams in Node

注意,读取数据时一次最多读取 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('文件已关闭'))
Nach dem Login kopieren

执行结果如下:

Ein Artikel über Streams in Node

除了 '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('好习惯')
Nach dem Login kopieren

打印结果如下:

Ein Artikel über Streams in Node

可写的(Writable)

使用 fs.createWriteStream() 可以创建可写流,第 1 个参数传入要写入的文件,第 2 个同样是用于配置的可选参数,这里我们将 flags 由表示覆盖写入的 'w' 改为 'a',即追加写入(如果还指定了写入的起始位置 start,则为了兼容 windows 系统, flags 应该写成 'r+'):

writableStream.on('close', () => {
  console.log('关闭')
})
Nach dem Login kopieren

写入数据是通过 write 方法,上方代码执行的结果就是在原本的 "hello juejin" 后添加上了 "养成写作的好习惯"。最后一次写入可以使用 end 方法,这样就能监听到可写流的 'close' 事件了:

const readableStream = fs.createReadStream('./test.txt')
const writableStream = fs.createWriteStream('./copy.txt')

readableStream.pipe(writableStream)
Nach dem Login kopieren

否则,可写流需要手动 writableStream.close() 关闭才能监听到 'close' 事件。如果写入成功,则作为 write()/end() 的第 2 个参数传入的回调的 err 就为 undefined

可读流还有另外一些事件,比如文件打开时的 'open' 事件,当 close()end() 被调用后文件写入完成的 'finish' 事件。

可读流与可写流的连接

可读流与可写流可以通过 piperrreee

Beachten Sie, dass die gelesenen Daten 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: Ein Artikel über Streams in Node

🎜Beachten Sie, dass beim Lesen von Daten Es können maximal 64 * 1024 Wörter gleichzeitig gelesen werden. Abschnitt: Wenn Sie diesen Wert ändern möchten, können Sie ihn über die Option 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: 🎜🎜 Ein Artikel über Streams in Node🎜🎜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: 🎜🎜Ein Artikel über Streams in Node🎜🎜🎜 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!

Verwandte Etiketten:
Quelle:juejin.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage