노드

노드 pipe와 스트림 메모리 효율 확인

포칼이 2023. 4. 12. 16:06

스트림 데이터는 chunk로 데이터를 흘려 보내는데 이것이 마치 파이프애 액체가 흘러가는 것 같다~ 라고 해서 pipe라는 말을 쓴다. 스트림끼리 파이프를 연결할 수 있다.

//pipe.js
const fs = require('fs');

const readStream = fs.createReadStream('readme3.txt', {highWaterMark: 16});
const writeStream = fs.createWriteStream('writeme3.txt');
readStream.pipe(writeStream);
//writeme3.txt
저는 조금씩 조금씩 나눠서 전달됩니다. 나눠진 조각을 chunk라고 부릅니다.
노드 버퍼 노드 스트림 붕권 나락 마신 슈날 나찰 초풍 사자 더퍼

스트림으로 readme3.txt를 읽는다. 읽을때 16바이트씩 읽게 되고 그 데이터들은 pipe에 의해 writeme3.txt에 그 만큼씩 써지게 된다. 

 

파일을 압축해서 쓸 수도 있다.

//gzip.js
const zlib = require('zlib');
const fs = require('fs');

const readStream = fs.createReadStream('./readme3.txt', {highWaterMark: 16});
const zlibStream = zlib.createGzip();
const writeStream = fs.createWriteStream('./readme3.txt.gz');
readStream.pipe(zlibStream).pipe(writeStream);

 16 바이트씩 읽으면서 압축이 된다. 

다양한 pipe끼리 연결을 할 수 있는 것을 확인 할 수 있다. 

*pipe는 스트림을 지원하는 것끼리만 된다는 것을 명심하자.

 

access, mkdir, open, rename

파일 및 폴더 생성, 삭제

 

//fsCreate.js
const fs = require('fs');

fs.access('./folder', fs.constants.F_OK | fs.constants.R_OK | fs.constants.W_OK, (err) => {
  if (err) {
    if (err.code === 'ENOENT') {
      console.log('폴더 없음');
      fs.mkdir('./folder', (err) => {
        if (err) {
          throw err;
        }
        console.log('폴더 만들기 성공');
        fs.open('./folder/file.js', 'w', (err, fd) => {
          if (err) {
            throw err;
          }
          console.log('빈 파일 만들기 성공', fd);
          fs.rename('./folder/file.js', './folder/newfile.js', (err) => {
            if (err) {
              throw err;
            }
            console.log('이름 바꾸기 성공');
          });
        });
      });
    } else {
      throw err;
    }
  } else {
    console.log('이미 폴더 있음');
  }
});

 

fs.access(경로, 옵션, 콜백) : 폴더나 파일에 접근할 수 있는지를 체크한다. 두 번째 인자로 상수들을 넣었다. 

F_OK는 파일 존재 여부, R_OK는 읽기 권한 여부, W_OK는 쓰기 권한 여부를 체크한다.

파일/폴더나 권한이 없다면 에러가 방상하는데, 파일/폴더가 없을 때의 에러 코드는 ENOENT다. 

 

fs.mkdir(경로, 콜백) : 폴더를 만드는 메서드. 이미 폴더가 있다면 에러가 발생해서 먼저 access() 메서드를 호출해서 확인하는 작업이 필요하다.

 

fs.open(경로, 옵션, 콜백) : 파일의 아이디(fd 변수)를 가져오는 메서드. 파일이 없다면 파일을 생성한 뒤 그 아이디를 가져온다. 가져온 아이디를 사용해 fs.read() 나 fs.write()로 읽거나 쓸 수 있다. 

두 번째 인자로 어떤 동작을 할 것인지 설정할 수 있다. 쓰려면 w, 읽으려면 r, 기존 파일에 추가하려면 a다. 

위의 코드에서는 w로 설정해서 파일이 없을 때 새로 만들 수 있었다. r이었다면 에러가 발생한다. 

 

fs.rename(기존 경로, 새 경로, 콜백) : 파일의 이름을 바꾸는 메서드. 기존 파일 위치와 새로운 파일 위치를 적어주면 된다.

반드시 같은 폴더를 지정할 필요는 없다. 

 

fs.watch

파일을 감시하는 방법(변경 사항 발생 시 이벤트 호출)

//watch.js
const fs = require('fs');

fs.watch('./target.txt', (eventType, filename) => {
  console.log(eventType, filename);
});

target.txt가 바뀔 때마다 이런식으로 출력이 된다.