3

我正在寻找 Dart 的 Java DataOutputStream 等效项,我可以在其中编写任意类型(int、string、float、byte 数组等​​)。有 RandomAccessFile 但它不提供字节数组或浮点双精度值。ByteArray 似乎有一些必要的功能,但我不知道如何将它写入文件或 OutputStream。

4

5 回答 5

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);
}
于 2012-10-02T14:51:51.940 回答
1

这已经存在了一段时间,但我搜索并没有找到好的DataInput/OutputStream互操作性类。我想要一个与流一起使用的版本,这样我就可以处理不能轻松放入 RAM 的文件。所以我写了一个。

它发布在https://pub.dev/packages/jovial_miscio_streams,或者如果您愿意,也可以发布在https://github.com/zathras/misc/tree/master/dart/jovial_misc中。我做了它,所以它与java.io.DataInputStream和互操作java.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

DataInputStream并且DataOutputSink几乎是java.io类的明显映射。棘手的部分是缓冲区管理,因为在List<int>可能与您想要的数据没有对齐的情况下,流会向您推送数据。而且,当然,有必要异步执行所有操作。

HTH。

于 2020-01-10T06:37:52.363 回答
0

您本质上是在要求任意对象序列化。虽然 Dart VM 有一个,但它并没有暴露给程序员(它只用于快照和消息传递)。我会说暴露它是一个错误——在不同的情况下,我们对序列化有不同的要求,“一个真正的解决方案”是行不通的(Java 已经向我们展示了这一点)。

例如,我正在为 Dart 开发一个 MsgPack 实现,我知道 Protobuf 端口也在工作中,也许有人会启动一个 Thrift 端口......可能性是无穷无尽的。

于 2012-10-03T03:44:57.337 回答
0

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

于 2017-10-20T00:16:07.117 回答
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

于 2017-10-20T00:19:58.380 回答