파일을 읽을 때 readFile() 함수 종류를 사용하는 방법도 있지만

작은 리소스로 node 의 stream 기법을 사용하여 읽는 것이 더 효율적일 수 있습니다. 

stream 객체를 사용하는 방법을 익힐때 간접적으로 이 함수의 사용법을 익히는 것이 

좋습니다. 

이 강좌는 fs.readFile() 에 대한 강좌를 읽었던 분을 대상으로 합니다. 

사용법을 먼저 소스를 보면서 이해해 보죠..

먼저 createReadStream() 함수를 간단히 살펴 봅시다. 

fs.createReadStream(path, [options]);
이 함수는 아규먼트 인자로 스트림 읽기 처리 대상이 되는 파일을 지정하고 

동작 조건에 options 을 줄수 있습니다. 

처리 결과는 스트림 객체를 반환합니다.

이 읽기 스트림 객체는 처리 과정을 이벤트로 발생시키고 

읽기 스트림 객체를 직접 이용 하려면 다음 소스를 보고 실행하면 이해 할 수 있다. 

읽기 스트림 객체는 이벤트에 따른 처리를 고려 하면 되기 때문이다. 

이벤트 처리 과정을 보여 주는 소스를 보죠..

--[fs_createReadStream.js]-------------------------------------------------------------------------
var fs = require('fs');

var readStream = fs.createReadStream( './fs_createReadStream.js' , { highWaterMark: 256 } );

// readStream.pause();

readStream.on('readable', function() {
console.log( '>> readable event'  );
});

readStream.on('open', function () {
console.log( '>> open event' );
});

readStream.on('data', function(chunk) {
console.log( '>> data  event : chunk size = %d', chunk.length );
});

readStream.on('end', function() {
console.log( '>> end event'  );
});

readStream.on('close', function() {
console.log( '>> close event'  );
});

readStream.on('error', function(err) {
console.log( 'err = %j', err );
});

// readStream.resume();
-----------------------------------------------------------------------------------------------

위 소스는 fs.createReadStream() 함수를 이용해서 파일을 읽기를 스트림으로 처리하는 

읽기 스트림을 얻습니다. 

그리고 각각의 발생 이벤트에 대응하는 함수들을 등록 합니다. 

실제로 실행되는 결과를 보면 위 소스가 무엇을 하는지 알 수 있습니다. 

$ node fs_createReadStream.js
>> readable event
>> open event
>> readable event
>> data  event : chunk size = 256
>> readable event
>> data  event : chunk size = 256
>> readable event
>> data  event : chunk size = 184
>> end event
>> close event

파일 './fs_createReadStream.js' 를 읽는 읽기 스트림을 얻습니다. 

그러면 즉시 읽기를 시작하는데 각 이벤트의 함수가 등록 되면 해당 이벤트가 발생하게 됩니다. 

사용가능한 이벤트는 다음과 같은 의미가 있습니다. 
'readable' : 파일이 읽기가 가능한 상태가 되면 발생합니다. 
'open' : 파일이 정상적으로 열린 후 발생합니다. 
'data' : 데이터를 읽어 처리가 될 상태가 되면 발생합니다.
'end' : 데이터의 읽기가 모두 끝났을때 발생합니다. 
'close' : 파일이 정상적으로 닫힌 후 발생합니다. 
'error' : 처리 과정 중에 에러가 발생하면 발생합니다. 
각 호출 형태는 위 소스를 참고 하면 됩니다. 

이 이벤트 중 'open' 은 원래 읽기 스트림에 있는 이벤트가 아니고  

fs.createReadStream() 함수로 만들어진 스트림에서 발생하는 추가적인 이벤트 입니다. 

에러가 나면 에러 이벤트가 발생하는데 이때 파일이 없는 경우의 에러라면 다음과 같이 표출 됩니다. 

$ node fs_createReadStream_error.js
>> readable event
err = {"errno":34,"code":"ENOENT","path":"no_file"}

fs.createReadStream() 함수를 호출 할때 주는 옵션은 

스트림 객체에 주는 옵션이 있고 

fs.createReadStream() 에 의해서 추가된 옵션이 있습니다. 

이 부분은 node.js 매뉴얼을 참조 하면 좋은데..

여기서 쓰인 highWaterMark: 256 옵션은 

데이터 읽기 단위를 지정한 것입니다. 

만약 이 것을 지정하지 않으면 한번에 읽히게 될 겁니다. 

즉 'data' 이벤트가 한번만 뜨고 안 뜰겁니다. 

왜냐하면 내부적으로 디폴트 버퍼 크기가 16kb 크기 이기 때문입니다.