본문 바로가기

Programming/Node.js

4. Node 기능 살펴보기 (7) - 버퍼와 스트림 3

node js logo image

 

 

 

 

 

앞선 아티클에서 버퍼에 대해서 살펴보고, 버퍼의 취약점과 이를 보강하기 위한 스트림 개념을 살펴보았습니다. 

 

 

 

4. Node 기능 살펴보기 (7) - 버퍼와 스트림 2

앞선 아티클에서 Buffer 클래스를 사용한 예제를 확인했습니다. 이제 Buffer 클래스의 사용법을 조금 더 자세히 살펴보도록 하겠습니다.  const buffer = Buffer.from('버퍼로 변환할 문자열입니다.');consol

nozeroslope.tistory.com

 

 

const fs = require('fs');

const readStream = fs.createReadStream('./readme3.txt', { highWaterMark: 16});
const data = [];

readStream.on('data', (chunk) => {
    data.push(chunk);
    console.log('data : ', chunk, chunk.length);
});

readStream.on('end', () => {
    console.log('end : ', Buffer.concat(data).toString());
});

readStream.on('error', (err) => {
    console.log('error :', err);
});

/* 출력
data :  <Buffer ec 9d b4 20 ed 8c 8c ec 9d bc ec 9d 80 20 eb 82> 16
data :  <Buffer 98 eb 88 a0 ec 84 9c 20 ec a0 84 eb 8b ac eb 90> 16
data :  <Buffer 9c eb 8b a4 2e 20 63 68 75 6e 6b 20 ec a1 b0 ea> 16
data :  <Buffer b0 81 20 eb 8b a8 ec 9c 84 eb a1 9c 20 eb 82 98> 16
data :  <Buffer eb 88 84 ec 96 b4 ec a7 84 eb 8b a4 2e> 13
end :  이 파일은 나눠서 전달된다. chunk 조각 단위로 나누어진다.
*/

 

 

· createReadStream( )의 첫 번째 인수는 읽을 파일의 경로입니다. 두 번째 인수는 옵션 객체로, highWaterMark 옵션으로 버퍼의 크기를 바이트 단위로 정합니다. 기본 값은 64KB이며, 여기서는 이해를 돕기 위해 16B로 지정했습니다. 

 

· 이렇게 생성한 readStream 변수에서 이벤트 리스너를 붙여 사용합니다. 여기서 사용되는 이벤트는 'data', 'end', 'error'입니다. 여기서 'data'는 "파일 읽기가 시작되면 발생하는" 이벤트입니다. 파일을 모두 읽으면 end 이벤트가 발생하죠.

 

· 예제 코드는 만들어둔 data 배열에 생성되는 chunk들을 한 개씩 push 합니다. 그리고 마지막에 해당 배열에서 concat을 이용해 버퍼를 하나로 합치고 이를 다시 문자열로 변환했습니다. 

 

· 해당 파일 크기는 77B여서 16B 네 번, 13B 한 번이 전송되었습니다. 

 

 

다음 아티클에서는 쓰기 스트림을 알아보겠습니다.