2 Вопрос: Как получить ByteData из файла

вопрос создан в Wed, May 8, 2019 12:00 AM

Я хочу преобразовать объект 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);, но тогда как мне их заполнить? Чего мне не хватает?

    
0
  1. для чего нужен этот ByteData?
    2019-05-08 16: 41: 24Z
  2. @ pskink У меня есть библиотека API, которая получает ByteData и отправляет его на сервер. Я мог бы изменить эту библиотеку, но в моем конкретном случае это не просто
    2019-05-08 16: 52: 28Z
  3. но что если этот файл имеет длину 1 ГБ? Вы хотели бы прочитать все это?
    2019-05-08 16: 55: 35Z
  4. поэтому этот код сделает это: File('/some/file/to/read').openRead().listen((list) { ByteData data = Uint8List.fromList(list).buffer.asByteData(); // do something with 'data' });
    2019-05-09 05: 18: 54Z
2 ответа                              2                         

Попробуйте это:

File file = getSomeCorrectFile(); 
ByteData bytes = await file.readAsBytes().then((data) => ByteData.view(data as ByteBuffer)); 
return bytes;
    
0
2019-05-08 17: 12: 27Z

Я считаю, что должно работать следующее:

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>, но возвращаемый объект фактически является подтипом Uint8List . Оттуда вы можете извлечь его 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());
...
    
0
2019-05-08 21: 40: 11Z
источник размещен Вот