dart - 当我在从文件中读取文本中使用转换时,飞镖附加到文件
问题描述
在这个简单的代码中,我可以显示ids
完成读取文件并id
从文本文件中获取的所有内容,但是我想将获取的内容附加id
到JsonObjectTransformer
类中,而不是完成读取文件
Future<void> main() async {
final ids = await File('sample.json')
.openRead()
.transform(const Utf8Decoder())
.transform<dynamic>(JsonObjectTransformer())
.map((dynamic json) => json['id'] as String)
.toList();
print(ids); // [@123456, @123456]
}
class JsonObjectTransformer extends StreamTransformerBase<String, dynamic> {
static final _openingBracketChar = '{'.codeUnitAt(0);
static final _closingBracketChar = '}'.codeUnitAt(0);
@override
Stream<dynamic> bind(Stream<String> stream) async* {
final sb = StringBuffer();
var bracketsCount = 0;
await for (final string in stream) {
for (var i = 0; i < string.length; i++) {
final current = string.codeUnitAt(i);
sb.writeCharCode(current);
if (current == _openingBracketChar) {
bracketsCount++;
}
if (current == _closingBracketChar && --bracketsCount == 0) {
yield json.decode(sb.toString());
sb.clear();
}
}
}
/*for example this line*/
//new File('test.txt').writeAsStringSync(sb.toString(), mode: FileMode.APPEND);
}
}
我怎样才能做到这一点?
解决方案
有多种方法可以做到这一点,但一种简单的方法是更改JsonObjectTransformer
如下:
class JsonObjectTransformer extends StreamTransformerBase<String, dynamic> {
static final _openingBracketChar = '{'.codeUnitAt(0);
static final _closingBracketChar = '}'.codeUnitAt(0);
@override
Stream<dynamic> bind(Stream<String> stream) async* {
final sb = StringBuffer();
var bracketsCount = 0;
final ioSink = File('test.txt').openWrite(mode: FileMode.append);
await for (final string in stream) {
for (var i = 0; i < string.length; i++) {
final current = string.codeUnitAt(i);
sb.writeCharCode(current);
if (current == _openingBracketChar) {
bracketsCount++;
}
if (current == _closingBracketChar && --bracketsCount == 0) {
final dynamic jsonObject = json.decode(sb.toString());
ioSink.writeln(jsonObject['id'] as String);
yield jsonObject;
sb.clear();
}
}
}
await ioSink.flush();
await ioSink.close();
}
}
一个更干净的解决方案(因为我们需要一些单独的关注点)是Stream
在解析每个对象时使用 main 中的 ID 来编写 ID。如何做到这一点的一个例子是:
Future<void> main() async {
final file = File('test.txt').openWrite(mode: FileMode.append);
final ids = <String>[];
await File('sample.json')
.openRead()
.transform(const Utf8Decoder())
.transform<dynamic>(JsonObjectTransformer())
.map((dynamic json) => json['id'] as String)
.forEach((id) {
file.writeln(id);
ids.add(id);
});
await file.flush();
await file.close();
print(ids); // [@123456, @123456]
}
推荐阅读
- python - 从 wine 编译时出现 Cx_Freeze 错误
- flutter - 如何防止底片消失颤动
- c++ - 有没有办法用复合键和复合值创建一个 STL 映射?
- ios - 有没有办法通过 telprompt URL 方案从 iOS 应用程序进行隐藏调用?
- postman - Clockify Api - 获取过去 24 小时内每个用户的小时数
- eclipse-scout - 如何从 Scout 客户端代码访问请求 HttpSession?
- typescript - 条件类型中的 boolean[] 扩展为 true[] | 错误的[]
- android - 用于搜索查询的 Android 分页
- angular - 通过 ng-content 从子组件访问组件提供者
- c# - 使用动态方法参数实现接口时的 xUnit System.TypeLoadException