LoginSignup
4
1

More than 5 years have passed since last update.

Dartメモ:ファイルの読み込み

Posted at

自分用メモです。

ベタにStreamで読む方法

標準入力と同じお作法でいくならばこんなかんじ。

ファイル読み込み
import 'dart:io';
import 'dart:convert';

void main() {
    new File("something.text").openRead()
        .transform(UTF8.decoder)
        .transform(const LineSplitter())
        .forEach((line) {
            print("> $line");
        });
}

便利メソッドを使う方法(大きなファイルには不向き)

dart:ioのソースを見てみると、いくつか便利メソッドが定義されている。

/sdk/lib/io/file_impl.dart

  Future<String> readAsString({Encoding encoding: utf8}) =>
      readAsBytes().then((bytes) => _tryDecode(bytes, encoding));

  String readAsStringSync({Encoding encoding: utf8}) =>
      _tryDecode(readAsBytesSync(), encoding);

  Future<List<String>> readAsLines({Encoding encoding: utf8}) =>
      readAsString(encoding: encoding).then(const LineSplitter().convert);

  List<String> readAsLinesSync({Encoding encoding: utf8}) =>
      const LineSplitter().convert(readAsStringSync(encoding: encoding));

readAsLinesとかを使うと

readAsLinesを使ってファイル読み込み
import 'dart:io';
import 'dart:convert';

void main() {
    new File("some.txt").readAsLines()
        .then((lines) {
            for (String line in lines) {
                print("> $line");
            }
        });
}
readAsLinesを使ってファイル読み込み(2)
import 'dart:io';
import 'dart:convert';

void main() async {
    for (String line in await new File("some.txt").readAsLines()) {
        print("> $line");
    }
}

こんな書き方ができる。

ただ、readAsXXXXX系のメソッドは、一旦全部を読み込んで文字列変換するので、巨大なファイルを開くときには良くないみたい。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1