目次

dart:io

dart:io ライブラリは、ファイル、ディレクトリ、プロセス、ソケット、WebSocket、および HTTP クライアントとサーバーを扱うための API を提供します。

一般的に、dart:io ライブラリは非同期 API を実装し、推進しています。同期メソッドはアプリケーションを簡単にブロックし、スケーリングを困難にする可能性があります。したがって、ほとんどの操作は、Node.js などの最新のサーバープラットフォームで一般的なパターンである、Future または Stream オブジェクトを介して結果を返します。

dart:io ライブラリのいくつかの同期メソッドは、メソッド名に Sync サフィックスが明確にマークされています。ここでは、同期メソッドについては説明しません。

dart:io ライブラリを使用するには、インポートする必要があります。

dart
import 'dart:io';

ファイルとディレクトリ

#

I/O ライブラリを使用すると、コマンドラインアプリはファイルの読み書きやディレクトリの参照を行えます。ファイルのコンテンツを読み取るには、一度にすべて読み込むか、ストリーミングするかの 2 つの選択肢があります。ファイルを一度にすべて読み込むには、ファイルのすべてのコンテンツを格納するのに十分なメモリが必要です。ファイルが非常に大きい場合、または読み取りながら処理する場合は、ファイル内容のストリーミングで説明されているように、Stream を使用する必要があります。

ファイルをテキストとして読み込む

#

UTF-8 を使用してエンコードされたテキストファイルを読み取る場合、readAsString() を使用してファイルの内容全体を読み取ることができます。個々の行が重要な場合は、readAsLines() を使用できます。どちらの場合も、ファイルの内容を 1 つ以上の文字列として提供する Future オブジェクトが返されます。

dart
void main() async {
  var config = File('config.txt');

  // Put the whole file in a single string.
  var stringContents = await config.readAsString();
  print('The file is ${stringContents.length} characters long.');

  // Put each line of the file into its own string.
  var lines = await config.readAsLines();
  print('The file is ${lines.length} lines long.');
}

ファイルをバイナリとして読み込む

#

次のコードは、ファイル全体をバイトとして整数のリストに読み込みます。readAsBytes() の呼び出しは Future を返し、利用可能になると結果を提供します。

dart
void main() async {
  var config = File('config.txt');

  var contents = await config.readAsBytes();
  print('The file is ${contents.length} bytes long.');
}

エラー処理

#

キャッチされない例外が発生しないようにエラーをキャプチャするには、Future に catchError ハンドラーを登録するか、(async 関数で) try-catch を使用できます。

dart
void main() async {
  var config = File('config.txt');
  try {
    var contents = await config.readAsString();
    print(contents);
  } catch (e) {
    print(e);
  }
}

ファイル内容のストリーミング

#

少しずつファイルを読み取るには、Stream を使用します。Dart の非同期サポートの一部であるStream APIまたは await for のいずれかを使用できます。

dart
import 'dart:io';
import 'dart:convert';

void main() async {
  var config = File('config.txt');
  Stream<List<int>> inputStream = config.openRead();

  var lines = utf8.decoder.bind(inputStream).transform(const LineSplitter());
  try {
    await for (final line in lines) {
      print('Got ${line.length} characters from stream');
    }
    print('file is now closed');
  } catch (e) {
    print(e);
  }
}

ファイル内容の書き込み

#

ファイルにデータを書き込むには、IOSink を使用できます。書き込み可能な IOSink を取得するには、File openWrite() メソッドを使用します。デフォルトモードである FileMode.write は、ファイル内の既存のデータを完全に上書きします。

dart
var logFile = File('log.txt');
var sink = logFile.openWrite();
sink.write('FILE ACCESSED ${DateTime.now()}\n');
await sink.flush();
await sink.close();

ファイルの末尾に追加するには、オプションの mode パラメータを使用して FileMode.append を指定します。

dart
var sink = logFile.openWrite(mode: FileMode.append);

バイナリデータを書き込むには、add(List<int> data) を使用します。

ディレクトリ内のファイルのリスト表示

#

ディレクトリのすべてのファイルとサブディレクトリを検索することは、非同期操作です。list() メソッドは、ファイルまたはディレクトリが検出されたときにオブジェクトを発行する Stream を返します。

dart
void main() async {
  var dir = Directory('tmp');

  try {
    var dirList = dir.list();
    await for (final FileSystemEntity f in dirList) {
      if (f is File) {
        print('Found file ${f.path}');
      } else if (f is Directory) {
        print('Found dir ${f.path}');
      }
    }
  } catch (e) {
    print(e.toString());
  }
}

その他の一般的な機能

#

File および Directory クラスには、以下を含むがこれらに限定されない、その他の機能が含まれています。

  • ファイルまたはディレクトリの作成: File および Directory の create()
  • ファイルまたはディレクトリの削除: File および Directory の delete()
  • ファイルの長さの取得: File の length()
  • ファイルへのランダムアクセスの取得: File の open()

メソッドの完全なリストについては、File および Directory の API ドキュメントを参照してください。

HTTP クライアントとサーバー

#

dart:io ライブラリは、コマンドラインアプリが HTTP リソースにアクセスしたり、HTTP サーバーを実行したりするために使用できるクラスを提供します。

HTTP サーバー

#

HttpServer クラスは、Web サーバーを構築するための低レベルの機能を提供します。リクエストハンドラーのマッチング、ヘッダーの設定、データのストリーミングなどを行うことができます。

次のサンプル Web サーバーは、単純なテキスト情報を返します。このサーバーは、ポート 8888 およびアドレス 127.0.0.1 (localhost) でリッスンし、パス /dart のリクエストに応答します。他のパスの場合、応答はステータスコード 404 (ページが見つかりません) になります。

dart
void main() async {
  final requests = await HttpServer.bind('localhost', 8888);
  await for (final request in requests) {
    processRequest(request);
  }
}

void processRequest(HttpRequest request) {
  print('Got request for ${request.uri.path}');
  final response = request.response;
  if (request.uri.path == '/dart') {
    response
      ..headers.contentType = ContentType(
        'text',
        'plain',
      )
      ..write('Hello from the server');
  } else {
    response.statusCode = HttpStatus.notFound;
  }
  response.close();
}

HTTP クライアント

#

HTTP リクエストを行うために dart:io を直接使用することは避ける必要があります。dart:ioHttpClient クラスは、プラットフォームに依存し、単一の実装に結び付けられています。代わりに、package:http のような高レベルのライブラリを使用してください。

インターネットからデータを取得のチュートリアルでは、package:http を使用して HTTP リクエストを行う方法を説明しています。

詳細情報

#

このページでは、dart:io ライブラリの主要な機能の使用方法を示しました。このセクションで説明した API に加えて、dart:io ライブラリは、プロセスソケット、および Web ソケットの API も提供します。サーバーサイドおよびコマンドラインアプリの開発の詳細については、サーバーサイドの Dart の概要を参照してください。