Study/Node.js

[노드JS] 파일을 직접 열고 닫으면서 읽거나 쓰기

AC 2019. 3. 23. 22:00




『파일을 직접 열고 닫으면서 

읽거나 쓰기

______________________________________________


실제로 파일을 읽거나 쓸 때는 한꺼번에 모든 데이터를 읽거나 쓰지 않고 조금씩 읽거나 쓰는 방식을 사용하는 경우도 많다.


또한, 다른 곳에서 받아 온 데이터를 파일에 쓰는 경우도 있기 때문에 파일을 다루는 다양한 방식이 따로 정의되어 있다.


파일을 직접 열고 닫으면서 읽거나 쓰고 싶다면 다음 메소드들을 사용할 수 있다.


메소드 이름 

설명 

 open(path, flags, [mode], [callback]

 파일을 연다. 

 read(fd, buffer, offset, length, position, [callback] 

 지정한 부분의 파일 내용을 읽어 들인다. 

 write(fd, buffer, offset, length, position, [callback] 

 파일의 지정한 부분에 데이터를 쓴다. 

 close(fd, [callback]) 

 파일을 닫아 준다. 

[표] 파일을 직접 열고 닫으면서 일부분만 읽거나 쓰기 위한 메소드




파일의 내용을 일부분만 읽어 들이려면 먼저 open() 메소드로 파일을 열어야 한다. 파일을 열고 데이터 쓰기 기능을 만들려면 새로운 자바스크립트 파일 ch04_test8.js를 만들고 다음 코드를 입력한다.




-----------------------------------------------------------



var fs = require('fs');


// 파일에 데이터를 쓴다.


fs.open('./output.txt', 'w', function(err, fd){

    if(err) throw err;

    

    var buf = new Buffer('안녕!\n');

    fs.write(fd, buf, 0, buf.length, null, function(err, written, buffer){

        if(err) throw err;

        

        console.log(err, written, buffer);

        fs.close(fd, function(){

            console.log('파일 열고 데이터 쓰고 파일 닫기 완료.');

        });

    });

});


-----------------------------------------------------------


이 코드를 보면 함수를 호출할 때마다 파라미터로 함수를 전달하고 있다. 따라서 함수 안에 함수가 들어가는 형태가 되므로 함수 호출의 순서가 중요하다. 함수를 호출하는 순서는 'open -> write -> close' 이다.




▲ 파일을 열어 데이터를 쓴 후 파일을 닫는 과정



먼저 open() 메소드를 호출하면 파이릉ㄹ 열 수 있다. 그리고 파일을 열면 write() 메소드를 사용해서 데이터를 쓸 수 있다.


데이터는 필요한 만큼 Buffer 객체 안에 쓴다. 파일에 데이터를 쓰고 나면 close() 메소드를 호출하여 파일을 닫는다.


이렇게 각 메소드를 호출할 때마다 콜백 함수를 파라미터로 전달하므로 각각의 기능이 실행을 끝냈을 때 그 다음 메소드를 실행한다.


파일을 열기 위해 open() 메소드를 호출할 때 동시에 세 개의 파라미터가 전달되었다. 첫 번째는 파일의 이름, 두 번째는 파일을 읽거나 쓰기 위한 플래그이다. 



대표적인 플래그로는 'r', 'w', 'w+', 'a+' 가 있다.



플래그 

설명 

'r' 

읽기에 사용하는 플래그이다. 파일이 없으면 예외가 발생한다. 

'w' 

쓰기에 사용하는 플래그이다. 파일이 없으면 만들어지고 파일이 있으면 이전 내용을 모두 삭제한다. 

'w+' 

읽기와 쓰기에 모두 사용하는 플래그이다. 파일이 없으면 만들어지고 파일이 있으면 이전 내용을 모두 삭제한다. 

'a+' 

읽기와 추가에 모두 사용하는 플래그이다. 파일이 없으면 만들어지고 있으면 이전 내용에 새로운 내용을 추가한다. 

[표] 파일을 열 때 사용하는 대표적인 플래그



코드에서는 'w' 플래그를 사용하였으므로 쓰기 작업만을 위해 파일을 연다. 콜백 함수안에서는 버퍼 객체를 하나 만들고 '안녕!'이라는 글자를 넣은 후 write() 메소드를 호출하여 파일에 내용을 쓴다.


파일이 열리면 fd 객체를 전달받을 수 있으므로 이 fd 객체로 파일을 구별한다. 파일에 데이터를  쓸 때 어느 위치에 쓸 것인지 정할 수 있다.


코드를 모두 입력한 후 실행하면 파일이 만들어지는데, 다음과 같이 그 파일에 쓴 내용이 콘솔 창에 표시된다.





▲ 파일을 열고 데이터를 쓴 후 파일을 닫는 프로그램의 실행 결과


※ 읽어 들인 파일 내용이 콘솔에 출력되지 않을 경우에는 명령 프롬프트에서 실행하기 바란다.


이번에는 앞에서 만들어진 파일을 읽어 들이는 코드를 만들어보자.


파일을 읽어 들일 때도 파일을 먼저 열고 난 후 데이터를 읽어 들인다.



---------------------------------------------------------------------------------



var fs = require('fs');


// 파일에서 데이터를 읽어 들인다.


fs.open('./output.txt', 'r', function(err, fd){

    

    if(err) throw err;

    

    var buf = new Buffer(10);

    console.log('버퍼 타입 : %s', Buffer.isBuffer(buf));

    

    fs.read(fd, buf, 0, buf.length, null, function(err, bytesRead, buffer){

       if(err) throw err;

        

        var inStr = buffer.toString('utf8', 0, bytesRead);

        console.log('파일에서 읽은 데이터 : %s', inStr);

        

        console.log(err, bytesRead, buffer);

        

        fs.close(fd, function(){

           console.log('output.txt 파일을 열고 읽기 완료') ;

        });

    });

    

});


---------------------------------------------------------------------------------



Buffer 객체는 바이너리 데이터를 읽고 쓰는 데 사용한다. 새로운 버퍼 객체를 만들기 위해서는 new 연산자를 사용하며,


그 안에 들어갈 바이트(byte) 데이터의 크기만 지정하면 된다. write() 메소드를 사용해 문자열을 버퍼에 쓰거나 처음부터 문자열을 사용해 버퍼 객체를 만들 수도 있다. 파일을 실행하면 파일에서 읽은 데이터가 콘솔 창에 출력된다.



▲ 파일을 열고 데이터를 읽은 후 콘솔 창에 보여준 결과





LIST