Programming/웹프로그래밍

[NodeJs] 파일 입출력 I/O Stream

쌍쌍바나나 2016. 3. 31. 07:54
반응형

들어가며

  파일 입출력에 대해서 설명을 해드리겠습니다. NodeJs에서는 File I/O의 주요 함수는 동기식, 비동기식 그리고 Stream을 이용한 방식이 있습니다. NodeJs는 비동기 방식이기 때문에 순차적으로 함수를 수행하지 않습니다. 그렇기 때문에 만약에 큰 파일을 읽고 있는 상태에서, 만약 그 파일을 쓰는 코드를 작성할 경우에는 에러가 발생 할 수도 있으니 주의하셔야 합니다. 이런 경우에는 동기식으로 파일 읽기/쓰기를 하시면 문제없이 사용할 수 있습니다. 

파일입력 주요 함수

  • readFile('filename', 'encoding', callback(error, data));
  • readFileSync('fileㄱname', 'encoding') : data
  • writeFile('filename', data ,'encoding', callback(error));
  • writeFileSync('filename', data, 'encoding');
  • readdir('path', callback(error, files[]));
  • readdirSync('path') : files[]
  • createReadStream()
  • createWriteStream()

비동기 파일 읽기/쓰기

  파일을 처리할때는 fs모듈을 사용하시면 됩니다. 최초 파일을 읽을때 encoding문제가 발생할 수 있으니 'utf8'로 설정해 줍니다. 파일을 작성할 때도 동일하게 'utf8'을 지정해주면 됩니다. 동기식은 순차적으로 실행하지 않기 때문에 순서가 중요한 작업에서는 작성하시에는 동기식을 사용하는게 좋습니다.
// 비동기식 파일 읽기
var fs = require('fs');
fs.readFile('file.txt', 'utf8', function(error, data) {
	console.log(data);
});

// 비동기식 파일 쓰기
var fs = require('fs');
var data = "hi banana";
fs.writeFile('text.txt', data, 'utf8', function(error) {
	console.log('writeFile completed');
});

동기 파일 읽기/쓰기

  순서가 중요한 작업에서 사용하시면 됩니다. 만약 파일을 읽은 뒤에 그 내용을 바탕으로 어떤 처리를 하고, 마지막으로 파일에 쓰는 작업을 할 때 사용하시면 됩니다. 만약 이 작업을 비동기식으로 한다면 읽는 와중에 파일에 써지는 현상이 발생 할 수 있습니다. (파일 크기에 따라)
// 동기식 파일 읽기
var fs = require('fs');
var data = fs.readFileSync('text.txt', 'utf8');
console.log(data);
// 동기식 파일 쓰기
var fs = require('fs');
var data = 'hi banana';
fs.writeFileSync('text.txt', data, 'utf8');
console.log('writeFileSync completed');

대용량 파일 읽기/쓰기

  파일을 복사하거나, 쓰는 작업을 계속 하는 경우 (Editor 작성)에는 아래오 같은 방법을 사용하시면 됩니다. readStream과 writeStream을 통해 데이터를 읽고, 쓰기가 가능합니다. input.pipe(writer)를 하시면 파일을 복사한는 작업 또한 할 수 있습니다.

// 대용량 파일 읽기
var fs = require('fs');
var input = fs.createReadStream('./bigfile.txt');
input.on('data', function(chunk){ 
	console.log('read:' + chunck.toString());
});
// 대용량 파일 쓰기
var fs = require('fs');
var writer = fs.createWriteStream('bigfile.txt');
for (var i = 0; i < 1000; i ++) {
	writer.write('banana, #' + i + '\n');
}
writer.end('sold out');
writer.on('finish', function() {
	console.log('finish')
});


반응형