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.

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top