[Node.JS]バッファとストリーム

17121 ワード

1.バッファとフロー


1.1バッファ


バッファは、メモリに一時的に格納されるデータです.10 MBファイルを読み込んでいる場合は、10 MBサイズのバッファが必要です.
const buffer = Buffer.from('저를 버퍼로 바꿔보세요');
console.log('from():', buffer);
console.log('length: ', buffer.length);
console.log('toString():', buffer.toString());

const array = [Buffer.from('띄엄'), Buffer.from('띄엄'), Buffer.from('띄어쓰기')];

const buffer2 = Buffer.concat(array);
console.log('concat(): ', buffer2.toString());

const buffer3 = Buffer.alloc(5);
console.log('alloc(): ', buffer3);
以上のコードの出力結果は以下の通りです.
from(): <Buffer ec a0 80 eb a5 bc 20 eb b2 84 ed 8d bc eb a1 9c 20 eb b0 94 ea bf 94 eb b3 b4 ec 84 b8 ec 9a 94>
length:  32
toString(): 저를 버퍼로 바꿔보세요
concat():  띄엄띄엄띄어쓰기
alloc():  <Buffer 00 00 00 00 00>
PS C:\Users\USER\Desktop\공부\textbook> 
ノードにはBufferという名前のオブジェクトが含まれているので、バッファを処理できます.
Bufferのオブジェクトは次のとおりです.
  • Buffer.from(文字列):文字列をバッファ
  • に変換する
  • Buffer.toString(バッファ):バッファを文字列
  • に変換
  • Buffer.concoat(タイ):タイリング形式のバッファを
  • にマージ
  • Buffer.alloc(バイト):バッファにバイトサイズの空間を割り当てます.
  • 1.2フロー


    バッファには読み取りサイズに等しいスペースが必要です.したがって、読み込むファイルが非常に大きい場合は、気まずい思いをします.したがって、読み出すコンテンツをブロックに分けて、少しずつ読み取る方法が必要です.これは流れです.

    ストリームによる読み取り

    const fs = require('fs');
    
    const readStream = fs.createReadStream('./readme3.txt', {highWaterMark : 16});
    // readme3.txt를 읽을 스트림을 만들어 줍니다.
    const data = [];
    // 읽은 chunk를 저장할 빈 공간을 만들어 줍니다.
    
    readStream.on('data', (chunk)=>{ //16byte의 크기의 버퍼로 읽어옴
      data.push(chunk); // data 배열에 읽어온 chunk 추가
      console.log('raw data :', chunk, ' length :', chunk.length);
    });
    
    readStream.on('end', ()=>{ // 다 읽었으면
      console.log('end : ', Buffer.concat(data).toString());
      // data 배열에 담긴 chunk들을 버퍼로 합치고 문자열 변환
    });
    
    readStream.on('error', (err)=>{
      console.log('error : ', err);
    });
    // 오류 처리
    以上のコードの出力結果は以下の通りです.
    raw data : <Buffer ec a0 80 eb 8a 94 20 ec a1 b0 ea b8 88 ec 94 a9>  length : 16
    raw data : <Buffer 20 ec a1 b0 ea b8 88 ec 94 a9 20 eb 82 98 eb 88>  length : 16
    raw data : <Buffer a0 ec 84 9c 20 ec a0 84 eb 8b ac ed 95 a9 eb 8b>  length : 16
    raw data : <Buffer 88 eb 8b a4 2e 20 eb 82 98 eb 88 a0 ec a7 84 20>  length : 16
    raw data : <Buffer ec a1 b0 ea b0 81 ec 9d 84 20 63 68 75 6e 6b eb>  length : 16
    raw data : <Buffer 9d bc ea b3 a0 20 ed 95 a9 eb 8b 88 eb 8b a4 2e>  length : 16
    end :  저는 조금씩 조금씩 나눠서 전달합니다. 나눠진 조각을 chunk라고 합니다.
    16バイトのデータブロック3を読み出します.txtを読み込んでいるかどうかを確認できます.

    ストリームによる書き込み

    const fs = require('fs');
    
    const writeStream = fs.createWriteStream('./writeme2.txt');
    // 파일을 작성할 stream 생성
    writeStream.on('finish', ()=>{ // 파일 작성이 완료되면
      console.log('파일 쓰기 완료');
    });
    
    writeStream.write('이 글을 씁니다');
    // 스트림에 '이 글을 씁니다' 작성
    writeStream.write(' 한번 더 씁니다');
    // 스트림에 '한번 더 씁니다' 작성
    writeStream.end();
    // 스트림에 종료 알리기
    上記のコードを実行すると、
    이 글을 씁니다 한번 더 씁니다
    write2.生成されたtxtファイルは以下のようになります.
    この配置例コードはノードです.js教科書(趙賢英、吉友)から抜粋.