Node.js 스트림


Stream은 추상 인터페이스이며 Node의 많은 객체가 이 인터페이스를 구현합니다. 예를 들어, http 서버에 대한 요청을 시작하는 요청 개체는 Stream이자 stdout(표준 출력)입니다.

Node.js, Stream에는 네 가지 스트림 유형이 있습니다.

  • Readable - 읽기 가능한 작업입니다.

  • Writable - 쓰기 가능한 작업입니다.

  • Duplex - 읽기 및 쓰기 작업

  • Transform - 작업은 데이터를 쓴 다음 결과를 읽습니다.

모든 Stream 객체는 EventEmitter의 인스턴스입니다. 일반적으로 사용되는 이벤트는 다음과 같습니다.

  • data - 읽을 데이터가 있을 때 트리거됩니다.

  • end - 더 이상 읽을 데이터가 없을 때 트리거됩니다.

  • error - 수신 및 쓰기 중에 오류가 발생할 때 트리거됩니다.

  • finish - 모든 데이터가 기본 시스템에 기록되면 트리거됩니다.

이 튜토리얼에서는 일반적으로 사용되는 스트림 작업을 소개합니다.


스트림에서 데이터 읽기

다음 내용으로 input.txt 파일을 만듭니다.

php中文网官网地址:www.php.cn

다음 코드로 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("程序执行完毕");

위 코드의 실행 결과는 다음과 같습니다.

程序执行完毕
php中文网官网地址:www.php.cn

Write to the stream

다음 코드를 사용하여 main.js 파일을 만듭니다.

var fs = require("fs");
var data = 'php中文网官网地址:www.php.cn';

// 创建一个可以写入的流,写入到文件 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("程序执行完毕");

위 프로그램은 data 변수의 데이터를 output.txt 파일에 씁니다. 코드 실행 결과는 다음과 같습니다.

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

output.txt 파일의 내용 보기:

$ cat output.txt 
php中文网官网地址:www.php.cn

Pipe flow

Pipeline은 출력 흐름에서 입력 스트림으로의 메커니즘을 제공합니다. 일반적으로 우리는 이를 사용하여 한 스트림에서 데이터를 가져와 다른 스트림으로 데이터를 전달합니다.


250.png

위 사진과 같이 파일을 물이 담긴 양동이에 비유했는데, 물이 파일의 내용물입니다. 물이 하나의 양동이에서 흘러나오도록 두 개의 양동이를 연결하는 것이 물입니다. 버킷으로 이동하여 대용량 파일의 복사 프로세스를 천천히 실현합니다.

다음 예에서는 파일의 내용을 읽고 그 내용을 다른 파일에 씁니다.

input.txt 파일의 내용을 다음과 같이 설정하세요.

php中文网官网地址:www.php.cn
管道流操作实例

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 
程序执行完毕

출력 내용 보기 .txt 파일:

$ cat output.txt 
php中文网官网地址:www.php.cn
管道流操作实例

Chain flow

체인은 출력 스트림을 다른 스트림에 연결하고 각 스트림에 여러 작업 체인을 생성하는 메커니즘입니다. 연결된 흐름은 일반적으로 파이프라인 작업에 사용됩니다.

다음으로 파이프와 체인을 사용하여 파일을 압축하고 압축을 풀겠습니다.

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.gz를 확인할 수 있습니다. txt는 현재 디렉터리에 생성됩니다.

다음으로 파일의 압축을 풀고 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 
文件解压完成。