-
Node Stream Read,Writable (대용량 파일 읽기-2-)Programming/NodeJs 2022. 3. 13. 10:30
지난 시간에 이어서 작성하는 글이다.
Node에는 그냥 Stream 뿐만아니라 Readable, Writable Stream이라고하는 Node Ver0.10 부터 도입된 새로운 스트림 인터페이스가 존재한다.
해당 함수는 기존 data에 기반한 스트림이 가지는 읽을 타이밍과 한번에 얼마나 읽어들일 것인지에 대한 제어가 불가했다는 점을 개선한 기능이다.
Readable 스트림은 대표적으로 데이터를 읽어들이기 위한 함수를 제공하는데, read(size) 함수라고 한다. 매개변수에서 추측 가능하듯 이는 읽어 들일 크기를 의미하며, 스트림에서 한번에 몇바이트를 읽을지 크기를 제공하는 함수이다.
이러한 편리한 함수들이 존재하는데 그 종류를 몇개만 나열해보자면,
read([size]): 스트림에서 String, Buffer, null 형태의 데이터를 읽고 size 매개변수를 지정하면 읽어 들이는 데이터의 크기가 한정된다.
setEncoding(encoding): Readable 스트림의 요청으로 읽은 데이터의 Character 인코딩 형태를 설정한다.(The readable.setEncoding() method sets the character encoding for data read from the Readable stream.)
pause(): Readable 객체를 이용하여 읽어들이는 데이터의 생성을 중지한다. 하지만 읽어 들일 수 있는 모든 데이터는 버퍼에 남아있게 된다.
resume(): 일지 중지된 읽기 가능한 상태의 스트림을 다시 가동하여 데이터 읽기 이벤트를 시작한다.
pipe(destination, [options]): 출력 스트림을 destination 매개변수에 지정한 Writable 스트림 객체를 현재의 Readable 객체와 연결한다. 이는 빠르게 읽어 들인 데이터로 인하여 쓰기 객체가 악영향을 받지 않도록 자동으로 관리된다. 또한 옵션의 기본 값은 end()이며 이는 Readable 스트림이 종료되며 end 상태를 보내면 Writable객체에 전달되어 쓰기 스트림 또한 닫으며 end 상태로 바꾼다.
이외에도 unpipe등 다양한 함수가 있으니 공식 레퍼런스를 통하여 참조하면 유용하다.
예제 코드:
const fs = require('fs'); cosnt readFile = fd.createReadStream('test.txt'); readFile.on('readable', () => { // console.log(`readable: ${readFile.read()}`); }); readFile.on('end', () => { // consol.log('end'); });
다음으로 Writable은 쓰기를 수행하는 객체이다. 기본적으로 write, close와 drain 이벤트가 존재하고
write(chunk, [encoding], [callback]): String,버퍼 등 data Chunk와 인코딩 옵션, 콜백 함수들을 지정하여 줄 수 있다.
close():스트림이 닫히거나 더 이상 쓸 데이터가 없다고 판단될 때 더 이상 쓰기 이벤트가 발생하지 않음을 나타낸다.
drain():쓰기 이벤트를 재개하기 적절한 시점에 쓰기 이벤트가 발생하게 한다.
예제 코드:
const fs = require('fs'); const readFile = fs.createReadStream('test.txt'); const writeFile = fs.createWritStream('writetest.txt'); let fullBuffur = false; readFile.on('readable', () => { // if(fullBuffur){ //drain 이벤트 발생 대기 writeFile.removeAllListeners('drain'); writeFile.once('drain',() => { // false 리턴시 버퍼가 꽉 찬 것. fullBuffur = writeFile.write(readFile.read()); }); }else{ // fullBuffur = writeFile.write(readFile.read()); }; });
-References-
'Programming > NodeJs' 카테고리의 다른 글
(mac)NVM 설치 및 Node 버전 관리하기. (0) 2023.02.19 Node.js와 이벤트루프 (0) 2022.04.04 Node Stream (대용량 파일 읽기) (0) 2022.03.03 (mac)node 버전 관리하기. (0) 2022.02.11 Winston.js를 이용한 Logging System 구축 (0) 2022.02.10