buffer
stream :
Buffer.js
const buffer = Buffer.from('buffer buffer buffer');
console.log(buffer); // <Buffer 62 75 66 66 65 72 20 62 75 66 66 65 72 20 62 75 66 66 65 72>
console.log(buffer.length); // 20
console.log(buffer.toString()); // buffer buffer buffer
// 버퍼를 배열로 나누어서 concat으로 합칠 수 있음.
const array = [Buffer.from('this '), Buffer.from('is '), Buffer.from('phrase ')];
console.log(Buffer.concat(array).toString()); // this is phrase
// 아무 값이 없는 5byte 버퍼를 생성하는 것도 가능
console.log(Buffer.alloc(5)); // <Buffer 00 00 00 00 00>
const fs = require('fs');
const readStream = fs.createReadStream('./lorem.txt');
// fs.createReadStream으로 lorem.txt파일을 가져오는 과정을 readStream 변수에 할당
const data = [];
readStream.on('data', (chunk) => {
data.push(chunk);
// 나눠진 chunk를 받을 때마다 배열로 넣어주기
console.log('data', chunk, chunk.length);
});
readStream.on('end', () => {
console.log('end', Buffer.concat(data).toString());
// read가 끝나면 배열에 들어간 data를 concat으로 합치기
});
readStream.on('error', (err) => {
console.log('err', err);
});
const fs = require('fs');
const writeStream = fs.createWriteStream('./lorem.txt');
writeStream.on('finish', () => {
console.log('파일 쓰기 완료');
});
writeStream.write('이 글을 씁니다.\n'); // 하나가 하나의 버퍼라고 생각하면 됨
writeStream.write('good good.\n');
writeStream.end(); //write 종료
const fs = require('fs');
const readStream = fs.createReadStream('./readme.txt', {highWaterMark: 16});
// 16바이트씩 파일 읽기
const writeStream = fs.createWriteStream('./lorem.txt'); //
readStream.pipe(writeStream);
// 읽어서 받은 것을 다시 16바이트씩 lorem.txt에 쓰게됨 (파일복사)
응용예제
const fs = require('fs');
const zlib = require('zlib');
const readStream = fs.createReadStream('./readme.txt', {highWaterMark: 16});
const zlibStream = zlib.createGzip();
const writeStream = fs.createWriteStream('./lorem.txt');
readStream.pipe(zlibStream).pipe(writeStream); // 파이프를 연결
bigfile.js
const fs = require('fs');
const file = fs.createWriteStream('./big.txt');
for (let i = 0; i <= 10_000_000; i++) {
file.write('create file!');
}
file.end();
usememory.js
const fs = require('fs');
// 버퍼 방식
console.log('before', process.memoryUsage().rss); // 약 19메가바이트
const data1 = fs.readFileSync('./big.txt');
fs.writeFileSync('./big.txt', data1);
console.log('buffer', process.memoryUsage().rss); // 약 1기가바이트
// 스트림 방식
console.log('before', process.memoryUsage().rss); // 약 19메가 바이트
const readStream = fs.createReadStream('./big.txt');
const writeStream = fs.createWriteStream('./big3.txt');
console.log('buffer', process.memoryUsage().rss); // 약 31메가 바이트