Zero To One
node -buffer, stream 본문
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 |