'Computer/javascript'에 해당되는 글 23건

  1. 2013.01.31 [node.js] 스트림을 이용한 Read/Write
반응형

* 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();

});

});




반응형
Posted by alias
,