自分用メモです。
ベタに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系のメソッドは、一旦全部を読み込んで文字列変換するので、巨大なファイルを開くときには良くないみたい。