メインコンテンツにスキップ

dart:io

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

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

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を使用してファイルにデータを書き込むことができます。FileopenWrite()メソッドを使用して、書き込み可能なIOSinkを取得します。デフォルトのモード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ライブラリはプロセス、ソケット、およびWebSocket用のAPIも提供します。サーバーサイドおよびコマンドラインアプリ開発の詳細については、サーバーサイドDartの概要を参照してください。