노드 학습 6일차
오늘은 파일 시스템에 접근하는 fs 모듈과 버퍼/스트림 에 대해 공부했습니다.
fs 모듈이란
- 파일 시스템에 접근하는 모듈
- 파일/폴더 생성, 삭제, 읽기, 쓰기 가능
- 콜백이 기본 형식이지만 프로미스 지원
- 동기/비동기 각각 지원
파일 읽기 (비동기)
readFile()
함수를 사용합니다.
1
2
3
4
5
6
7
8
9
10
const fs = require('fs');
fs.readFile('./readme.txt',(err,data)=>{
if(err){
throw err;
}
console.log(data); // 버퍼퍼 데이터로 출력됨
console.log(data.toString());
})
파일을 읽는 예시 입니다.
결과 값은 사람은 읽을 수 없는 데이터로 전달 되기 때문에 toSrring()
을 사용하여 읽을 수 있도록 변환하여 사용합니다.
콜백을 기반으로 하고 있으며 (err,data) 의 형식을 가지기 때문에 util 모듈에서 promisify 를 사용할 수 있습니다.
하지만 fs 에서도 자체적으로 프로미스를 지원하고 있습니다.
다음은 그 예시입니다.
1
2
3
4
5
6
7
8
9
10
const fs = require('fs').promises; // 프로미스를 지원함
fs.readFile('./readme.txt')
.then((data)=>{
console.log(data);
console.log(data.toString());
})
.catch((err)=>{
throw err;
})
파일 쓰기 (비동기)
writeFile()
함수를 사용합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
const fs = require('fs').promises;
fs.writeFile('./writeme.txt','내용이 입력됩니다')
.then(()=>{
return fs.readFile('./writeme.txt');
})
.then((data)=>{
console.log(data);
console.log(data.toString());
})
.catch((err)=>{
throw err;
})
파일 읽기 (동기)
readFileSync()
함수를 사용합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const fs = require('fs');
const data1 = fs.readFileSync('./readme.txt');
console.log('1번',data1.toString());
const data2 = fs.readFileSync('./readme.txt');
console.log('2번',data2.toString());
const data3 = fs.readFileSync('./readme.txt');
console.log('3번',data3.toString());
const data4 = fs.readFileSync('./readme.txt');
console.log('4번',data4.toString());
const data5 = fs.readFileSync('./readme.txt');
console.log('5번',data5.toString());
파일 쓰기 (동기)
writeFileSync()
함수를 사용합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* writeFileSync 를 사용하여 동기적으로 파일을 생성하는 예시입니다.
*/
const fs = require('fs');
fs.writeFileSync('./writeme.txt','내용으로 사용될 인수 입니다');
const data = fs.readFileSync('./writeme.txt');
console.log(data.toString());
fs.rmSync('./writeme.txt');
버퍼와 스트림 이해하기
버퍼란?
- 일정한 크기로 모아둔 데이터
- 일정한 크기가 되면 한번에 처리
스트림이란?
- 데이터의 흐름
- 버퍼(또는 청크)의 크기를 작게 만들어서 주기적으로 데이터를 전달
버퍼 내장 객체 사용해보기
1
2
3
4
5
6
7
8
9
const buffer = Buffer.from('아임 버퍼에요');
console.log('from():',buffer);
console.log('length:',buffer.length);
console.log('toString():',buffer.toString());
const array = [Buffer.from('띄엄 '), Buffer.from('띄엄 '), Buffer.from('띄어쓰기')];
console.log(Buffer.concat(array).toString());
console.log(Buffer.alloc(5));
주요 함수
from()
: 버퍼를 생성합니다concat()
: 버퍼를 합칩니다alloc()
: 빈 버퍼를 생성합니다
빈 버퍼는 주어진 크기만큼 00
값을 가지게 됩니다.
fs 모듈과 스트림
fs는 다음의 함수를 통해 읽고 쓰는 스트림을 사용할 수 있습니다.
createReadStream()
createWriteStream()
createReadStream
파일을 읽을 때 사용하는 스트림입니다.
예시 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const fs = require('fs');
/* 스트림을 지원하지만 기본 청크의 크기가 64kb라서
highWaterMark 옵션을 통해 청크의 크기를 임의로 변경합니다.
*/
const readStream = fs.createReadStream('./readme.txt',{highWaterMark:16} );
const data = [];
readStream.on('data',(chunk)=>{
data.push(chunk);
console.log(chunk);
console.log(chunk.length);
console.log(chunk.toString());
})
readStream.on('end',()=>{ // close 이벤트도 존재합니다.
console.log('end:',Buffer.concat(data).toString());
})
readStream.on('error',(err)=>{
console.error(err);
});
createWriteStream
파일을 쓸때 사용하는 스트림입니다.
예시 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const fs = require('fs');
const writeStream = fs.createWriteStream('./writeme.txt');
writeStream.on('finish',()=>{
console.log('파일 쓰기 종료');
})
writeStream.on('error',(err)=>{
console.error(err);
})
writeStream.write('첫 번째 줄 내용입니다\n');
writeStream.write('두 번째 줄 내용입니다\n');
writeStream.write('세 번째 줄 내용입니다\n');
writeStream.end();
write()
함수를 통해 내용을 작성하고 end()
함수를 통해 스트림의 데이터 전송을 끝냅니다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.