NodeJS Butter Stream

lim1313·2021년 9월 8일
0

TILPLUS

목록 보기
20/40

버퍼 buffer

  • 고정된 사이즈의 메모리 덩어리
  • 메모리에 있는 데이터(바이트 단위) 자체
  • 유니형태로 출력
  • 배열 형태 // 배열에 접근하면 아스키코드로 출력이 된다.
  • Fixed-size chuck of memory
  • array of integers, byte of data
const fs = require("fs");

const buf = Buffer.from("Hi");
console.log(buf); //-> <Buffer 48 69> 유니코드 형태
console.log(buf.length); //->2
console.log(buf[0]); //->72 아스키코드형태
console.log(buf[1]); //->105 아스키코드형태
console.log(buf.toString()); 
//-> 문자형태로 출력(기본값 : 'utf-8' , 옵션 전달 가능)

//create : buffer 생성
const buf2 = Buffer.alloc(2); 
//-> 사이즈가 2개인 buffer를 만듦. 사용가능한 메모리를 찾아 초기화시켜줌

buf2[0] = 72;
buf2[1] = 105;
console.log(buf2); //-> <Buffer 48 69>
console.log(buf2.toString()); //-> Hi

//alloUnsafe : 초기화하지 않기 때문에 빠름, but 데이터가 들어있을 수 있기 때문에 초기화하는 것이 좋음
const buf3 = Buffer.allocUnsafe(2);

buf2.copy(buf3); //-> buf2에 있는 값을 buf3에 copy

//concat : 여러 버퍼를 모을 수 있다.
const newBuf = Buffer.concat([buf, buf2, buf3]);

스트림 stream

  • 스트림은 파일을 버퍼 단위로 옮겨서 전부 옮길 때까지 기다린 후 처리하기보다 매 버퍼 단위로 전송하는 방식
  • 스트림은 읽거나 쓸 수 있으며, 모든 스트림 객체는 EventEmitter의 인스턴스

Readable

const fs = require("fs");

// stream에서 데이터가 조금씩 도착하면 알려줌
const readStream = fs.createReadStream("./file.txt", {
  highWaterMark: 80, // 기본값 : 64 kbyts
  encoding: "utf-8",
});

const data = [];
//on : 데이터가 발생할 때마다 콜백함수 실행, 자기자신을 return
readStream.on("data", chunk => {
  data.push(chunk);
  console.count("data");
});

//once : 한번만 실행
readStream.once("data", chunk => {
  data.push(chunk);
  console.count("data");
});

//-> 모든 데이터가 read되었을 때 실행
readStream.on("end", () => {
  console.log(data.join(""));
  console.log("success");
});

readStream.on("error", error => {
  console.log(error);
});

Writable

const fs = require("fs");

// file3 파일을 생성하여 (helloworld!!!!!)값을 write
const writeStream = fs.createWriteStream("./file3.txt");
writeStream.on("finish", () => {
  console.log("finised");
});

writeStream.write("hello");
writeStream.write("world");
writeStream.write("!!!!!");

writeStream.end();

Readable & Writable

const fs = require('fs');

let inF = fs.createReadStream('./aaa.txt', {
  highWaterMark: 10, 
  encoding: 'utf-8', // 설정해주지 않으면 Buffer 형태로 나온다.
});
let outF = fs.createWriteStream('./bbb.txt');

inF.on('data', function (fileData) {
  console.log(fileData);
  outF.write(fileData); //-> 버퍼가 채워지는대로 바로바로 outF에 write해준다.
});

inF.on('end', function () {
  console.log('읽기 종료');
  outF.end(function () {
    console.log('쓰기 종료');
  });
});

pipe

const fs = require('fs');

const readStream = fs.createReadStream('./aaa.txt');
const writeStream = fs.createWriteStream('./ccc.txt');

const piping = readStream.pipe(writeStream);

piping.on('finish', () => {
  console.log('done!!');
});
// -> ccc 파일을 생성하여 readStream의 데이터를 그대로 전달.

Readble & writeable 예시코드와 같이 버퍼 단위로 나뉘어져서 데이터가 전달된다.

zilb 압축

const fs = require('fs');
const zlib = require('zlib'); //압출 모듈

const readStream = fs.createReadStream('./file.txt');
const zlibStream = zlib.createGzip();
const writeStream = fs.createWriteStream('./file4.zip');

const pining = readStream.pipe(zlibStream).pipe(writeStream); // 압축한 형태로 file4에 데이터를 전달.
piping.on('finish', () => {
  console.log('done!!');
});

server 요청시

const http = require('http');
const server = http.createServer((req, res) => {
  fs.readFile('file.txt', (err, data) => {
    res.end(data);
  });
});
server.listen(3000);

위와 같이 할 경우 파일을 전부 읽은 다음 에 data를 전송해준다.

하지만, 아래와 같이 스트림을 이용할 경우

const http = require('http');
const server = http.createServer((req, res) => {
  const stream = fs.createReadStream('./file.txt');
  stream.pipe(res);
});
server.listen(3000);

버퍼로 나뉘어 전송할 수 있다.

profile
start coding

0개의 댓글