Dart 语言标准流与文件操作

7,709 阅读3分钟

Dart 入门到深入路线图:

Dart语言——45分钟快速入门(上)

Dart语言——45分钟快速入门(下)

Dart 异步编程详解之一文全懂

Dart 语言异步之Stream详解

Dart 语言标准流与文件操作

Dart 网络编程

Dart 爬虫开发体验

Dart 全栈之服务端开发

Dart FFI调用C语言混合编程

LuaDardo中Dart与Lua的相互调用

关注我,不错过!

标准输入输出流

  • stdin
  • stdout
  • stderr
// 导入io包
import 'dart:io';

void main() {
  // 向标准输出流写字符串
  stdout.write('root\$:');
  // 从标准输入流读取一行字符串
  var input = stdin.readLineSync();
  // 带换行符的写数据
  stdout.writeln("input data:$input");
  // 向标准错误流写数据
  stderr.writeln("has not error");
}

stdin除了可以使用readLineSync读一行字符串,还可以使用readByteSync读取一个字节。

文件操作

写文件

一种简便的操作方式,无需手动关闭文件,文件写入完成后会自动关闭

import 'dart:io';

void main() async{
  // 创建文件
  File file = new File('test.txt');
  String content = 'The easiest way to write text to a file is to create a File';

  try {
    // 向文件写入字符串
    await file.writeAsString(content);
    print('Data written.');
  } catch (e) {
    print(e);
  }
}

writeAsString原型

  Future<File> writeAsString(String contents,
      {FileMode mode: FileMode.write,
      Encoding encoding: utf8,
      bool flush: false})
  • mode 文件模式,这里默认为写模式
  • encoding 字符编码,默认为utf-8
  • flush 是否立刻刷新缓存,默认为false

文件模式FileMode的常量

常量值说明
read只读模式
write可读可写模式,如果文件存在则会覆盖
append追加模式,可读可写,文件存在则往末尾追加
writeOnly只写模式
writeOnlyAppend只写模式下的追加模式,不可读

除了writeAsString方法外,还可以使用writeAsBytes写入一个字节列表。需要注意的是,这两个方法都是异步执行的,返回值都是Future,如果有必要,也可以使用同步方法执行写入操作

  • writeAsStringSync
  • writeAsBytesSync

如需要更灵活的控制,可以使用如下方式操作文件,但是需要手动关闭文件

import 'dart:io';

void main() async{
  // 创建文件
  File file = new File('test.txt');
  // 文件模式设置为追加
  IOSink isk = file.openWrite(mode: FileMode.append);

  // 多次写入
  isk.write('A woman is like a tea bag');
  isk.writeln('you never know how strong it is until it\'s in hot water.');
  isk.writeln('-Eleanor Roosevelt');
  await isk.close();
  print('Done!');
}

读文件

简便的方式

  • readAsBytes
  • readAsBytesSync
  • readAsString
  • readAsStringSync
  • readAsLines
  • readAsLinesSync
void main() async{
  File file = new File('test.txt');
  try{
    String content = await file.readAsString();
    print(content);
  }catch(e){
    print(e);
  }
}

另一种更低级别的方式

import 'dart:io';
import 'dart:convert';

void main() async{
  try {
    // LineSplitter Dart语言封装的换行符,此处将文本按行分割
    Stream lines = new File('test.txt').openRead()
    	.transform(utf8.decoder).transform(const LineSplitter());

    await for (var line in lines) {
      print(line);
    }
  } catch (_) {}
}

文件的其他操作

import 'dart:io';

void main() async{
  File file = new File('test.txt');

  // 判断文件是否存在
  if(await file.exists()){
    print("文件存在");
  }else{
    print("文件不存在");
  }

  // 复制文件
  await file.copy("test-1.txt");

  // 修改文件名。当传入不同路径时,可用来移动文件
  await file.rename("test-2.txt");
  
  // 获取文件 size
  print(await file.length());
}

相应的,这些方法还有一个带Sync后缀的同步版本方法,例如copySyncrenameSync等。

要获取文件更多的信息,还可以使用File等多个类的超类FileSystemEntity来操作

import 'dart:io';

void main() async{
  String path = 'test.txt';

  // 判断路径是否是文件夹
  if (!await FileSystemEntity.isDirectory(path)) {
    print('$path is not a directory');
  } 

 Directory dir = Directory(r'D:\workspace\dart_space\Tutorial');
 // 目录是否存在
 if(await dir.exists()){
   // 从目录的list方法获取FileSystemEntity对象
   Stream<FileSystemEntity> fse = await dir.list();
   await for (FileSystemEntity entity in fse) {
     if(entity is File){
       print("entity is file");
     }

     // 打印文件信息
     print(await entity.stat());
     // 删除
     await entity.delete();
   }
 }else{
   // 不存在则创建。recursive为true时,创建路径上所有不存在的目录
   await dir.create(recursive: true);
 }
}

需注意,delete中包含一个可选的参数,原型 Future<FileSystemEntity> delete({bool recursive: false})recursive默认为false,当删除目录时,目录必须为空才能删除;当recursive设置为true时,将删除目录下的所有子目录及文件。

视频课程

博主发布的相关视频课程

Flutter全栈式开发之Dart 编程指南 二维码

Flutter 全栈式开发指南

关注我的公众号:编程之路从0到1

编程之路从0到1