Artikel ini akan menganalisis aliran fail dalam Nodejs Saya harap ia akan membantu anda!
Disebabkan oleh kelajuan bacaan dan storan yang berbeza serta kapasiti berbeza pelbagai media dalam komputer, salah satu daripadanya mungkin wujud untuk jangka masa yang lama semasa operasi, terdapat tiga jenis status menunggu utama
strim fail, iaitu Strim Input (Boleh Dibaca) , Strim Keluaran (Boleh Tulis) , Dupleks strim (Dupleks) . Terdapat satu lagi jenis strim yang tidak biasa digunakan, iaitu, 转换流(Transform)
menyediakan modul strim dalam nod Terdapat dua kejadian kelas dalam modul ini: Boleh Dibaca dan Boleh Ditulis, yang akan diwarisi oleh dua kelas, jadi akan ada banyak kaedah biasa, dsb.
Strim input: Data mengalir dari sumber ke memori, memindahkan data dari cakera ke memori.
fs.createReadStream(路径, 配置)
Dalam konfigurasi terdapat: pengekodan (kaedah pengekodan), mula (mula membaca bait), tamat (akhir bacaan bait) ), highWaterMark (setiap jumlah yang dibaca)
highWaterMark: Jika pengekodan mempunyai nilai, nombor itu mewakili bilangan aksara; ReadStream
const readable = fs.createReadStream(nama fail, { pengekodan: 'utf-8', mula: 1, tamat: 2, // highWaterMark: });Daftar acara
readable.on (nama acara, fungsi pengendali)
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('文件读取完毕'); })
readable.pause() untuk menjeda bacaan, yang akan mencetuskan acara jeda
untuk menyambung semula bacaanreadable.resume( ) untuk menyambung semula Pembacaan akan mencetuskan acara resume
Strim boleh tulisws.write(data)
Jika benar dikembalikan, ini bermakna saluran tulis tidak penuh, dan data seterusnya boleh ditulis terus Saluran tulis ialah saiz yang diwakili oleh highWaterMark dalam konfigurasi.
Jika palsu dikembalikan, ini bermakna saluran penulisan penuh, dan aksara yang tinggal mula menunggu, menyebabkan tekanan belakang.
Gunakan strim untuk menyalin dan menampal fail dan menyelesaikan masalah tekanan belakangconst 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
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'); })
Gunakan paip untuk juga terus menyalin boleh dibaca fail Menyambung strim dan strim tulis secara bersiri juga boleh menyelesaikan masalah tekanan belakang
Selepas belajar, saya rasa strim fail sangat mudah apabila membaca dan menulis sejumlah besar fail, dan ia boleh dilakukan dengan cepat dan cekap Berbanding dengan Kecekapanrs.pipe(ws); rs.on('close', () => { ws.end(); console.log('copy end'); })
jauh lebih tinggi, dan tidak akan ada sekatan besar jika dikendalikan dengan betul. writeFile
readFile
Untuk lebih banyak pengetahuan berkaitan nod, sila lawati:
Atas ialah kandungan terperinci Analisis mendalam aliran fail dalam node.js. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!