* Readable Stream 이용
var readable stream_byte= ... readable stream_byte.on('data',function(data){ //data 는 byte buffer }); |
var readable stream_string=... readable stream_string.setEncoding('utf8'); readable stream_string.on('data',function(data){ //data 는 string buffer }); |
- stream.pause(); 및 stream.resume(); 으로 스트림에서 데이터를 받는 것을 중지하거나 재게 할 수 있다.
- stream의 끝을 공지
var readable stream = ... readable stream.on('end',function(){ console.log('the stream has ended'); }); |
* Writable Stream 이용
var writable_stream = ...; writable_stream.write('this is an UTF-8 string'); // default로 UTF-8 Encoding |
var writable_stream = ...; writable_stream.write('......','base64'); // encoding 지정 가능함 |
var writable_stream = ...; var buffer=new Buffer('this is buffer'); writable_stream.write(buffer); //buffer 이용 |
- writable stream은 즉시 data를 kernel buffer에 flush하지만 그렇게 되지 않을 경우에 메모리 queue에 쌓아둔다. write method가 true를 리턴하며 flush된 것이고 false를 리턴하면 queue에 들어간 것이다.
- stream이 대기하고 있는 버퍼를 모두 flush했을 경우 drain 이벤트를 발생시킨다.
var writable_stream = ...; writable_stream.on('drain',function(){ console.log('drain emitted'); }); |
* File-System Stream 생성
- readable file stream 생성
var fs=require('fs'); var path='./ex1301311.js'; var readable_stream=fs.createReadStream(path,{encoding:'utf8'});//1) readable_stream.on('data',console.log); |
1) 다음의 option을 지정 가능하다
encoding : 데이터의 encoding, null이면 raw buffer
fd : file description을 가지고 있으면 지정
bufferSize : 기본 64KB
start : 읽기 위한 첫번째 바이트 위치
end : 읽기 위한 마지막 바이트 위치
var fs=require('fs'); var path='./ex1301311.js'; fs.open(path,'r',function(err,fd){ var readable_stream=fs.createReadStream(null,{fd:fd,encoding:'utf8'}); readable_stream.on('data',console.log); }); |
- writable file stream 생성
var fs = require('fs'); var w_stream=fs.createWritableStream('./ex1301313w.txt',{flags:'w',encoding:utf8,mode:066}); //1) w_stream.write('hello writable stream'); w_stream.on('drain',function(){ console.log('write completed..'); }); w_stream.end(); |
1) option 지정이 가능하다. flags, encoding, mode 이 코드를 실행하면 다음과 같은 파일이 생성된다.
iui-MacBook-Pro:node_exam alnova2$ ls -al ex1301311w.txt ----r--r-- 1 alnova2 staff 21 1 31 11:32 ex1301311w.txt iui-MacBook-Pro:node_exam alnova2$ |
* Slow client problem
- 상대적으로 빠른 File System의 Readable Stream 에서 느린 Network(TCP)의 Writable Stream으로 데이터를 전송하는 경우에 다음의 코드는 메모리 버퍼를 빠르게 증가 시킨다.
require('http').createServer(function(req,res){ var rs = fs.createReadStream('./transfer.txt'); res.on('data',function(data){ res.write(data); }); rs.on('end',function(){ res.end(); }); }).listen(8080); |
- drain 이벤트를 이용한 해 결
require('http').createServer(function(req,res){ var rs=fs.createReadStream('./transfer.txt'); res.on('data',function(data){ if(!res.write(data)){ rs.pause(); } }); res.on('drain',function(){ rs.resume(); }); rs.on('end',function(){ res.end(); }); }).listen(8080); |
- pipe()를 이용한 해결
require('http').createServer(function(req,res){ var rs=fs.createReadStream('./transfer.txt'); rs.pipe(res,{end:false}); rs.on('end',function(){ res.write("This is end.."); res.end(); }); }); |