Zero To One

node -buffer, stream 본문

Backend

node -buffer, stream

Zero_To_One 2022. 7. 12. 20:55

1. buffer : 메모리에서 고정된 사이즈의 메모리 덩어리, 배열의 형태, byte of data

 

const buf = Buffer.from('Hi');
console.log(buf) // 48 : H, 69: i -> 유니코드
console.log(buf.length) // 2
console.log(buf[0]); //72 : H , 배열로 접근하면 아스키코드로 나옴
console.log(buf[1]); //105 : i
console.log(buf.toString('utf-8')); // Hi, 문자열 형태로 변환

// creat buffer
const buf2 = Buffer.alloc(2); //사이즈가 2개인 버퍼를 만듬, 메모리에서 가용가능한 덩어리를 찾아서 초기화 시켜줌
const buf3 = Buffer.allocUnsafe(2); //사용되지 않는 메모리라면 공간을 확보하지만 초기화 하지 않음 (데이터가 들어있을 수 있음)

//아스키코드로 직접 할당
buf2[0] = 72;
buf2[1] = 105;

console.log(buf2); //<Buffer 48 69>
console.log(buf3); //<Buffer 00 00>

console.log(buf2.toString()); //Hi

//buf2의 내용을 buf3으로 복사
buf2.copy(buf3);
console.log(buf3); //<Buffer 48 69>

//buffer 묶기
const newBuf = Buffer.concat([buf, buf2, buf3]);
console.log(newBuf.toString());

 

2. stream : 버퍼별로 읽고 쓰고를 반복하면서 데이터를 순차적으로 처리

const fs = require('fs')

const data = [];

fs.createReadStream('./file.txt', {
    highWaterMark:64, //64 kbytes 기본값
    encoding: 'utf-8'
}).on('data', (chunk) => {
    data.push(chunk);
}).on('end', () => {
    console.log(data.join('')); //배열의 모든 요소를 합쳐서 문자열로 반환
}).on('error', (error) => {
    console.log(error);
})
//createWriteStream

const fs = require('fs')

const writeStream = fs.createWriteStream('./file3.txt');
writeStream.on('finish', () => {
    console.log('finished!');
})

writeStream.write('hello');
writeStream.write('word!');
writeStream.end();
//piping을 이용해서 복사하기

const fs = require('fs')

const readStream = fs.createReadStream('./file.txt');
const writeStream = fs.createWriteStream('./file4.txt');
const piping =readStream.pipe(writeStream);
piping.on('finish', ()=> {
    console.log('done!');
})
//zlib를 이용해서 압축하기 

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 piping =readStream.pipe(zlibStream).pipe(writeStream);
piping.on('finish', ()=> {
    console.log('done!');
})

3. event (조금더 공부해보아야함)

 

//app.js
const EventEmitter = require('events');
const emitter = new EventEmitter();

const callback1 = (args) => {
    console.log('first callback - ', args);
};
emitter.on('jae', callback1);

emitter.on('choi', (args) => {
    console.log('second callback - ', args);
});

emitter.emit('jae', { message: 1});
emitter.emit('choi', {message: 2});
//emitter.removeListener('jae', callback1);
emitter.emit('jae', {message: 3});

 

커스텀 이벤트 만들기

//main.js

const logger = require('./logger.js');
const emitter = new logger.Logger();

emitter.on('log', (event) => {
    console.log(event);
})

emitter.log(() => {
    console.log('....doing somthin');
})
// loger.js

const EventEmitter = require('events');

class Logger extends EventEmitter {
    log(callback) {
        this.emit('log', 'started...');
        callback();
        this.emit('log', 'ended...')
    }
}

module.exports.Logger = Logger

//emiter는 한번 객체를 만들면 객체내에서 발생하는 이벤트에 한에서 들을 수 있다.
//여러가지 EventEmitter의 객체를 만들면 다른 이벤트에서 발생하는 emitter는 다른 emitter에서 들을 수 없다.

 

노드...너무 어렵다 ㅠㅠ

'Backend' 카테고리의 다른 글

MVC 패턴  (0) 2022.07.25
디버깅  (0) 2022.07.13
node - os, process, path, fs  (0) 2022.07.12