본문 바로가기
Javascript/Node.js

버퍼와 스트림 이해하기

by 모스키토끼 2019. 10. 17.

Buffer(버퍼를 직접 다룰 수 있는 클래스) 클래스의 메서드 종류

  • from(문자열): 문자열을 버퍼로 바꿀 수 있다.

  • toString(버퍼): 버퍼를 다시 문자열로 바꿀 수 있다.

  • concat(배열): 배열 안에 든 버퍼들을 하나로 합칩니다.

  • alloc(바이트): 빈 버퍼를 생성

※ readFile()방식의 버퍼가 편리하기는 하지만 문제점 존재한다.

문제점: 용량이 100MB인 파일을 읽을 때 100MB의 버퍼를 만들어야 된다.(너무 많은 메모리를 잡아먹음)

또한 모든 내용을 버퍼에 다 쓴후에 다음 동작으로 넘어가므로 읽기, 압축, 쓰기 등의 조작을 연달아 할 때 매번 전체 용량을 버퍼로 처리해야 다음 단계로 넘어갈 수 있다.

 

스트림: 버퍼의 크기를 작게 만들어 여러 번에 나눠서 보내는 방식

예시)

const fs = require('fs');

const readStream = fs.createReadStrem('./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);
});

- 16B씩 나눠서(나눠진 조각을 chunk라고 부름) 전송.

 

쓰기 스트림

예시)

const fs = request('fs');

const writeStream = fs.createWriteStream('./writeme2.txt');
writeStream.on('finish', () => {
	console.log('파일 쓰기 완료');
});

writeStream.write('이 글을 씁니다.\n');
writeStream.write('한 번 더 씁니다.');
writestream.end();

결과:

파일 쓰기 완료

- finish 이벤트를 보내주어 파일 쓰기가 종료되면 콜백 함수가 호출된다.

 

createReadStream으로 파일을 읽고 스트림으로 전달받아 createWritestream으로 파일을 쓸 수 있다.

- '파이핑한다'

예시)

//파일명: pipe.js

const fs = require('fs');

const readStream = fs.createReadStream('readme4.txt');
const writestream = fs. createWriteStream('writeme3.txt');
readStream.pipe(writeStream);

//새로 나온 방식
const zlib = require('zlib');
const fs = require('fs');

const readStream = fs.createReadStream('./readme4.txt');
const zlibStream = zlib.createGzip();
const writeStream = fs.createWriteStream('./readme4.txt.gz');
readStream.pipe(zlibStream).pipe(writeStream);

- 파일을 읽은 후 gzip 방식으로 압축하는 코드, 버퍼 데이터가 전달되다가 gzip 압축을 거친 후 파일로 쓰여진다.

 

'Javascript > Node.js' 카테고리의 다른 글

이벤트 이해하기  (0) 2019.10.19
요청과 응답 이해하기(서버구현)  (0) 2019.10.19
파일 시스템 접근하기  (0) 2019.10.10
모듈 만들기  (0) 2019.10.10
Front end Javascript  (0) 2019.10.04

댓글