Maison > interface Web > js tutoriel > Une analyse approfondie du flux de fichiers dans node.js

Une analyse approfondie du flux de fichiers dans node.js

青灯夜游
Libérer: 2021-11-23 17:58:20
avant
2282 Les gens l'ont consulté

Cet article analysera le flux de fichiers dans Nodejs J'espère qu'il vous sera utile !

Une analyse approfondie du flux de fichiers dans node.js

Flux de fichiers

En raison des différentes vitesses de lecture et de stockage et des différentes capacités des différents supports dans l'ordinateur, une partie peut être dans un état d'attente à long terme pendant l'opération

Il existe trois principaux types de fichiers flux, à savoir Flux d'entrée (Readable) , Flux de sortie (Writeable) , Flux duplex (Duplex) . Il existe un autre type de flux qui n'est pas couramment utilisé, à savoir Transform stream (Transform)转换流(Transform)

node 中提供了 stream 模块,这个模块中有两个类实例:Readable 和 Writable,流中都会继承这两个类,因此会有很多共同的方法等。

可读流(Readable)

输入流:数据从源头流向内存,把磁盘里面的数据传输到内存里面。

createReadStream

fs.createReadStream(路径, 配置)

在配置里面有:encoding(编码方式)、start(起始读取字节)、end(结束读取字节)、highWaterMark(每次读取量)

highWaterMark:如果encoding有值,该数量表示一个字符数;如果encoding为null,该数量表示字节数

返回一个Readable的子类ReadStream

const readable = fs.createReadStream(filename, { encoding: 'utf-8', start: 1, end: 2, // highWaterMark: });

注册事件

readable.on(事件名,处理函数)

readable.on('open', (err, data)=> {
    // console.log(err);
    console.log('文件打开了');
})

readable.on('error', (data, err) => {
    console.log(data, err);
    console.log('读取文件发生错误');
})

readable.on('close', (data, err) => {
    // console.log(data, err);
    console.log('文件关闭');
})

readable.close() // 手动触发通过 readable.close()或者在文件读取完毕之后自动关闭--autoClose配置项默认为 true

readable.on('data', (data) => {
    console.log(data);
    console.log('文件正在读取');
})

readable.on('end', ()=>{
    console.log('文件读取完毕');
})
Copier après la connexion

暂停读取

readable.pause() 暂停读取,会触发 pause 事件

恢复读取

readable.resume() 恢复读取,会触发 resume 事件

可写流

const ws = fs.createWriteStream(filename[, 配置])

ws.write(data)

写入一个数据,data 可以使字符串也可以是Buffer,返回一个布尔值。

如果返回的是 true 表示写入通道没有被占满,接下来的数据可以直接写入,写入通道就是配置中的 highWaterMark 表示的大小。

如果返回的是false 表示写入通道占满,其余字符开始等待,出现背压情况。

const ws = fs.createWriteStream(filename, {
    encoding: 'utf-8',
    highWaterMark: 2
})

const flag = ws.write('刘');
console.log(flag); // false 
这里虽然只会执行一次,但是在通道有空余空间的时候就会继续写入,并不在返回 值。

ws.write() 只会返回一次值。


const flag = ws.write('a');
console.log(flag);
const flag1 = ws.write('a');
console.log(flag1);
const flag2 = ws.write('a');
console.log(flag2);
const flag3 = ws.write('a');
console.log(flag3);

输出顺序:true、false、false、false

第二次写入的时候已经占了两字节,第三次写入后直接占满了,所以返回false
Copier après la connexion

使用流复制粘贴文件,并解决背压问题

const filename = path.resolve(__dirname, './file/write.txt');
const wsfilename = path.resolve(__dirname, './file/writecopy.txt');

const ws = fs.createWriteStream(wsfilename);
const rs = fs.createReadStream(filename)

rs.on('data', chumk => {
    const falg = ws.write(chumk);
    if(!falg) {
        rs.pause();
    }
})

ws.on('drain', () => {
    rs.resume();
})

rs.on('close', () => {
    ws.end();
    console.log('copy end');
})
Copier après la connexion

pipe

使用 pipe 也可以直接将 可读流 和 写入流串联起来,也可以解决背压问题

rs.pipe(ws);

rs.on('close', () => {
    ws.end();
    console.log('copy end');
})
Copier après la connexion

学习下来,感觉文件流在大量文件读写的时候是很方便的,并且可以做到快速高效,相比于writeFilereadFile

qui fournit le module stream dans

node. Il y a deux instances de classe dans ce module : Readable et Writable, qui sont tous deux hérités par le flux. Ces deux classes auront donc de nombreuses méthodes communes, etc.

Flux lisible (Readable)🎜

🎜Flux d'entrée : les données circulent de la source vers la mémoire, transférant les données du disque vers la mémoire. 🎜

createReadStream

🎜fs.createReadStream(path, configuration)🎜🎜Dans la configuration il y a : encoding (méthode d'encodage), start ( start start lecture des octets), end (fin de la lecture des octets), highWaterMark (montant lu à chaque fois) 🎜🎜highWaterMark : Si l'encodage a une valeur, le nombre représente un nombre de caractères si l'encodage est nul, le nombre représente les octets Number🎜🎜 ; Renvoie une sous-classe Readable ReadStream🎜
🎜const readable = fs.createReadStream(filename, { encodage : 'utf-8', début : 1, fin : 2, //marque d'eau élevée : });🎜
🎜🎜Enregistrer l'événement🎜🎜🎜readable.on(nom de l'événement, fonction du gestionnaire)🎜rrreee🎜🎜Pause de lecture🎜🎜🎜readable.pause() Pause de lecture, l'événement de pause sera déclenché🎜🎜 🎜Reprendre la lecture🎜🎜🎜readable.resume() Reprendre la lecture, l'événement de reprise sera déclenché🎜

🎜Writable stream🎜

🎜const ws = fs . createWriteStream(filename[, configuration])🎜

ws.write(data)

🎜Écrivez une donnée, les données peuvent être une chaîne ou un tampon, renvoie une valeur booléenne. 🎜🎜Si true est renvoyé, cela signifie que le canal d'écriture n'est pas plein et que les données suivantes peuvent être écrites directement. Le canal d'écriture a la taille représentée par highWaterMark dans la configuration. 🎜🎜Si false est renvoyé, cela signifie que le canal d'écriture est plein et que les caractères restants commencent à attendre, provoquant une contre-pression. 🎜rrreee🎜Utilisez des flux pour copier et coller des fichiers et résoudre le problème de contre-pression🎜rrreee🎜🎜pipe🎜🎜🎜En utilisant pipe, vous pouvez également connecter directement le flux lisible et le flux d'écriture en série, et vous pouvez également résoudre le problème de contre-pression 🎜rrreee🎜Apprenez-le, je pense que le streaming de fichiers est très pratique lors de la lecture et de l'écriture d'un grand nombre de fichiers, et cela peut être fait rapidement et efficacement par rapport à writeFile et readFilecode>, il est beaucoup plus efficace et peut être traité correctement. Il n'y aura pas de gros blocages. 🎜🎜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!

Étiquettes associées:
source:juejin.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal