ZetCode

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

最佳实践

来源

Dart RandomAccessFile 文档

本教程介绍了 Dart 的 RandomAccessFile 类,并通过实际示例展示了文件操作、定位、锁定和结构化数据处理。

作者

我叫 Jan Bodnar,是一名充满热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出 所有 Dart 教程