Maison  >  Article  >  interface Web  >  Un article pour parler des streams dans Node

Un article pour parler des streams dans Node

青灯夜游
青灯夜游avant
2023-02-27 19:17:441528parcourir

Qu'est-ce que le flux ? Comment comprendre le flux ? L'article suivant vous donnera une compréhension approfondie des flux dans Nodejs. J'espère qu'il vous sera utile !

Un article pour parler des streams dans Node

stream est un flux, qui peut être compris comme une série d'octets qui existent comme un flux d'eau. Selon l'explication du document officiel :

Un flux est une interface abstraite pour travailler avec des données en streaming dans l'interface Node.js. Il existe 4 types de flux de base, et cet article en présente principalement deux : les flux lisibles et les flux inscriptibles.

Readable

Nous pouvons créer un flux lisible readableStream via fs.createReadStream(), le premier paramètre peut être la valeur à lire Le chemin du fichier, par exemple Par exemple, le contenu du fichier test.txt existant est :
hello juejin

Le deuxième paramètre (facultatif) peut être passé dans un objet option pour contrôler les positions de début et de fin de lecture des données, etc. : [Recommandations du didacticiel associées : tutoriel vidéo nodejs

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())
})

注意,读取的数据是包括了 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)
})

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

Un article pour parler des streams dans 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('文件已关闭'))

执行结果如下:

Un article pour parler des streams dans 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('好习惯')

打印结果如下:

Un article pour parler des streams dans Node

可写的(Writable)

使用 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' 事件。

可读流与可写流的连接

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

Notez que les données lues incluent start code> et <code>fin. Quand j'ai présenté le module events

, j'ai dit que tous Les flux sont des instances de EventEmitter. Les données sont donc obtenues en écoutant l'événement 'data' :

rrreee

Le résultat de l'impression est le suivant, la valeur par défaut est L'objet Buffer peut être converti en chaîne via la méthode toString() :

Un article pour parler des streams dans Node🎜🎜Notez que lors de la lecture des données, un maximum de 64 * 1024 mots peuvent être lus à la fois, si vous souhaitez modifier cette valeur, vous pouvez la modifier via l'option highWaterMark. De plus, vous pouvez également utiliser pause() pour mettre l'opération en pause, et utiliser resume() pour continuer la lecture : 🎜rrreee🎜Les résultats de l'exécution sont les suivants : 🎜🎜 Un article pour parler des streams dans Node🎜🎜Sauf 'data' Événements, flux lisibles et autres événements, tels que 'open' qui surveille les fichiers en cours d'ouverture (le rappel sera transmis dans paramètre fd🎜), surveillez le fichier lu jusqu'à fin (la valeur par défaut est pour lire jusqu'au bout) >'end', 'close' qui surveille la fermeture du fichier (le fichier sera fermé automatiquement après lecture) : 🎜rrreee🎜Le résultat de l'impression est le suivant : 🎜🎜Un article pour parler des streams dans Node🎜🎜🎜 Writable (Writable)🎜🎜🎜Utiliser fs.createWriteStream() peut créer un flux inscriptible. Le premier paramètre est passé dans le fichier à écrire. Le deuxième paramètre est également un paramètre facultatif pour la configuration. nous allons flags passer de 'w' indiquant l'écrasement de l'écriture à 'a', c'est-à-dire ajouter l'écriture (si la position de départ de l'écriture est également spécifié start, afin d'être compatible avec les systèmes Windows, flags doit être écrit sous la forme 'r+') : 🎜rrreee🎜Ecriture des données est via la méthode write, le résultat de l'exécution du code ci-dessus est d'ajouter "Développer une bonne habitude d'écrire" après le "bonjour juejin" original. La dernière écriture peut utiliser la méthode end, afin que l'événement 'close' du flux inscriptible puisse être surveillé : 🎜rrreee🎜 Sinon, le flux inscriptible doit être manuellement WritableStream.close() doit être fermé pour écouter l'événement 'close'. Si l'écriture réussit, le err du rappel passé comme deuxième paramètre de write()/end() sera undefined. 🎜🎜Les flux lisibles ont également d'autres événements, tels que l'événement 'open' lorsqu'un fichier est ouvert, lorsque close() ou end() Appelé par l'événement 'finish' une fois l'écriture du fichier terminée. 🎜🎜🎜Connexion des flux lisibles et des flux inscriptibles🎜🎜🎜Les flux lisibles et les flux inscriptibles peuvent être connectés via la méthode pipe pour copier des fichiers : 🎜rrreee🎜De cette façon, vous pouvez Le texte dans ./ test.txt est copié dans ./copy.txt. 🎜🎜Pour plus de connaissances sur les nœuds, veuillez visiter : 🎜tutoriel Nodejs🎜 ! 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer