我正在尝试用Dart语言处理大型文本文件.这些文件的大小超过100 MB.
我试过readAsLines和库的readAsLinesSync方法dart:io.每次我的内存耗尽:Exhausted heap space.
有没有办法像其他语言一样逐行或逐字节地读取文件?
我正在尝试围绕 Dart Streams 进行思考。特别是这个命令行实用程序示例cat具有以下代码行:
Stream<List<int>> stream = new File(path).openRead();
// Transform the stream using a `StreamTransformer`. The transformers
// used here convert the data to UTF8 and split string values into
// individual lines.
return stream
.transform(UTF8.decoder)
.transform(const LineSplitter())
.listen((line) {
if (showLineNumbers) {
stdout.write('${lineNumber++} ');
}
stdout.writeln(line);
}).asFuture().catchError((_) => _handleError(path));
Run Code Online (Sandbox Code Playgroud)
Stream<T>as的声明Stream<List<int>>让我有点困惑。为什么不将其声明为Stream<int>. List<> 类型如何使它与众不同。如果是列表,订阅者事件是否以某种方式缓冲?
什么类型(如<T>)被传递给第一个转换?它是一个int还是一个List<int>?
传递给每个下一个转换的类型以及决定它们的类型的因素。
此示例是否在将转换结果传递给下一个转换之前读取整个文件?如果是这样,是否有关于如何流式传输非常大的文件的示例,类似于这个 Node 问题Parsing large logfiles in Node.js - read …
我希望用户在文本字段中输入文本。当用户单击 fab 时,文本将作为新行写入文件(附加)。我希望我的应用程序读取文件的内容,并将每一行显示为列表视图中输入文本字段下方的列表图块。当用户输入新文本时,该文本应立即出现在列表视图中。
我能够将文本写入文件。但如何读取文件并显示其内容呢?我应该使用streambuilder吗?下面是我到目前为止所做的代码:
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
void main() {
runApp(new MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Path Provider',
theme: new ThemeData(
primarySwatch: Colors.blue,
),
home: new MyHomePage(title: 'Path Provider', storage: FileStorage(),),
);
}
}
class FileStorage {
Future<String> get _localPath async {
final directory = await getTemporaryDirectory();
return directory.path;
}
Future<File> get _localFile async {
final path = await _localPath;
return File('$path/file.txt'); …Run Code Online (Sandbox Code Playgroud)