Dart RandomAccessFile
最后修改于 2025 年 4 月 4 日
Dart 中的 RandomAccessFile 类提供对文件的随机访问。它允许在文件内的特定位置进行读取和写入。
RandomAccessFile 是 Dart dart:io 库的一部分。它支持异步操作,对于高级文件操作至关重要。
基本定义
RandomAccessFile 表示一个已打开用于随机访问的文件。它提供了在文件内读取、写入和查找的方法。
主要功能包括位置操作、同步/异步操作以及直接字节访问。它对于二进制文件操作特别有用。
打开和读取文件
此示例展示了如何打开文件并读取其内容。
main.dart
import 'dart:io';
void main() async {
var file = File('data.txt');
var raf = await file.open(mode: FileMode.read);
var contents = await raf.read(await raf.length());
print(String.fromCharCodes(contents));
await raf.close();
}
我们以读取模式打开文件,读取其全部内容,然后关闭它。读取操作返回字节,我们将其转换为字符串。
$ dart main.dart File contents here...
写入文件
此示例演示了在特定位置向文件写入数据。
main.dart
import 'dart:io';
void main() async {
var file = File('output.dat');
var raf = await file.open(mode: FileMode.write);
await raf.writeFrom([65, 66, 67]); // ABC
await raf.setPosition(0);
await raf.writeFrom([68, 69]); // DE
await raf.close();
}
我们以写入模式打开文件,写入一些字节,然后覆盖开头部分。setPosition 方法将文件指针移动到指定偏移量。
$ dart main.dart $ hexdump output.dat 0000000 44 45 43
查找和读取
此示例展示了如何查找特定位置并读取数据。
main.dart
import 'dart:io';
void main() async {
var file = File('data.bin');
var raf = await file.open(mode: FileMode.read);
await raf.setPosition(10);
var data = await raf.read(4);
print('Data at position 10-13: $data');
await raf.close();
}
我们打开一个二进制文件,查找位置 10,然后从该点读取 4 个字节。这演示了该类的随机访问功能。
$ dart main.dart Data at position 10-13: [1, 2, 3, 4]
文件锁定
此示例演示了操作期间的文件锁定。
main.dart
import 'dart:io';
void main() async {
var file = File('shared.dat');
var raf = await file.open(mode: FileMode.append);
await raf.lock();
try {
await raf.writeFrom([1, 2, 3]);
} finally {
await raf.unlock();
await raf.close();
}
}
我们在写入之前获取独占锁以防止并发访问。锁在 finally 块中释放,以确保它始终发生。
$ dart main.dart
读取和写入结构
此示例展示了读取和写入结构化二进制数据。
main.dart
import 'dart:io';
import 'dart:typed_data';
void main() async {
var file = File('records.dat');
var raf = await file.open(mode: FileMode.write);
// Write a record
var buffer = ByteData(8);
buffer.setInt32(0, 1234);
buffer.setFloat32(4, 56.78);
await raf.writeFrom(buffer.buffer.asUint8List());
// Read it back
await raf.setPosition(0);
var data = await raf.read(8);
var reader = ByteData.view(data.buffer);
print('Int: ${reader.getInt32(0)}');
print('Float: ${reader.getFloat32(4)}');
await raf.close();
}
我们写入一个包含整数和浮点数的结构化记录,然后将其读回。ByteData 用于处理二进制文件中的不同数据类型。
$ dart main.dart Int: 1234 Float: 56.78
最佳实践
- 始终关闭:确保使用后关闭文件
- 错误处理:对文件操作使用 try-catch
- 缓冲:考虑对小写进行缓冲
- 定位:注意位置的变化
来源
本教程介绍了 Dart 的 RandomAccessFile 类,并通过实际示例展示了文件操作、定位、锁定和结构化数据处理。
作者
列出 所有 Dart 教程。