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은 출력 흐름에서 입력 스트림으로의 메커니즘을 제공합니다. 일반적으로 우리는 이를 사용하여 한 스트림에서 데이터를 가져와 다른 스트림으로 데이터를 전달합니다.위 사진과 같이 파일을 물이 담긴 양동이에 비유했는데, 물이 파일의 내용물입니다. 물이 하나의 양동이에서 흘러나오도록 두 개의 양동이를 연결하는 것이 물입니다. 버킷으로 이동하여 대용량 파일의 복사 프로세스를 천천히 실현합니다.
다음 예에서는 파일의 내용을 읽고 그 내용을 다른 파일에 씁니다.
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 文件解压完成。