2012-09-16 3 views
5

Im이 기사를 읽고 : http://elegantcode.com/2011/04/06/taking-baby-steps-with-node-js-pumping-data-between-streams/ 및 스트림을 이해하는 데 약간의 문제가 있습니다.nodejs 스트림과 콜백

견적 :

"Suppose we want to develop a simple web application 
that reads a particular file from disk and send it to the browser. 
The following code shows a very simple and naïve implementation 
in order to make this happen." 

그래서 코드 샘플은 다음과 같다 :

var readStream = fileSystem.createReadStream(filePath); 
readStream.on('data', function(data) { 
    response.write(data); 
}); 

readStream.on('end', function() { 
    response.end();   
}); 

을 우리는 위의 방법 것을 사용하는 것이 왜 우리는 간단하게 할 수있는 경우 :

fs.readFile(filePath, function(err, data){ 
    response.write(data); 
    response.end(); 
}); 

스트림을 사용해야하는시기 또는 이유는 무엇입니까?

답변

13

대용량 파일을 사용하는 경우 스트림을 사용합니다. 콜백을 사용하면 파일의 모든 내용을 메모리에 한 번에로드해야하며 스트림에서는 파일의 청크 만 주어진 시간에 메모리에 저장됩니다.

또한 스트림 인터페이스는 논리적으로 더 우아 할 것입니다. 대신 명시 적으로 data, drainend 콜백을 부착, 대신 pipe를 사용할 수 있습니다

var readStream = fileSystem.createReadStream(filePath); 
readStream.pipe(response); 
5

하나의 큰 이유는 모든 메모리에 전에 데이터에 일을 시작할 수 있다는 것입니다. 클립이 아직로드되는 동안 클립을 시청할 수있는 "스트리밍 비디오"를 생각해보십시오. 많은 경우, 스트림을 사용하면 전체 내용을로드하기 전에 파일에서 데이터를 처리 할 수 ​​있습니다.

다른 일반적인 사용 사례는 데이터의 일부 조건을 감지 할 때까지 개체를 읽기만하려는 경우입니다. 큰 파일에 "rabbit"라는 단어가 포함되어 있는지 확인해야한다고 가정 해보십시오. 콜백 패턴을 사용하는 경우 전체 파일을 메모리로 읽은 다음 파일을 검토하고 단어가 내부에 있는지 확인해야합니다. 스트림을 사용하면 파일의 5 행에서 단어를 감지 한 다음 전체를로드하지 않고 스트림을 닫을 수 있습니다.

분명히 더 복잡한 사용 사례가 있으며 콜백이 여전히 단순함에 더 많은 의미가있는 경우가 많이 있습니다 (예 : "토끼"가 표시된 총 시간을 계산해야하는 경우). 어쨌든 전체 파일을로드).