Latest web development tutorials

Node.js สตรีม (สตรีม)

สตรีมเป็นอินเตอร์เฟซนามธรรมโหนดมีวัตถุจำนวนมากใช้อินเตอร์เฟซนี้ ยกตัวอย่างเช่นเซิร์ฟเวอร์ที่ริเริ่มการร้องขอสำหรับการร้องขอ HTTP วัตถุที่เป็นสตรีมเช่นเดียวกับ stdout (ออกมาตรฐาน)

Node.js, สตรีมมีสี่ประเภทของการไหลคือ:

  • อ่าน - การดำเนินงานที่สามารถอ่านได้

  • เขียนได้ - เขียนงาน

  • เพล็กซ์ - การอ่านและเขียน

  • Transform - ข้อมูลการดำเนินงานที่จะเขียนแล้วอ่านออกผล

วัตถุทั้งหมดอยู่ในกรณีของ EventEmitter สตรีม เหตุการณ์ที่พบบ่อย ได้แก่ :

  • ข้อมูล - เรียกเมื่ออ่านข้อมูลเวลา

  • สิ้น - ไม่เรียกข้อมูลที่อ่านได้มากขึ้น

  • ข้อผิดพลาด - เรียกเมื่อเกิดข้อผิดพลาดในการรับและการเขียน

  • เสร็จ - ไฟไหม้เมื่อข้อมูลทั้งหมดได้รับการเขียนไปยังระบบพื้นฐาน

กวดวิชานี้จะแนะนำการดำเนินงานกระแสที่พบบ่อย


อ่านข้อมูลจากกระแส

สร้างไฟล์ input.txt ดังต่อไปนี้:

本教程官网地址:www.w3big.com

สร้างไฟล์ main.js ดังต่อไปนี้:

var fs = require("fs");
var data = '';

// 创建可读流
var readerStream = fs.createReadStream('input.txt');

// 设置编码为 utf8。
readerStream.setEncoding('UTF8');

// 处理流事件 --> data, end, and error
readerStream.on('data', function(chunk) {
   data += chunk;
});

readerStream.on('end',function(){
   console.log(data);
});

readerStream.on('error', function(err){
   console.log(err.stack);
});

console.log("程序执行完毕");

รหัสข้างต้นจะถูกดำเนินการดังต่อไปนี้:

程序执行完毕
本教程官网地址:www.w3big.com

กระแสเขียน

สร้างไฟล์ main.js ดังต่อไปนี้:

var fs = require("fs");
var data = '本教程官网地址:www.w3big.com';

// 创建一个可以写入的流,写入到文件 output.txt 中
var writerStream = fs.createWriteStream('output.txt');

// 使用 utf8 编码写入数据
writerStream.write(data,'UTF8');

// 标记文件末尾
writerStream.end();

// 处理流事件 --> data, end, and error
writerStream.on('finish', function() {
    console.log("写入完成。");
});

writerStream.on('error', function(err){
   console.log(err.stack);
});

console.log("程序执行完毕");

ข้อมูลโปรแกรมดังกล่าวข้างต้นจะถูกเขียนไปตัวแปรแฟ้มข้อมูล Output.txt ผลการเรียกใช้โค้ดมีดังนี้

$ node main.js 
程序执行完毕
写入完成。

Output.txt ดูเนื้อหาของแฟ้ม:

$ cat output.txt 
本教程官网地址:www.w3big.com

การไหลของท่อส่ง

ท่อส่งให้กลไกสำหรับการสตรีมใส่ไหลขาออก เรามักจะใช้เพื่อให้ได้ข้อมูลและถ่ายโอนข้อมูลไปยังสตรีมอื่นจากกระแส

ดังแสดงในภาพข้างบนเราเมื่อเทียบกับถังเอกสารเต็มไปด้วยน้ำและน้ำเป็นเนื้อหาของเอกสารเพื่อให้เราเชื่อมต่อสองถังน้ำจากถังลงไปในถังอื่น ๆ ที่มีท่อ (ท่อ) ดังนั้น ช้าตระหนักถึงกระบวนการจำลองไฟล์ที่มีขนาดใหญ่

ตัวอย่างต่อไปนี้เราต้องการที่จะเขียนไปยังแฟ้มอื่นโดยการอ่านเนื้อหาของไฟล์และเนื้อหาที่

การตั้งค่า input.txt เอกสารอ่านดังนี้

本教程官网地址:www.w3big.com
管道流操作实例

สร้างไฟล์ main.js ดังต่อไปนี้:

var fs = require("fs");

// 创建一个可读流
var readerStream = fs.createReadStream('input.txt');

// 创建一个可写流
var writerStream = fs.createWriteStream('output.txt');

// 管道读写操作
// 读取 input.txt 文件内容,并将内容写入到 output.txt 文件中
readerStream.pipe(writerStream);

console.log("程序执行完毕");

ผลการเรียกใช้โค้ดมีดังนี้

$ node main.js 
程序执行完毕

Output.txt ดูเนื้อหาของแฟ้ม:

$ cat output.txt 
本教程官网地址:www.w3big.com
管道流操作实例

การไหลของห่วงโซ่

เชนเป็นอีกหนึ่งกระแสที่ไหลและสร้างหลายกระแสห่วงโซ่กลไกการดำเนินงานโดยการเชื่อมต่อการส่งออก กระแสห่วงโซ่ใช้โดยทั่วไปสำหรับการดำเนินงานท่อ

ต่อไปเรามีท่อและห่วงโซ่การบีบอัดและขยายไฟล์

สร้างไฟล์ compress.js ดังต่อไปนี้:

var fs = require("fs");
var zlib = require('zlib');

// 压缩 input.txt 文件为 input.txt.gz
fs.createReadStream('input.txt')
  .pipe(zlib.createGzip())
  .pipe(fs.createWriteStream('input.txt.gz'));
  
console.log("文件压缩完成。");

ผลการเรียกใช้โค้ดมีดังนี้

$ node compress.js 
文件压缩完成。

หลังจากการดำเนินการดำเนินการข้างต้นเราจะเห็นไดเรกทอรีปัจจุบันสร้างขึ้นภายใต้การบีบอัดไฟล์ input.txt input.txt.gz

ถัดไปให้แกะไฟล์สร้างไฟล์ decompress.js ดังต่อไปนี้:

var fs = require("fs");
var zlib = require('zlib');

// 解压 input.txt.gz 文件为 input.txt
fs.createReadStream('input.txt.gz')
  .pipe(zlib.createGunzip())
  .pipe(fs.createWriteStream('input.txt'));
  
console.log("文件解压完成。");

ผลการเรียกใช้โค้ดมีดังนี้

$ node decompress.js 
文件解压完成。