Back Ground

NodeJs - 스트림 단위로 파일 읽고 쓰기 [ES5] 본문

Javascript/Node.js

NodeJs - 스트림 단위로 파일 읽고 쓰기 [ES5]

Back 2018. 9. 18. 11:33


스트림은 

데이터, 패킷 ,비트 등의 일련 연속성을 갖는 흐름을 의미하는데

-음성,영상,데이터 등의 작은 조각들을 하나의 줄기를 이루어 전송하는 데이터열이다. 


보통 사용하는 이유는

물리 디스크상의 파일, 장치들을 통일된 방식으로 다루기 위한 가상적인 개념인데

스트림은 어디서 나왔는지 어디로 가는지 신경 쓸 필요없이 자유롭게

어떤 장치 및 프로세스, 화일들과 연결 될 수 있어서 

개발자들에게 편리하다.

(대충 사전에서 긁어서 요약 해옴)




Node에서도 Stream을 사용 할 수 있다.


1
var fs = require('fs');
cs
이 또한 파일 모듈을 가져와서

입력 / 출력 스트리밍이 가능하다.




.createReadStream 출력

메소드

1
var inF = fs.createReadStream('./study/day_05/aaa.txt',{flags:'r'});
cs

매개변수

파일 경로, { 플레그  : r (Read) } 

※파일 경로는 노드가 실행되는 시점 기준






.createWriteStream 입력

메소드

1
var outF = fs.createWriteStream('./study/day_05/bbb.txt',{flags:'w'});
cs
매게변수
파일경로, { 플레그 : w (write) }
※파일 경로는 노드가 실행되는 시점 기준









그런데 의문인건 
함수 이름이 이미 Read 와 Write 가 들어가는데.
flags를 쓸 필요가 있는것일까???

https://nodejs.org/api/fs.html#fs_fs_createwritestream_path_options

에 들어가보면 

 flags <string> See support of file system flagsDefault: 'w'.

적용 안할시 기본값으로 들어가는 것을 알 수 있다.









읽고 쓰는 스트림을 예제를 만들기 위해 

.on('data') 와 

.on('end') 를 이용하였다.


예제)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var fs = require('fs');
 
var inF = fs.createReadStream('./study/day_05/aaa.txt',{flags:'r'});
var outF = fs.createWriteStream('./study/day_05/bbb.txt',{flags:'w'});
 
inF.on('data',function(fileData){
    console.log("읽기 :" + fileData); //""+ 문자열인지 인지를 하지 않으면 출력 안나옴
    outF.write(fileData);
});
 
inF.on('end',function(){
    console.log("읽기 종료");
    outF.end(function(){
       console.log("쓰기 종료"
    });
})
cs


.on('data') : 스트림 데이터를 방출하는 이벤트

setEncoding()을 사용한 경우 'data' 이벤트가 버퍼(기본값) 또는 문자열을 내보낸다


.on('end') : 스트림 데이터를 종료 하는 이벤트

스트림에서 EOF(TCP 용어 FIN)가 수신되면 발생한다. 

더 이상 '데이터' 이벤트가 발생하지 않음을 나타낸다. 

종료하지 않으면 계속 스트림을 사용이 가능하다.


출처: https://millermedeiros.github.io/mdoc/examples/node_api/doc/streams.html





한번에 처리하는 방법 

.pipe() 사용


.pipe함수에는 .on('data') .on('end')를 할 필요없이

읽을 데이터를 쓰게 만들수 있다.


출력스트림.pipe(입력스트림)


예제)

1
2
3
4
5
6
7
var fs = require('fs');
 
var inF = fs.createReadStream('./study/day_05/aaa.txt',{flags:'r'});
var outF = fs.createWriteStream('./study/day_05/bbb.txt',{flags:'w'});
 
//여기것을 (여기에 쓰다)
inF.pipe(outF); //읽는것과 다는것까지 다 처리한다.
cs



그렇다면 pipe만 쓰면되지

왜 .on('data')  .on('end')를 쓰는가?


분명 읽고 쓸때 상황을 체크하거나 

그때 처리해야 하는 상황이 있을 수 있기에 

단순하게 처리할때는 .pipe()를 사용하면된다.


개발 용도에 맞춰서 사용 하기에 좋은 함수들이다.




Comments