Study/Node.js

[노드JS] 스트림 단위로 파일 읽고 쓰기

AC 2019. 3. 23. 22:37



『스트림 단위로 파일 읽고 쓰기

_________________________________________________________________________________________________________


파일을 읽거나 쓸 때는 데이터 단위가 아닌 스트림 단위로 처리할 수도 있다.

스트림은 데이터가 전달되는 통로와 같은 개념이다. 파일에서 읽을 때는 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 파일로 복사하는 과정이 비동기 방식으로 처리되므로 화면에 출력되는 순서는 다를 수 있다.


LIST