Maison > Article > interface Web > Un article pour parler des streams dans Node
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 !
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
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
】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> 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'
:
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()
:
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 : 🎜🎜 🎜🎜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 : 🎜🎜🎜🎜🎜 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!