『스트림 단위로 파일 읽고 쓰기』
파일을 읽거나 쓸 때는 데이터 단위가 아닌 스트림 단위로 처리할 수도 있다.
스트림은 데이터가 전달되는 통로와 같은 개념이다. 파일에서 읽을 때는 createReadStream(), 파일에 쓸 때는 createWriteStream() 메소드로 스트림 객체를 만든 후 데이터를 읽고 쓰게 된다.
메소드 이름 |
설명 |
createReadStream(path, [options]) |
파일을 읽기 위한 스트림 객체를 만든다. |
createWriteStream(path, [options]) |
파일을 쓰기 위한 스트림 객체를 만든다. |
[표] 파일을 스트림 단위로 처리하는 대표적인 메소드
옵션으로는 flags, encoding, autoClose 속성이 들어 있는 자바스크립트 객체를 전달할 수 있다.
다음은 output.txt 파일의 내용을 읽어 들인 후 output2.txt 파일로 쓰는 코드이다.
--------------------------------------------------------------
var fs = require('fs');
var infile = fs.createReadStream('./output.txt', {flags: 'r'});
var outfile = fs.createWriteStream('./output2.txt', {flags: 'w'});
infile.on('data', function(data) {
console.log('읽어 들인 데이터', data);
outfile.write(data);
});
infile.on('end', function(){
console.log('파일 읽기 종료.');
outfile.end(function(){
console.log('파일 쓰기 종료.');
});
});
--------------------------------------------------------------
파일을 실행하면 output2.txt 파일이 만들어지며, 그 안에 output.txt 파일의 내용이 똑같이 들어 있는 것을 확인할 수 있다.
▲ 파일을 스트림으로 읽은 후 스트림으로 쓰는 기능의 실행 결과
앞서 살펴본 기능은 두 개의 스트림을 붙여 주면 더 간단하게 만들 수 있다. pipe() 메소드는 두 개의 스트림을 붙여 주는 역할을 한다.
ReadStream 타입의 객체와 WriteStream 타입의 객체를 붙여주면 스트림 간에 데이터를 알아서 전달한다. 다음은 앞에서 실행한 코드를 pipe() 메소드로 바꾼 것이다.
--------------------------------------------------------------
var fs = require('fs');
var inname = './output.txt';
var outname = './output2.txt';
fs.exists(outname, function(exists){
if(exists){
fs.unlink(outname, function(err){
if(err) throw err;
console.log('기존 파일 [' + outname +'] 삭제함.');
});
}
var infile = fs.createReadStream(inname, {flags: 'r'});
var outfile = fs.createWriteStream(outname, {flags: 'w'});
infile.pipe(outfile);
console.log('파일 복사 [' + inname + '] -> [' + outname +']');
});
--------------------------------------------------------------
기존에 만들어 놓은 output2.txt 파일이 있으면 파일이 중복될 수 있다. 그래서 같은 이름을 가진 파일을 다시 만들기 전에 먼저 이전 파일을 삭제하도록 unlink() 메소드를 사용했다.
파일을 실행해 보면 pipe() 메소드로 두 개의 스트림 객체를 연결하기만 했는데도 파일 내용이 복사된 것을 알 수 있다.
▲ pipe() 메소드로 두 개의 스트림을 연결하여 파일 복사한 결과
※ 기존의 output2.txt 파일을 삭제한 후 output.txt 파일을 output2.txt 파일로 복사하는 과정이 비동기 방식으로 처리되므로 화면에 출력되는 순서는 다를 수 있다.
'Study > Node.js' 카테고리의 다른 글
[노드JS] fs 모듈로 새 디렉터리 만들고 삭제하기 (0) | 2019.03.23 |
---|---|
[노드JS] http 모듈로 요청받은 파일 내용을 읽고 응답하기 (0) | 2019.03.23 |
[노드JS] 버퍼 객체 사용하는 방법 알아보기 (0) | 2019.03.23 |
[노드JS] 파일을 직접 열고 닫으면서 읽거나 쓰기 (0) | 2019.03.23 |
[노드JS] 파일 다루기 (0) | 2019.03.23 |