如何从文件获取ByteData

时间:2019-05-08 15:45:19

标签: dart flutter

我想在抖动中将File转换为ByteData对象。 像这样:

import 'dart:io';
File file = getSomeCorrectFile(); //This file is correct
ByteData bytes = ByteData(file.readAsBytesSync()); //Doesnt compile
return bytes; 

我了解到ByteData构造函数会接收到一定数量的字节并将其初始化为0,因此我可以做类似ByteData(file.readAsBytesStync().length);的操作,但是如何填充它们呢? 我想念什么?

5 个答案:

答案 0 :(得分:1)

在Dart 2.9中:

import 'dart:io';
import 'dart:typed_data';

final file = getSomeCorrectFile(); // File
final bytes = await file.readAsBytes(); // Uint8List
final byteData = bytes.buffer.asByteData(); // ByteData

return byteData;

答案 1 :(得分:0)

尝试一下:

File file = getSomeCorrectFile(); 
ByteData bytes = await file.readAsBytes().then((data) => ByteData.view(data as ByteBuffer)); 
return bytes;

答案 2 :(得分:0)

我认为以下方法应该有效:

import 'dart:io';
import 'dart:typed_data';

...
File file = getSomeCorrectFile();
Uint8List bytes = file.readAsBytesSync() as Uint8List;
return ByteData.view(bytes.buffer);
声明

File.readAsBytes / File.readAsBytesSync返回List<int>,但返回the returned object is actually a Uint8List subtype。从那里,您可以extract its ByteBuffer并以此构建ByteData

如果您不愿意依靠File.readAsBytes / File.readAsBytesSync返回Uint8List,则可以构造一个Uint8List

Uint8List bytes = Uint8List.fromList(file.readAsBytesSync());

或将它们组合:

Uint8List toUint8List(List<int> list) =>
  (list is Uint8List) ? list : Uint8List.fromList(list);

Uint8List bytes = toUint8List(file.readAsBytesSync());
...

答案 3 :(得分:0)

这是我的类来处理这个:

import 'dart:io';
import 'dart:typed_data';

class FileHandler {
    final String _filePath;
    FileHandler(this._filePath);
    Future<Uint8List> _readToBytes() async {
         var file = File.fromUri(Uri.parse(_filePath));
         return await file.readAsBytes();
    }

    Future<Map<String, dynamic>> get data async {
        var byte = await _readToBytes();
        var ext = _filePath.split('.').last;
        return {'byte': byte, 'extension': ext};
    }
}

答案 4 :(得分:0)

这对我有用......

  Uint8List uint8list = Uint8List.fromList(File(path).readAsBytesSync())