Equivalente a DataOutputStream para Dart
-
12-12-2019 - |
Pergunta
Estou procurando um equivalente Java DataOutputStream para Dart onde eu possa escrever tipos arbitrários (int, string, float, array de bytes, etc.).Existe RandomAccessFile, mas ele não fornece matriz de bytes ou valores float-double.ByteArray parece ter algumas funções necessárias, mas não tenho certeza de como gravá-lo em um arquivo ou OutputStream.
Solução
Aqui está um código simples que mostra como escrever um ByteArray em um OutputStream:
#import('dart:io');
#import('dart:scalarlist');
main() {
File file = new File("c:\\temp\\foo.txt");
OutputStream os = file.openOutputStream();
os.onNoPendingWrites = () {
print('Finished writing. Closing.');
os.flush();
os.close();
};
Uint8List byteList = new Uint8List(64);
ByteArray byteArray = byteList.asByteArray();
int offset = 0;
offset = byteArray.setUint8(offset, 72);
offset = byteArray.setUint8(offset, 101);
offset = byteArray.setUint8(offset, 108);
offset = byteArray.setUint8(offset, 108);
offset = byteArray.setUint8(offset, 111);
offset = byteArray.setUint8(offset, 0);
byteArray.setFloat32(offset, 1.0);
os.write(byteList);
}
Outras dicas
Você está essencialmente pedindo serialização de objetos arbitrários.E enquanto o DART VM tem um, ele não está exposto aos programadores (é usado apenas para instantâneos e passagens de mensagem).Eu diria que seria um erro expô-lo - em diferentes situações, temos requisitos diferentes para a serialização e "uma solução verdadeira" não vai funcionar (Java nos mostrou que já).
Por exemplo, estou trabalhando em uma implementação msgpack para dardo, eu sei que o porto de protobuf também está nos trabalhos, talvez alguém inicie um porto de thrift ... as possibilidades são infinitas.
A coisa mais próxima que eu poderia encontrar é este pacote: https://github.com/tomcaserta/dart_io/.Infelizmente há um bug ao ler até o final da matriz de bytes - veja meu pedido de puxar no GitHub.
Você poderia usar esta classe: https://github.com/tomcaserta/dart_io/blob/master/lib / data_output.dart
Infelizmente (a) não liga fluxos;(b) Writelong não faz um único inteiro.Eu levantei um problema para o Dart Sdk: https://github.com/dart-lang / sdk / questões / 31166
Editar: Eu bifurei o pacote DART_IO e fixo os dois problemas descritos acima.Meu novo pacote é publicado como DART_DATA_IO: https://github.com/markmclaren2/dart_data_io