実質的に使用して流れ(ストリーム)

:この記事はで再現された猿2048ウェブサイト➵ https://www.mk2048.com/blog/blog.php?id=hj1jbkaaaa

ディレクトリ

画像

ストリームは、 stream注文したバイトのデータ転送を開始し、終了で設定されていること、および良好な効率を持っています。イベントや、非ブロッキングI / Oライブラリで、解放されたときの時間を必要としない、その利用可能なダイナミックプロセス、フロー・モジュールを許します。
ストリームは stream Node.js.でストリーミングデータを処理するための抽象インタフェースです streamモジュールは、ストリームインタフェースオブジェクトを実装構築するため、以下の基本的なAPIを提供します。ストリームは、書き込み、または読み書きを、読み取ることができます。

基本的な使用

読み取り可能なストリーム

NodeJSでは、我々はコアモジュールに依存する必要がある文書の操作fsfsモジュールを統合しcreateReadStream、読み取りストリームを。

fs.createReadStream(path, options) パラメータは次のとおりです。

  • path :ファイルのパスを読みます

  • options:文字列(文字エンコーディングを指定する)|オブジェクト(以下に詳細に記載)

    • flags :「R」の旗、デフォルト
    • encoding :文字エンコーディングは、デフォルトはnullで、値がバッファを読みます
    • fd :ファイルディスクリプタは、デフォルトはnullです。
    • mode :許可ビット、デフォルトは0o666あります。
    • autoClose :自動的にシャットダウンするかどうかを読んだ後、デフォルトはtrueです
    • start :、ポジションを読んで起動し、デフォルト0
    • end :エンド位置、デフォルトの記事の最後
    • highWaterMark://最高水位、それぞれの番号を読み取ります。デフォルト:1024バイト* 64
  • 戻り値は次のとおりです。fs.ReadStream

読み込み可能なストリームを作成します。

// 引入依赖
let fs = require('fs')
let rs = fs.createReadStream('./readStream.txt', {
  // start: 0, // 开始读取位置,默认0
  end: 3, // 结束位置,默认文章读取完
  highWaterMark: 3, // 最多读取, 每次读取的个数 默认:64*1024 字节
})

イベントメカニズム読めるストリーム

次の例では./readStream.txt、ファイルの内容は以下のとおりです。1234567890

1.オープン

open ファイルを監視するために使用されるイベントが開かれ、コールバック関数は、ファイルを開いた後に実行されます。

// 引入依赖
let fs = require('fs')
let rs = fs.createReadStream('./readStream.txt', {
  start: 0,
  end: 3,
  highWaterMark: 3
})
// 事件机制,需要自己去监听一些数据
// open 文件打开
rs.on('open', () => {
  console.log('文件开启了')
})
// 结果:文件开启了
2.データ

dataイベント、各読み取りhighWaterMarkコールバック関数がそれぞれの内側に返さ読み込みが完了するまでのバイトはイベント後にトリガーされるが、結果を読み取ります。場合はencoding設定されていない、バッファを返します

// 引入依赖
let fs = require('fs')
let rs = fs.createReadStream('./readStream.txt', {
  // encoding: 'utf8',
  start: 0,
  end: 3,
  highWaterMark: 3
})
// 事件机制,需要自己去监听一些数据
// open 文件打开
rs.on('open', () => {
  console.log('文件开启了')
})
rs.on('data', (data) => {
  console.log(data)
})
// 如果不是设置encoding返回结果为
/** 文件开启了
 *<Buffer 31 32 33>
 * <Buffer 34>
 */
 
// 如果encoding: 'utf8'返回结果为
/** 文件开启了
 * 123
 * 4
 */
3.エンド

end ファイルを読み終えて、コールバックを実行すると、イベント、トリガ。

次のように読まれています:

  1. end設定値は(end: 3)、長さを読み取るトリガーに設定されています
  2. end 設定された値は、デフォルトでは、トリガのすべての内容を読み終えたされていません。

次の例の結果を表示容易にするために、我々は両方のケースを達成しました。

// 引入依赖
let fs = require('fs')
let rs = fs.createReadStream('./readStream.txt', {
  start: 0,
  // end: 3,
  highWaterMark: 3
})
// 事件机制,需要自己去监听一些数据
// open 文件打开
rs.on('open', () => {
  console.log('文件开启了')
})
rs.on('data', (data) => {
  console.log(data)
})
rs.on('end', () => {
  console.log('结束了')
})
// 设置了end: 3的运行结果
/** 文件开启了
 * <Buffer 31 32 33>
 * <Buffer 34>
 * 结束了
 */
 
// 没有设置end参数的运行结果
/** 文件开启了
 * <Buffer 31 32 33>
 * <Buffer 34 35 36>
 * <Buffer 37 38 39>
 * <Buffer 30>
 * 结束了
 */
4.エラー

error イベントリスナーのエラーメッセージ、コールバックが出張でファイルを読み込むときにトリガーされると、エラーメッセージを返します。

// error事件 出错时自动调用
rs.on('error', (err) => {
  console.log(err)
})
5.近いです

closeファイルを監視するために使用されるイベントは、ファイルが閉じられた後にコールバック関数が実行され、閉じられています。あなたが読めるストリームを作成するとautoClose: true(デフォルトはtrue)、自動的にファイル、およびトリガークローズcloseイベントコールバックを。

rs.on('close', () => {
  console.log('close')
})

一時停止と再開

流量またはサスペンド状態の二種類:読み取り可能なストリームは、2つの状態を有しています。

開始可読ストリームが状態を中断され、状態は、次のように流れるように切り替えることができます。

  • モニターdataイベント
  • コールfs.resume()方法

読み取り可能な流れは、以下のようにサスペンド状態に戻すことができます。

  • コールrs.pause()方法

私たちはそれを一時停止し、再開するために使用しますか?
  私たちはすべて我々が読み出しのすべては、私たちが見てみたいものではありませんコンテンツのためのスペースの多くを取るだろう場合に、特に大きなファイルは、読み込みが発生した場合、ファイルの内容を読み込むことは、スペースを取るだろうことを知って、私たちは、データの一部を読んで考えます処理が再び完全に読み込まれた後、それは、最大使用されます。

簡単な例

// 引入依赖
let fs = require('fs')
let rs = fs.createReadStream('./readStream.txt', {
  encoding: 'utf8', // 字符编码, 默认为null
  highWaterMark: 2
})
let i = 0

rs.on('data', (data) => {
  i ++
  console.log(`第 ${i} 次`, new Date());
  console.log(data)
  rs.pause() // 暂停
  setTimeout(() => {
    rs.resume() // 恢复
  }, 1000)
})
rs.on('end', () => {
  console.log('结束了')
})
// 第 1 次 2018-09-16T10:11:00.993Z
// 12
// 第 2 次 2018-09-16T10:11:01.996Z
// 34
// 第 3 次 2018-09-16T10:11:02.997Z
// 56
// 第 4 次 2018-09-16T10:11:03.997Z
// 78
// 第 5 次 2018-09-16T10:11:04.998Z
// 90
// 结束了

書き込み可能なストリーム

NodeJS、我々はコアモジュールに依存する必要がある文書の動作ではfsfsモジュールに統合createWriteStream読み取り可能ストリーム

fs.createWriteStream(path, options) パラメータは次のとおりです。

  • path :ファイルのパスを読みます

  • options:文字列(文字エンコーディングを指定する)|オブジェクト

    • flags :旗、デフォルトで 'w'
    • encoding :文字エンコーディング、デフォルト utf8
    • fd :ファイルディスクリプタは、デフォルトはnullです。
    • mode :許可ビット、デフォルトは0o666あります。
    • autoClose :自動的にシャットダウンするかどうか、デフォルトtrue
    • start :位置を読んで起動し、デフォルト0
    • highWaterMark :書き込みの数
  • 戻り値は次のとおりです。fs.WriteStream

書き込み可能なストリームを作成します。

writeStream.txtファイルは、ファイルの内容が書き込まれることを示しています

// 引入依赖
let fs = require('fs')
let ws = fs.createWriteStream('./writeStream.txt', {
  start: 0, // 开始读取位置,默认0
})

コンテンツおよびエンドを書きます

write対応するファイルに書き込みます。endこれは、パラメータの後ろにコンテンツがある場合、あなたはまた、ファイルに行くことができ、書き込み終了を表します。

// 引入依赖
let fs = require('fs')
let ws = fs.createWriteStream('./writeStream.txt', {
  start: 0, // 开始写入位置,默认0
})
ws.write('1') // 写内容
ws.end('写完了') // 结束

//结果为: 1写完了

イベントメカニズム書き込み可能なストリーム

イベント内の書き込み可能な流れopenclose比較的単純な手の込んだません。主について話すfinishdrainイベント。

1.終了イベント

呼び出されたときにws.end()バッファリング方法の後、データは基礎となるシステム、トリガに渡された'finish'イベント。

次のようにテストコードがあります:

// 引入依赖
let fs = require('fs')
let ws = fs.createWriteStream('./writeStream.txt', {
  start: 0, // 开始写入位置,默认0
})
ws.on('open', () => {
  console.log('open');
});
ws.write('1')
ws.end('写完了')
ws.on('finish', () => {
  console.log('所有写入已完成。');
});
ws.on('close', () => {
  console.error('close');
});

// 输出结果为:
// open
// 所有写入已完成。
// close
2.ドレンイベント

あなたが呼び出す場合ws.write(chunk)メソッドの戻りをfalse、コンテンツがバッファのサイズに到達するために書かれ、トリガー・drainイベント

let fs = require('fs')
let ws = fs.createdWriteStream('writeStream.txt', {
    start: 0,
    highWaterMark: 5
})

// 写入15个数,每次写五个,只希望占用五个字节的内存
let i = 0
function write() {
    let flag = true
    while(i < 15 && flag) {
        flag = ws.write(i++'','utf8')
    }
}
write() // 如果写入的内容到达缓存区的大小了,当他写入完成后会触发一个事件
ws.on('drain', () => {
    console.log('占满')
    write() //清空缓存 继续写入
})

// 占满
// 占满

読み書き可能な混合物

することでpipe、文書モードの内容を読んで、ファイルが別に書かれている[共通]

// 引入fs模块
const fs = require("fs");

// 创建可读流和可写流
let rs = fs.createReadStream("./ReadStream/readStream.txt", {
    highWaterMark: 3
});
let ws = fs.createWriteStream("./writeStream.txt", {
    highWaterMark: 2
});

// 将 readStream.txt 的内容通过流写入 writeStream.txt 中
rs.pipe(ws);

ソースコード付き

重要参照の理解、ビュー、デバッグコードを容易にするため、完全なソースコードは githubのを

概要

この記事ではNodeJsミッドストリーム(ストリーム)を理解するための基礎です。私は、流れが役割を果たして理解したいです。

パートIINodeJSフローと簡単な実装の原則- 「元のストリーム、真実の源」

著者:香ばしいです

あなたは未来が今自分自身の必死の努力で感謝します!

一連の記事のためのノードの基礎


より専門的なフロントエンドの知識、作る [2048] APE www.mk2048.comを

おすすめ

転載: www.cnblogs.com/dssx/p/11780539.html