Стандартные потоковые и файловые операции языка Dart

Flutter Dart

Dart: начало работы с Deep Road Map:

Дартский язык - быстрое начало за 45 минут (часть 1)

Dart Language — быстрый старт за 45 минут (часть 2)

Полное понимание асинхронного программирования Dart

Подробное объяснение асинхронного потока языка Dart

Стандартные потоковые и файловые операции языка Dart

Дартс Сетевое Программирование

Опыт разработки краулеров Dart

Разработка сервера с полным стеком Dart

Dart FFI называет смешанное программирование на языке C

Взаимный звонок между Dart и Lua в LuaDardo

Следуй за мной, не пропусти!

стандартные входные и выходные потоки

  • 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
  • flush

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Суффикс синхронной версии метода, например,copySync,renameSyncЖдать.

FileFileSystemEntityДля работы

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, все подкаталоги и файлы в каталоге будут удалены.

видео уроки

Похожие видеокурсы, размещенные блогерами

Руководство по программированию Dart для полной разработки Flutter 二维码

Руководство по разработке полного стека Flutter

Обратите внимание на мой официальный аккаунт: Путь к программированию идет от 0 к 1

编程之路从0到1