JavaScript/Streams API

Streams API

Streams APIは、JavaScriptでデータをストリームとして扱うためのAPIです。ストリームは、大量のデータを小さなチャンクに分割して逐次的に処理するための仕組みです。これにより、メモリ効率が向上し、大規模なデータ処理が可能になります。本章では、Streams APIの基本的な概念と使い方を解説します。

基本的な概念

Streams APIでは、データを「読み取り可能なストリーム」(ReadableStream)、「書き込み可能なストリーム」(WritableStream)、および「変換ストリーム」(TransformStream)の3つの主要なタイプに分類します。

  • ReadableStream: データを読み取るためのストリーム。例えば、ファイルやネットワークからのデータを逐次的に読み取る場合に使用します。
  • WritableStream: データを書き込むためのストリーム。例えば、ファイルやネットワークにデータを逐次的に書き込む場合に使用します。
  • TransformStream: データを変換するためのストリーム。例えば、データを圧縮または解凍する場合に使用します。

ReadableStreamの使用例

以下は、ReadableStreamを使用してデータを逐次的に読み取る例です。

// テキストデータを生成するReadableStreamを作成
const readableStream = new ReadableStream({
  start(controller) {
    controller.enqueue("Hello, ");
    controller.enqueue("Streams API!");
    controller.close();
  }
});

// ストリームからデータを読み取る
const reader = readableStream.getReader();

reader.read().then(function processText({ done, value }) {
  if (done) {
    console.log("ストリームの読み取りが完了しました。");
    return;
  }
  console.log("読み取ったデータ:", value);
  return reader.read().then(processText);
});

このコードでは、ReadableStreamを作成し、そのストリームからデータを逐次的に読み取っています。controller.enqueueを使用してデータをストリームに追加し、controller.closeでストリームを閉じます。

WritableStreamの使用例

次に、WritableStreamを使用してデータを逐次的に書き込む例を示します。

// データを書き込むためのWritableStreamを作成
const writableStream = new WritableStream({
  write(chunk) {
    console.log("書き込まれたデータ:", chunk);
  },
  close() {
    console.log("ストリームが閉じられました。");
  }
});

// ストリームにデータを書き込む
const writer = writableStream.getWriter();

writer.write("Hello, ").then(() => {
  return writer.write("Streams API!");
}).then(() => {
  return writer.close();
});

このコードでは、WritableStreamを作成し、そのストリームにデータを逐次的に書き込んでいます。writer.writeを使用してデータを書き込み、writer.closeでストリームを閉じます。

TransformStreamの使用例

最後に、TransformStreamを使用してデータを変換する例を示します。

// テキストを大文字に変換するTransformStreamを作成
const transformStream = new TransformStream({
  transform(chunk, controller) {
    controller.enqueue(chunk.toUpperCase());
  }
});

// ReadableStreamとWritableStreamをTransformStreamに接続
const readableStream = new ReadableStream({
  start(controller) {
    controller.enqueue("hello, ");
    controller.enqueue("streams api!");
    controller.close();
  }
});

const writableStream = new WritableStream({
  write(chunk) {
    console.log("変換されたデータ:", chunk);
  },
  close() {
    console.log("ストリームが閉じられました。");
  }
});

readableStream
  .pipeThrough(transformStream)
  .pipeTo(writableStream);

このコードでは、TransformStreamを使用してデータを大文字に変換しています。pipeThroughメソッドを使用して、ReadableStreamWritableStreamTransformStreamに接続し、データを変換しています。

表: Streams APIの主要なメソッドとプロパティ

以下に、Streams APIの主要なメソッドとプロパティを表形式でまとめます。

クラス メソッド/プロパティ 説明
ReadableStream getReader() ストリームからデータを読み取るためのReadableStreamDefaultReaderを返す。
pipeTo(destination) ストリームをWritableStreamに接続し、データを転送する。
pipeThrough(transform) ストリームをTransformStreamに接続し、データを変換する。
WritableStream getWriter() ストリームにデータを書き込むためのWritableStreamDefaultWriterを返す。
close() ストリームを閉じる。
TransformStream readable 変換後のデータを読み取るためのReadableStreamを返す。
writable 変換前のデータを書き込むためのWritableStreamを返す。

まとめ

Streams APIを使用することで、大量のデータを効率的に処理することができます。ReadableStreamWritableStreamTransformStreamを組み合わせることで、柔軟なデータ処理が可能になります。本章で紹介したコード例と表を参考に、Streams APIの活用を進めてください。

カテゴリ:Streams API#* カテゴリ:JavaScript
カテゴリ:JavaScript カテゴリ:Streams API