Node.js - バッファ: 初心者向けガイド

こんにちは、未来のNode.js魔術師たち!Node.jsのバッファの世界へのエキサイティングな旅に、あなた们的案内役として誇りに思います。私がプログラミングを教えてきた年月の中で、バッファはNode.jsにおけるデータ操作の見えないヒーローです。初めて見ると少し不思議に思うかもしれませんが、このチュートリアルの終わりまでに、プロのように扱えるようになるでしょう!

Node.js - Buffers

バッファとは?

本題に入る前に、基本から始めましょう。砂山を動かそうとしているとします。一粒ずつ動かすこともできますが、それは永遠に続きます!代わりにバケツを使います。Node.jsの世界では、バッファがそのバケツです。効率的にデータを扱うお手伝いをしてくれます。

バッファは固定サイズのメモリのチャンクで、V8 JavaScriptエンジン之外に割り当てられます。ファイル操作やネットワークプロトコル、バイナリデータのストリームを扱うシーンなどで特に役立ちます。

バッファの作成

まず、最初のバッファを作成してみましょう:

const buf1 = Buffer.alloc(10);
console.log(buf1);

このコードを実行すると、こんな出力が見えます:

<Buffer 00 00 00 00 00 00 00 00 00 00>

何が起きたのでしょう?10バイトのサイズのバッファを作成し、すべてのバイトが0で初期化されました。まるで新しい、きれいなバケツを手に入れたようなものです。

次に、初期内容のあるバッファを作成してみましょう:

const buf2 = Buffer.from('Hello, Node.js!');
console.log(buf2);

出力:

<Buffer 48 65 6c 6c 6f 2c 20 4e 6f 64 65 2e 6a 73 21>

ここでは、文字列からバッファを作成しています。見えるそれぞれの数字は、文字列の各文字のASCIIコードです。クールですね?

静的メソッド

Node.jsはバッファを扱うためのいくつかの静的メソッドを提供しています。最もよく使われるものを見てみましょう。

Buffer.alloc()

このメソッドは、指定されたサイズの新しいバッファを作成し、すべてのバイトを0で初期化します。

const buf3 = Buffer.alloc(5);
console.log(buf3); // <Buffer 00 00 00 00 00>

Buffer.from()

このメソッドは、配列、他のバッファ、または文字列から新しいバッファを作成します。

const buf4 = Buffer.from([1, 2, 3, 4, 5]);
console.log(buf4); // <Buffer 01 02 03 04 05>

const buf5 = Buffer.from('Hello');
console.log(buf5); // <Buffer 48 65 6c 6c 6f>

Buffer.concat()

このメソッドは、バッファのリストを結合します。

const buf6 = Buffer.from('Hello');
const buf7 = Buffer.from(' World');
const buf8 = Buffer.concat([buf6, buf7]);
console.log(buf8.toString()); // Hello World

以下は、これらの静的メソッドの摘要です:

メソッド 説明
Buffer.alloc() 指定されたサイズの新しいバッファを作成 Buffer.alloc(10)
Buffer.from() 配列、バッファ、または文字列からバッファを作成 Buffer.from('Hello')
Buffer.concat() バッファのリストを結合 Buffer.concat([buf1, buf2])

メソッドのリファレンス

バッファを作成したところで、それらを扱うためのメソッドを見てみましょう。

buf.toString()

このメソッドは、指定された文字エンコーディングに基づいてバッファを文字列にデコードします。

const buf9 = Buffer.from('Hello, Buffer!');
console.log(buf9.toString()); // Hello, Buffer!
console.log(buf9.toString('hex')); // 48656c6c6f2c2042756666657221

buf.write()

このメソッドは、文字列をバッファに書き込みます。

const buf10 = Buffer.alloc(20);
buf10.write('Hello');
console.log(buf10.toString()); // Hello

buf.slice()

このメソッドは、指定された開始および終了インデックスに基づいて新しいバッファを返します。

const buf11 = Buffer.from('Hello, Buffer!');
const slicedBuf = buf11.slice(0, 5);
console.log(slicedBuf.toString()); // Hello

以下は、これらのメソッドの摘要です:

メソッド 説明
buf.toString() バッファを文字列にデコード buf.toString()
buf.write() 文字列をバッファに書き込み buf.write('Hello')
buf.slice() 新しいバッファを返す buf.slice(0, 5)

クラスメソッド

最後に、バッファを扱う際に特に便利ないくつかのクラスメソッドを見てみましょう。

Buffer.isBuffer()

このメソッドは、オブジェクトがバッファかどうかをチェックします。

const buf12 = Buffer.from('Hello');
console.log(Buffer.isBuffer(buf12)); // true
console.log(Buffer.isBuffer('Not a buffer')); // false

Buffer.byteLength()

このメソッドは、文字列またはバッファのバイト数を返します。

console.log(Buffer.byteLength('Hello')); // 5
console.log(Buffer.byteLength('?')); // 4 (この絵文字は4バイトです)

以下は、これらのクラスメソッドの摘要です:

メソッド 説明
Buffer.isBuffer() オブジェクトがバッファかどうかをチェック Buffer.isBuffer(obj)
Buffer.byteLength() 文字列またはバッファのバイト数を返す Buffer.byteLength('Hello')

そして、皆さん!Node.jsのバッファの土地を旅しました。バッファを作成し、その内容を操作するまでです。実践が大事です。実際のプロジェクトでバッファを使ってみてください。ファイルを読み取ってバッファに格納したり、ネットワークを通じてバッファデータを送信してみてください。使うほどに自然になります。

最後に、ちょっとしたバッファのジョークです:バッファはなぜ道路を渡るのか?他のバイトに会いに行くためです!(わかりますか?わかりますか?コードには固執しましょう...)

ハッピーコーディング、そしてあなたのバッファがいつも必要なデータで満たされることを祈っています!

Credits: Image by storyset