Flutter開発入門17 ファイル操作の基本:読み込み、書き込み、削除

Flutter

はじめに

 Flutterでファイルの読み書きや管理を行うために、dart:ioライブラリに含まれるFileクラスを使用します。このクラスを利用することで、ファイルの作成、読み込み、書き込み、削除といった基本的なファイル操作が可能です。モバイルアプリ開発においては、ユーザーのデータをローカルに保存したり、外部ファイルとやりとりする際にFileクラスは非常に便利です。本記事では、Fileクラスを使用してFlutterアプリでファイル操作を行う方法を解説します。

Fileクラスの基本的な使い方

 Fileクラスは、ファイルの読み書きや削除などの操作を提供するクラスです。ファイルのパスを指定し、Fileクラスのインスタンスを生成することで、さまざまな操作を行うことができます。

1. ファイルの作成と書き込み

 まず、ファイルを作成し、そのファイルにデータを書き込む基本的な例を見てみましょう。

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

Future<void> writeFile(String content) async {
  final directory = await getApplicationDocumentsDirectory();
  final file = File('${directory.path}/example.txt');

  // ファイルにテキストを書き込み
  await file.writeAsString(content);
  print('File written: ${file.path}');
}

 ここではpath_providerを利用するために、pubspec.yamlに追加しています。

path_provider: ^2.1.4
解説
  • getApplicationDocumentsDirectory(): ファイルの保存場所として、アプリのドキュメントディレクトリを取得します。path_providerパッケージを使って取得することが一般的です。
  • File.writeAsString(): 指定した文字列をファイルに書き込むメソッドです。非同期処理のため、awaitで結果を待ちます。

2. ファイルの読み込み

 次に、作成したファイルからデータを読み込む方法を紹介します。

Future<String> readFile() async {
  try {
    final directory = await getApplicationDocumentsDirectory();
    final file = File('${directory.path}/example.txt');

    // ファイルからデータを読み込む
    String content = await file.readAsString();
    return content;
  } catch (e) {
    print('Error reading file: $e');
    return 'Error';
  }
}
解説
  • File.readAsString(): ファイルの内容を文字列として読み込むメソッドです。非同期処理で結果を待ち、読み込んだ内容を返します。
  • エラーハンドリング: ファイルが存在しない場合や読み込みに失敗した場合には、try-catchを使ってエラー処理を行います。

3. ファイルの削除

 作成したファイルを削除する方法も見てみましょう。

Future<void> deleteFile() async {
  final directory = await getApplicationDocumentsDirectory();
  final file = File('${directory.path}/example.txt');

  // ファイルを削除
  if (await file.exists()) {
    await file.delete();
    print('File deleted');
  } else {
    print('File does not exist');
  }
}
解説
  • File.exists(): ファイルが存在するかどうかを確認するメソッドです。
  • File.delete(): ファイルを削除するためのメソッドです。ファイルが存在する場合のみ削除を行います。

4. バイナリデータの読み書き

 テキストデータだけでなく、バイナリデータを扱うこともできます。バイナリデータの例として、画像ファイルの読み書きを見てみましょう。

バイナリファイルの書き込み
Future<void> writeBinaryFile(List<int> data) async {
  final directory = await getApplicationDocumentsDirectory();
  final file = File('${directory.path}/image.png');

  // バイナリデータを書き込む
  await file.writeAsBytes(data);
  print('Binary file written');
}
バイナリファイルの読み込み
Future<List<int>> readBinaryFile() async {
  final directory = await getApplicationDocumentsDirectory();
  final file = File('${directory.path}/image.png');

  // バイナリデータを読み込む
  List<int> bytes = await file.readAsBytes();
  return bytes;
}
解説
  • File.writeAsBytes(): バイナリデータをファイルに書き込むメソッドです。
  • File.readAsBytes(): バイナリデータをファイルから読み込むメソッドです。

5. 非同期処理に関する注意

 ファイルの読み書きは基本的に非同期処理で行われるため、asyncawaitを使用することが一般的です。これにより、ファイル操作がアプリの他の処理をブロックせず、スムーズに動作します。

void main() async {
  await writeFile('Hello, Flutter!');
  String content = await readFile();
  print('File content: $content');
}

 このコードでは、まずファイルに「Hello, Flutter!」というテキストを書き込み、次にその内容を読み込んでコンソールに表示します。

まとめ

 FlutterのFileクラスを使うことで、ローカルストレージへのファイル操作を簡単に実現できます。ファイルの作成、読み込み、書き込み、削除といった基本操作をマスターすることで、ユーザーデータの管理やファイルベースのデータ処理を行うアプリを開発できます。特に、path_providerパッケージを使って適切なディレクトリにアクセスし、非同期処理をうまく活用することが重要です。このガイドを参考にして、Flutterアプリでのファイル操作を効果的に活用してみてください。

コメント