Learn Dart #5: Read and write files in under 30 seconds

Learn Dart #5: Read and write files in under 30 seconds

In today’s quick tip, we will learn how easy it is to read and write files in Dart. We will use the File object of the ‘dart:io’ library to achieve this.

Prefer a video?

To follow along, generate the console-full project with stagehand:

$ mkdir my_app && cd my_app
$ stagehand console-full

And see the solution from the video below:

import 'dart:io';

main() async {
  var file = File('data.txt');
  var contents;

  if (await file.exists()) {
    // Read file
    contents = await file.readAsString();
    print(contents);

    // Write file
    var fileCopy = await File('data-copy.txt').writeAsString(contents);
    print(await fileCopy.exists());
    print(await fileCopy.length());
  }
}

Extending the solution

1. How to better specify the file path

Install the path package by adding the dependency to your pubspec.yaml file:

dependencies:
  path: ^1.6.2

And running pub get in your terminal.

Import this at the top of bin/main.dart and amend the path as follows:

import 'dart:io';
import 'package:path/path.dart';

void main() async {
  var pathToFile = join(dirname(Platform.script.toFilePath()), '..', 'data.txt');
  var file = File(pathToFile);
  ..
  ..
}

2. How to read the file line by line

We can create a stream to read the file:

import 'dart:convert'; // Contains the `Utf8Decoder` and `LineSplitter` stream transformers
..
..
  if (await file.exists()) {
    // Read file
    contents = StringBuffer();
    var contentStream = file.openRead();

    contentStream
      .transform(Utf8Decoder())
      .transform(LineSplitter())
      .listen((String line) => contents.write(line), // Add line to our StringBuffer object
        onDone: () => print(contents.toString()), // Call toString() method to receive the complete data
        onError: (e) => print('[Problems]: $e'));
    ..
    ..
  }
..
..

A good use case for this would be processing a file containing environment variables, like the file contents below:

PORT=8080
API_KEY=lkjsk453lkslfkl5
API_USER=jimmyo

Please leave your feedback in the comments, and let me know what you would like to see demonstrated next!

Further reading:

  1. The File class

  2. Free Dart screencasts on Egghead.io