如何将“ByteData”实例写入Dart中的文件?

时间:2018-05-01 15:54:56

标签: dart

我正在使用Flutter将“资产”加载到File中,以便本机应用程序可以访问它。

这是我加载资产的方式:

final dbBytes = await rootBundle.load('assets/file');

这将返回ByteData

的实例

如何将此内容写入dart.io.File实例?

4 个答案:

答案 0 :(得分:13)

ByteData是:

的抽象
  

还提供固定长度的随机访问字节序列   随机和未对齐访问固定宽度的整数和浮动   由这些字节表示的点数。

正如Gunter在评论中提到的,你可以使用File.writeAsBytes。但是,它需要一些API工作才能从Type转到ByteData

List<int>

我还filed an issue使Flutter的文档对于此用例更加清晰。

答案 1 :(得分:8)

您需要先安装path_provider软件包,然后

这应该有效:

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

final dbBytes = await rootBundle.load('assets/file'); // <= your ByteData

//=======================
Future<File> writeToFile(ByteData data) async {
    final buffer = data.buffer;
    Directory tempDir = await getTemporaryDirectory();
    String tempPath = tempDir.path;
    var filePath = tempPath + '/file_01.tmp'; // file_01.tmp is dump file, can be anything
    return new File(filePath).writeAsBytes(
        buffer.asUint8List(data.offsetInBytes, data.lengthInBytes));
}
//======================

获取文件:

var file;
try {
    file = await writeToFile(dbBytes); // <= returns File
} catch(e) {
    // catch errors here
}

希望这会有所帮助, 谢谢。

答案 2 :(得分:1)

对于那些希望写字节(也称为Uint8List)而不是ByteData的用户,请注意ByteData is a wrapper for Uint8List

从/runtime/lib/typed_data.patch:

@patch
class ByteData implements TypedData {
  @patch
  @pragma("vm:entry-point")
  factory ByteData(int length) {
    final list = new Uint8List(length) as _TypedList;
    _rangeCheck(list.lengthInBytes, 0, length);
    return new _ByteDataView(list, 0, length);
  }

@patch
class Uint8List {
  @patch
  @pragma("vm:exact-result-type", _Uint8List)
  factory Uint8List(int length) native "TypedData_Uint8Array_new";
}

如果您使用的是后一种类型,则可以使用Rami提供的答案并按如下所示修改收益:

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


Future<File> writeToFile(Uint8List data) async {
    (...)
    return new File(filePath).writeAsBytes(data);
}

答案 3 :(得分:0)

搜索flutter ByteData to List<int>,然后在此处找到,但没有完全回答我的问题:

如何将ByteData转换为List<int>

经过自我调查,解决方法是:

  1. 使用.cast<int>()
ByteData audioByteData = await rootBundle.load(audioAssetsFullPath);
Uint8List audioUint8List = audioByteData.buffer.asUint8List(audioByteData.offsetInBytes, audioByteData.lengthInBytes);
List<int> audioListInt = audioUint8List.cast<int>();

或2.使用.map

ByteData audioByteData = await rootBundle.load(audioAssetsFullPath);
Uint8List audioUint8List = audioByteData.buffer.asUint8List(audioByteData.offsetInBytes, audioByteData.lengthInBytes);
List<int> audioListInt = audioUint8List.map((eachUint8) => eachUint8.toInt()).toList();