Node.js는 당연히 비동기식이며 이벤트 중심이며 I/O 관련 작업을 처리하는 데 이상적입니다. 응용 프로그램에서 I/O 관련 작업을 처리하는 경우 Node.js에서 스트림을 활용할 수 있습니다. 따라서 스트림을 자세히 살펴보고 I/O 작업을 단순화하는 방법을 이해해 봅시다.
흐름이란 무엇입니까?
스트림은 UNIX 파이프 라인으로, 데이터 소스에서 데이터를 쉽게 읽은 다음 다른 대상으로 흐를 수 있습니다.
간단히 말해서 스트리밍은 특별한 것이 아니며 일부 방법을 구현하는 이벤트 일뿐입니다. IT가 구현하는 방법에 따르면 스트림은 읽기 쉬운 스트림 (읽기 가능), 쓰기 가능한 스트림 (쓰기 가능) 또는 양방향 스트림 (이중, 읽기 가능 및 쓰기 가능)이 될 수 있습니다.
읽기 쉬운 스트림을 사용하면 데이터 소스에서 데이터를 읽을 수 있으며, 쓰기 가능한 스트림을 사용하면 대상에 데이터를 쓸 수 있습니다.
Node.js를 사용한 경우 스트리밍이 발생했을 가능성이 높습니다.
예를 들어, node.js http 서버에서 요청은 읽을 수있는 스트림이며 응답은 쓰기 가능한 스트림입니다.
FS 모듈을 사용하여 읽을 수 있고 쓰기 쉬운 스트림을 처리하는 데 도움이 될 수 있습니다.
이제 몇 가지 기본 사항을 배우고 다양한 유형의 흐름을 이해하도록하십시오. 이 기사는 읽을 수 있고 쓰기 쉬운 스트림에 대해 논의 할 것입니다. 양방향 스트림은이 기사의 범위를 벗어나고 논의하지 않을 것입니다.
읽기 쉬운 스트림
읽기 쉬운 스트림을 사용하여 시스템의 파일, 메모리의 버퍼 또는 기타 스트림과 같은 데이터 소스에서 데이터를 읽을 수 있습니다. 스트림은 Eventemitter이기 때문에 다양한 이벤트와 함께 데이터를 보냅니다. 우리는이 이벤트를 사용하여 흐름을 작동시킬 것입니다.
스트림에서 데이터를 읽습니다
스트림에서 데이터를 읽는 가장 좋은 방법은 데이터 이벤트를 듣고 콜백 기능을 추가하는 것입니다. 데이터가 흐르면 읽기 쉬운 스트림이 데이터 이벤트를 보내고 콜백 함수가 트리거됩니다. 다음 코드 스 니펫을 살펴보십시오.
var fs = require ( 'fs'); var readableStream = fs.CreaterEadStream ( 'file.txt'); var data = ''; var readableStream.on ( 'data', function (chunk) {data += chunk;}); readablestream.on ( 'end', function () {console.log (data));fs.createreadstream은 읽을 수있는 스트림을 제공합니다.
처음에는이 스트림이 흐름 역동적이지 않았습니다. 데이터의 이벤트 리스너를 추가하고 콜백 함수를 추가하면 흐르게됩니다. 그런 다음 작은 데이터를 읽고 콜백 기능으로 전달합니다.
스트림의 구현자는 데이터 이벤트의 트리거 주파수를 결정합니다. 예를 들어, HTTP 요청은 여러 KB의 데이터를 읽을 때 데이터 이벤트를 트리거합니다. 파일에서 데이터를 읽으면 줄이 완료되면 데이터 이벤트를 트리거하기로 결정할 수 있습니다.
읽을 데이터가 없으면 (파일 끝에서 읽을 때) 스트림은 종료 이벤트를 보냅니다. 위의 예에서는이 이벤트를 듣고 파일 읽기를 마치면 데이터를 인쇄했습니다.
스트림을 읽는 또 다른 방법이 있습니다. 파일 끝까지 읽기 전에 스트림 인스턴스에서 read () 메소드를 계속 호출하면됩니다.
var fs = require ( 'fs'); var readableStream = fs.createreadStream ( 'file.txt'); var data = ''; var chunk; readableStream.on ( 'readable', function () {while ((chunk = readablestream.read ())! = null) {null) {null) {null)); console.log (data);});read () 메소드는 내부 버퍼에서 데이터를 읽고 읽을 데이터가 없을 때 NULL을 반환합니다.
따라서 while 루프에서는 read ()가 NULL을 반환하는지 여부를 확인하고 NULL을 반환하면 루프가 종료됩니다.
스트림에서 데이터를 읽을 수있을 때 읽기 쉬운 이벤트가 발사 될 것입니다.
인코딩을 설정하십시오
기본적으로 스트림에서 읽은 내용은 버퍼 객체입니다. 당신이 끈을 읽고 있다면, 이것은 당신을위한 것이 아닙니다. 따라서 다음 예에서와 같이 readable.setencoding ()을 호출하여 스트림 인코딩을 설정할 수 있습니다.
var fs = require ( 'fs'); var readablestream = fs.createreadstream ( 'file.txt'); var data = ''; readablestream.setencoding ( 'utf8'); readableStream.on ( 'data', function (chunk) {data += chunk;}); readablestream.on ( 'end',});위의 예에서는 스트림의 인코딩을 UTF8로 설정하면 데이터가 UTF8로 구문 분석되고 콜백 함수의 청크는 문자열이됩니다.
관
파이프 라인은 스트림 상태를 직접 관리하지 않고 데이터 소스의 데이터를 읽고 대상에 작성할 수있는 훌륭한 메커니즘입니다. 다음 예를 살펴 보겠습니다.
var fs = require ( 'fs'); var readableStream = fs.CreaterEadStream ( 'file1.txt'); var writeBleStream = fs.createWritestream ( 'file2.txt'); readableStream.pipe (writableStream);
위의 예제는 파이프 () 메소드를 사용하여 file1의 내용을 file2에 씁니다. Pipe ()는 데이터 흐름을 관리하는 데 도움이되므로 데이터 흐름 속도에 대해 걱정할 필요가 없습니다. 이것은 파이프 ()를 매우 간단하고 사용하기 쉽게 만듭니다.
Pipe ()가 대상 스트림을 반환하므로 여러 스트림을 쉽게 연결할 수 있습니다!
링크 (체인)
아카이브 파일이 있고 압축을 풀고 싶다고 가정 해 봅시다. 이 작업을 수행하는 방법에는 여러 가지가 있습니다. 그러나 가장 간단한 방법은 파이프 라인과 링크를 사용하는 것입니다.
var fs = require ( 'fs'); var zlib = require ( 'zlib'); fs.createreadstream ( 'input.txt.gz') .pipe (zlib.creategunzip ()) .pipe (fs.createwritestream ( 'output.txt'));
먼저 input.txt.gz를 통해 읽기 쉬운 스트림을 생성 한 다음 Zlib.createGunzip () 스트림을 스트리밍하여 내용을 압축 해제합니다. 마지막으로, 우리는 쓰기 가능한 스트림을 추가하여 압축 압축 내용을 다른 파일에 씁니다.
다른 방법
우리는 읽을 수있는 스트림에서 몇 가지 중요한 개념을 논의했으며 다음은 알아야 할 몇 가지 방법이 있습니다.
1. readable.pause ()이 메소드는 흐름의 흐름을 일시 중지합니다. 다시 말해, 데이터 이벤트가 다시 트리거되지 않습니다.
2. readable.resume () 메소드는 위의 반대이며 일시 정지 흐름이 이력서 흐름을 허용합니다.
3. readable.unpipe () 메소드는 대상을 제거합니다. 전달 된 매개 변수가 있으면 읽기 쉬운 스트림이 Liu Xiang의 특정 대상을 중지하게됩니다. 그렇지 않으면 모든 목적지를 제거합니다.
쓰기 가능한 스트림
쓰기 가능한 스트림을 사용하면 대상에 데이터를 쓸 수 있습니다. 읽기 쉬운 스트림과 마찬가지로, 이들은 이벤트 메미터이며, 다른 이벤트를 트리거합니다. 쓰기 가능한 스트림에서 트리거 될 이벤트와 방법을 살펴 보겠습니다.
스트림에 쓰십시오
쓰기 가능한 스트림으로 데이터를 작성하려면 쓰기 가능한 스트림 인스턴스에서 write () 메소드를 호출하고 다음 예를 참조해야합니다.
var fs = require ( 'fs'); var readableStream = fs.CreaterEadStream ( 'file1.txt'); var writeBlestream = fs.createWritestream ( 'file2.txt'); ReadableStream.setencoding ( 'utf8'); ReadableStream.on ( 'data', function (chunk)};
위의 코드는 매우 간단합니다. 입력 스트림의 데이터를 읽고 write ()를 사용하여 대상에 씁니다.
이 방법은 부울 값을 반환하여 쓰기가 성공했는지 여부를 나타냅니다. 반환 된 경우, 그것은 쓰기가 성공하고 더 많은 데이터를 계속 작성할 수 있음을 의미합니다. 그것이 거짓이라면, 그것은 오류가 발생한 것을 의미하며 지금 계속 쓸 수는 없습니다. 쓰기 가능한 스트림은 드레인 이벤트를 트리거하여 데이터를 계속 작성할 수 있음을 알려줍니다.
데이터를 작성한 후
데이터를 작성할 필요가 없으면 end () 메소드를 호출하여 스트림에 글쓰기를 마친 것을 알 수 있습니다. RES가 HTTP 응답 객체라고 가정하면 일반적으로 브라우저에 응답을 보냅니다.
res.write ( '일부 데이터 !!');
res.end ();
end ()가 호출되면 모든 데이터가 작성되고 스트림이 마무리 이벤트를 트리거합니다. end ()를 호출 한 후 더 이상 쓰기 가능한 스트림에 데이터를 쓸 수 없습니다. 예를 들어 다음 코드는 오류를보고합니다.
res.write ( '일부 데이터 !!');
res.end ();
res.write ( '다시 쓰려고 시도'); // 오류!
다음은 쓰기 가능한 스트림과 관련된 몇 가지 중요한 이벤트입니다.
1. 오류가 서면 또는 링크에서 발생하면 오류가 발생합니다.
2. 파이프 읽기 쉬운 스트림이 쓰기 가능한 스트림에 연결되면이 이벤트가 트리거됩니다.
3. readable 스트림에 의해 Unpipe가 호출되면 Unpipe가 발사됩니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.