我正在使用Flutter将“资产”加载到File
中,以便本机应用程序可以访问它。
这是我加载资产的方式:
final dbBytes = await rootBundle.load('assets/file');
这将返回ByteData
。
如何将此内容写入dart.io.File
实例?
答案 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>
?
经过自我调查,解决方法是:
.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();