Flutter 文件讀寫---path_provider詳解

前言

在我們實際的應(yīng)用開發(fā)過程中,常常會做一些本地持久化數(shù)據(jù)配置界赔,在應(yīng)用啟動時可以拿到配置去處理對應(yīng)的業(yè)務(wù)邏輯丢习。或者我們下載文件仔蝌、下載圖片等都需要通過IO流來實現(xiàn)泛领。

在我們操作文件的時候我們需要結(jié)合dart:io庫中的path_provider,因為每個系統(tǒng)下文件路徑不同敛惊,如果自己去實現(xiàn)會很麻煩渊鞋,那么path_provider就此產(chǎn)生。

源碼及視頻教程地址

github源碼地址 視頻教程地址

path_provider介紹

path_provider是一個Flutter插件瞧挤,主要作用是提供一種以平臺無關(guān)一致的方式訪問設(shè)備的文件系統(tǒng)锡宋,比如應(yīng)用臨時目錄、文檔目錄等特恬。而且path_provider支持Android执俩、iOSLinux癌刽、MacOS役首、Windows

path_provider App目錄

app存儲目錄總共分為八種显拜,我們來看一下他們的區(qū)別:

臨時目錄

臨時目錄的是系統(tǒng)可以隨時清空的緩存文件夾

文檔目錄

文檔目錄用于存儲只能由該應(yīng)用訪問的文件衡奥,系統(tǒng)不會清除該目錄,只有在刪除應(yīng)用時才會消失远荠。

應(yīng)用程序支持目錄

應(yīng)用程序支持目錄用于不想向用戶公開的文件矮固,也就是你不想給用戶看到的文件可放置在該目錄中,系統(tǒng)不會清除該目錄譬淳,只有在刪除應(yīng)用時才會消失档址。

應(yīng)用程序持久文件目錄

該目錄主要存儲持久文件的目錄,并且不會對用戶公開邻梆,常用于存儲數(shù)據(jù)庫文件守伸,比如sqlite.db等。

外部存儲目錄

主要用于獲取外部存儲目錄确虱,如SD卡等含友,但iOS不支持外部存儲目錄替裆,目前只有Android才支持校辩。

外部存儲緩存目錄

主要用戶獲取應(yīng)用程序特定外部緩存數(shù)據(jù)的目錄窘问,比如從SD卡或者手機上有多個存儲目錄的,但iOS不支持外部存儲目錄宜咒,目前只有Android才支持惠赫。

外部存儲目錄(單獨分區(qū))

可根據(jù)類型獲取外部存儲目錄,如SD卡故黑、單獨分區(qū)等儿咱,和外部存儲目錄不同在于他是獲取一個目錄數(shù)組。但iOS不支持外部存儲目錄场晶,目前只有Android才支持混埠。

桌面程序下載目錄

主要用于存儲下載文件的目錄,只適用于Linux诗轻、MacOS钳宪、WindowsAndroidiOS平臺無法使用扳炬。

path_provider方法和說明

方法 屬性 描述
getTemporaryDirectory() Future<Directory> 臨時目錄
getApplicationSupportDirectory() Future<Directory> 應(yīng)用程序支持目錄
getLibraryDirectory() Future<Directory> 應(yīng)用程序持久文件目錄
getApplicationDocumentsDirectory() Future<Directory> 文檔目錄
getExternalStorageDirectory() Future<Directory> 外部存儲目錄
getExternalCacheDirectories() Future<List<Directory>?> 外部存儲緩存目錄
getExternalStorageDirectories() Future<List<Directory>?> 外部存儲目錄(單獨分區(qū))
getDownloadsDirectory() Future<Directory?> 桌面程序下載目錄

path_provider基本使用

我們這里舉一個簡單的例子吏颖,通過path_provider獲取磁盤中的路徑,把文字寫入到文件中恨樟,具體步驟如下:

  • 添加依賴
  • 獲取本地目錄
  • 寫入數(shù)據(jù)到磁盤中
  • 讀取磁盤數(shù)據(jù)

第一步:添加依賴

environment:
  sdk: ">=2.12.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter

  path_provider: ^2.0.5

第二步:獲取本地目錄

雖然獲取路徑總共有八種半醉,但是在實際應(yīng)用開發(fā)過程中,我們經(jīng)常使用的有三種劝术,我們分別來獲取這三種目錄的路徑缩多,如下:

/// 獲取文檔目錄文件
Future<File> _getLocalDocumentFile() async {
  final dir = await getApplicationDocumentsDirectory();
  return File('${dir.path}/str.txt');
}

/// 獲取臨時目錄文件
Future<File> _getLocalTemporaryFile() async {
  final dir = await getTemporaryDirectory();
  return File('${dir.path}/str.txt');
}

/// 獲取應(yīng)用程序目錄文件
Future<File> _getLocalSupportFile() async {
  final dir = await getApplicationSupportDirectory();
  return File('${dir.path}/str.txt');
}

第三步:寫入數(shù)據(jù)到磁盤中

我們這里通過writeAsString()來將name值寫入到磁盤中,如果你需要同步寫入可調(diào)用writeAsStringSync()养晋,或者想通過字節(jié)流的方式寫入可以調(diào)用writeAsBytes()衬吆。

String name = "Jimi";

/// 寫入數(shù)據(jù)
Future<void> writeString(String str) async {
  final file = await _getLocalDocumentFile();
  await file.writeAsString(name);

  final file1 = await _getLocalTemporaryFile();
  await file1.writeAsString(name);

  final file2 = await _getLocalSupportFile();
  await file2.writeAsString(name);
  print("寫入成功");
}

第四步:讀取磁盤數(shù)據(jù)

這里加了一個try catch,防止在讀取文件出現(xiàn)異常導(dǎo)致崩潰匙握,我們分別讀取三個目錄里面的文件并對其增加相應(yīng)的打印咆槽。

/// 讀取值
Future<void> readString() async {
  try {

    final file = await _getLocalDocumentFile();
    final result  = await file.readAsString();
    print("result-----$result");

    final file1 = await _getLocalTemporaryFile();
    final result1  = await file1.readAsString();
    print("result1-----$result1");

    final file2 = await _getLocalSupportFile();
    final result2  = await file2.readAsString();
    print("result2-----$result2");

  } catch (e) {
  }
}

完整示例代碼

import 'dart:io';

import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {

  String name = "Jimi";

  /// 獲取文檔目錄文件
  Future<File> _getLocalDocumentFile() async {
    final dir = await getApplicationDocumentsDirectory();
    return File('${dir.path}/str.txt');
  }

  /// 獲取臨時目錄文件
  Future<File> _getLocalTemporaryFile() async {
    final dir = await getTemporaryDirectory();
    return File('${dir.path}/str.txt');
  }

  /// 獲取應(yīng)用程序目錄文件
  Future<File> _getLocalSupportFile() async {
    final dir = await getApplicationSupportDirectory();
    return File('${dir.path}/str.txt');
  }

  /// 讀取值
  Future<void> readString() async {
    try {

      final file = await _getLocalDocumentFile();
      final result  = await file.readAsString();
      print("result-----$result");

      final file1 = await _getLocalTemporaryFile();
      final result1  = await file1.readAsString();
      print("result1-----$result1");

      final file2 = await _getLocalSupportFile();
      final result2  = await file2.readAsString();
      print("result2-----$result2");


    } catch (e) {
    }
  }

  /// 寫入數(shù)據(jù)
  Future<void> writeString(String str) async {
    final file = await _getLocalDocumentFile();
    await file.writeAsString(name);

    final file1 = await _getLocalTemporaryFile();
    await file1.writeAsString(name);

    final file2 = await _getLocalSupportFile();
    await file2.writeAsString(name);
    print("寫入成功");
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(title: Text("path_provider"),),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text(name,
                style: TextStyle(
                    color: Colors.pink,
                    fontSize: 30
                ),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: (){
                  writeString(name);
                },
                child: Text("存入本地目錄"),
              ),
              ElevatedButton(
                onPressed: (){
                  readString();
                },
                child: Text("讀取值"),
              ),
            ],
          ),
        ),
      )
    );
  }
}

控制臺輸出

flutter: 寫入成功
flutter: result-----Jimi
flutter: result1-----Jimi
flutter: result2-----Jimi

總結(jié)

當我們需要持久化數(shù)據(jù)或下載文件、圖片或保存數(shù)據(jù)庫文件我們將文件寫入到磁盤中圈纺,那我們需要借助dart:io以及path_provider秦忿,而path_provider主要作用是提供一種以平臺無關(guān)一致的方式訪問設(shè)備的文件系統(tǒng),比如應(yīng)用臨時目錄蛾娶、文檔目錄等灯谣。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蛔琅,隨后出現(xiàn)的幾起案子胎许,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辜窑,死亡現(xiàn)場離奇詭異钩述,居然都是意外死亡,警方通過查閱死者的電腦和手機穆碎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進店門牙勘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人所禀,你說我怎么就攤上這事方面。” “怎么了色徘?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵恭金,是天一觀的道長。 經(jīng)常有香客問我褂策,道長横腿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任辙培,我火速辦了婚禮蔑水,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘扬蕊。我一直安慰自己搀别,他們只是感情好,可當我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布尾抑。 她就那樣靜靜地躺著歇父,像睡著了一般。 火紅的嫁衣襯著肌膚如雪再愈。 梳的紋絲不亂的頭發(fā)上榜苫,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天,我揣著相機與錄音翎冲,去河邊找鬼垂睬。 笑死,一個胖子當著我的面吹牛抗悍,可吹牛的內(nèi)容都是我干的驹饺。 我是一名探鬼主播,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼缴渊,長吁一口氣:“原來是場噩夢啊……” “哼赏壹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起衔沼,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蝌借,失蹤者是張志新(化名)和其女友劉穎昔瞧,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體菩佑,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡自晰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了擎鸠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缀磕。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡缘圈,死狀恐怖劣光,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情糟把,我是刑警寧澤绢涡,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站遣疯,受9級特大地震影響雄可,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缠犀,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一数苫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辨液,春花似錦虐急、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至燎悍,卻和暖如春敬惦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谈山。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工俄删, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人奏路。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓畴椰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親思劳。 傳聞我的和親對象是個殘疾皇子迅矛,可洞房花燭夜當晚...
    茶點故事閱讀 45,585評論 2 359

推薦閱讀更多精彩內(nèi)容