ホームページ  >  記事  >  ウェブフロントエンド  >  Node.js のファイル フローの詳細な分析

Node.js のファイル フローの詳細な分析

青灯夜游
青灯夜游転載
2021-11-19 19:19:332257ブラウズ

この記事では Nodejs のファイル フローを分析します。皆さんのお役に立てれば幸いです。

Node.js のファイル フローの詳細な分析

ファイル ストリーム

コンピュータ内のさまざまなメディアには読み取り速度や保存速度、容量が異なるため、いずれかのメディアに長期的な問題が発生する可能性があります。待機状態

ファイル ストリームには、入力ストリーム (読み取り可能) 出力ストリーム (書き込み可能) の 3 つの主なタイプがあります。二重ストリーム (二重) 。一般的には使用されない別のタイプのストリームがあります。これは、Transform ストリーム (Transform)

であり、node にストリーム モジュールを提供します。このモジュール: Readable と Writable、これら 2 つのクラスはストリーム内で継承されるため、多くの共通メソッドが存在します。

読み取り可能ストリーム (Readable)

入力ストリーム: データはソースからメモリに流れ、ディスク内のデータがメモリに転送されます。

createReadStream

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');
})

pipe

パイプを使用すると、ストリームを直接読み書きすることもできます連続ストリーミングはバック プレッシャーの問題も解決できます

rs.pipe(ws);

rs.on('close', () => {
    ws.end();
    console.log('copy end');
})

学習後、ファイル ストリーミングは大量のファイルの読み書きを行う場合に非常に便利で、迅速かつ効率的に行うことができると感じました。 ##writeFile

readFile ははるかに効率的であり、正しく処理されれば大きなブロックは発生しません。 ノード関連の知識の詳細については、nodejs チュートリアル

を参照してください。 !

以上がNode.js のファイル フローの詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。