DataOutputStream等效于Dart

时间:2012-10-02 14:21:57

标签: dart

我正在寻找Dart的Java DataOutputStream等价物,我可以写任意类型(int,string,float,byte array等)。有RandomAccessFile但它不提供字节数组或float-double值。 ByteArray似乎有一些必要的功能,但我不知道如何将它写入文件或OutputStream。

5 个答案:

答案 0 :(得分:2)

以下是一些简单的代码,展示了如何将ByteArray写入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);
}

答案 1 :(得分:1)

已经存在了一段时间,但是我进行了搜索,但没有找到好的DataInput/OutputStream互操作性类。我想要一个可以与流一起使用的版本,因此我可以处理不适合放入RAM的文件。所以我写了一个。

它在io_streams的{​​{3}}或https://pub.dev/packages/jovial_misc上发布。我做到了,因此它可以与java.io.DataInputStreamjava.io.DataOutputStream互操作。使用它的代码看起来像这样:

import 'package:convert/convert.dart';
import 'package:jovial_misc/io_utils.dart';

void main() async {
  final acc = ByteAccumulatorSink();
  final out = DataOutputSink(acc);
  out.writeUTF8('Hello, world.');
  out.close();

  final stream = Stream<List<int>>.fromIterable([acc.bytes]);
  final dis = DataInputStream(stream);
  print(await dis.readUTF8());
  await dis.close();
}

Stream<List<int>>当然通常来自套接字或File.openRead()等。还有一个DataInputStream变体,它是同步的,并且采用Iterable,如果您确实所有字节数据都在前面。

DataInputStreamDataOutputSink几乎是java.io类的明显映射。棘手的部分是缓冲区管理,因为流在​​List<int>实例中将数据推向您,这些实例可能未与所需数据对齐。而且,当然,必须异步进行所有操作。

HTH。

答案 2 :(得分:0)

您实际上是在要求任意对象序列化。虽然Dart VM有一个,但它不向程序员公开(它仅用于快照和消息传递)。我要说暴露它是错误的 - 在不同的情况下,我们对序列化有不同的要求,“一个真正的解决方案”不会起作用(Java已经向我们展示过)。

例如,我正在研究Dart的MsgPack实现,我知道Protobuf端口也在运行,也许有人会启动Thrift端口......可能性是无穷无尽的。

答案 3 :(得分:0)

我能找到的最接近的是这个包:https://github.com/TomCaserta/dart_io/。不幸的是,当读到字节数组的末尾时有一个错误 - 请参阅我在GitHub中的拉取请求。

答案 4 :(得分:0)

您可以使用此课程: https://github.com/TomCaserta/dart_io/blob/master/lib/data_output.dart

不幸的是(a)它不处理流; (b)writeLong不采用单个整数。我提出了Dart SDK的问题:https://github.com/dart-lang/sdk/issues/31166

编辑:我已经分叉了dart_io包并修复了上述两个问题。我的新包发布为dart_data_io: https://github.com/markmclaren2/dart_data_io