この記事では Nodejs のファイル フローを分析します。皆さんのお役に立てれば幸いです。
コンピュータ内のさまざまなメディアには読み取り速度や保存速度、容量が異なるため、いずれかのメディアに長期的な問題が発生する可能性があります。待機状態
ファイル ストリームには、入力ストリーム (読み取り可能) 、出力ストリーム (書き込み可能) 、 の 3 つの主なタイプがあります。二重ストリーム (二重) 。一般的には使用されない別のタイプのストリームがあります。これは、Transform ストリーム (Transform)
であり、node にストリーム モジュールを提供します。このモジュール: Readable と Writable、これら 2 つのクラスはストリーム内で継承されるため、多くの共通メソッドが存在します。
入力ストリーム: データはソースからメモリに流れ、ディスク内のデータがメモリに転送されます。
fs.createReadStream(path,configuration)
設定には、encoding (エンコード方法)、start (バイトの読み取り開始) があります。 )、end (読み取りバイトの終わり)、highWaterMark (各読み取りの量)
highWaterMark: エンコーディングに値がある場合、この数値は文字数を表し、エンコーディングが null の場合、この数値は文字数を表します。文字数 セクション数
Readable サブクラス ReadStream
const readable = fs.createReadStream(filename, { エンコーディング: 'utf-8'、 開始: 1、 終わり: 2、 // ハイウォーターマーク: });
イベントの登録
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('文件读取完毕'); })
読み取りを一時停止
readable.pause() 読書を一時停止し、一時停止イベントをトリガーします。
読書を再開します。
readable.resume() 読書を再開します。イベントを再開
##const ws = fs.createWriteStream(filename[,configuration])# #ws.write (data)
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
ストリームを使用してファイルをコピーして貼り付け、バック プレッシャーの問題を解決する
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'); })
パイプを使用すると、ストリームを直接読み書きすることもできます連続ストリーミングはバック プレッシャーの問題も解決できます
rs.pipe(ws); rs.on('close', () => { ws.end(); console.log('copy end'); })
学習後、ファイル ストリーミングは大量のファイルの読み書きを行う場合に非常に便利で、迅速かつ効率的に行うことができると感じました。 ##writeFile
とreadFile ははるかに効率的であり、正しく処理されれば大きなブロックは発生しません。
ノード関連の知識の詳細については、
nodejs チュートリアル
以上がNode.js のファイル フローの詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。