Dart的DataOutputStream等效值

Dart的DataOutputStream等效值,dart,Dart,我正在为Dart寻找一个Java DataOutputStream等价物,在这里我可以编写任意类型(int、string、float、字节数组等)。存在RandomAccessFile,但它不提供字节数组或浮点双精度值。ByteArray似乎有一些必要的功能,但我不确定如何将其写入文件或输出流。以下是一些简单的代码,说明如何将ByteArray写入输出流: #import('dart:io'); #import('dart:scalarlist'); main() { File

我正在为Dart寻找一个Java DataOutputStream等价物,在这里我可以编写任意类型(int、string、float、字节数组等)。存在RandomAccessFile,但它不提供字节数组或浮点双精度值。ByteArray似乎有一些必要的功能,但我不确定如何将其写入文件或输出流。

以下是一些简单的代码,说明如何将ByteArray写入输出流:

#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);
}

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


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

我能找到的最接近的东西是这个包:。不幸的是,在读取字节数组末尾时出现错误-请参阅GitHub中的我的pull请求。

您可以使用此类:

不幸的是(a)它不处理流;(b) writeLong不接受单个整数。我为Dart SDK提出了一个问题:

编辑:我已经分叉了dart_io包并修复了上述两个问题。我的新软件包以dart_data_io的形式发布:

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

它发布在
io_streams
中,或者如果您愿意的话。我使它能够与
java.io.DataInputStream
java.io.DataOutputStream
进行互操作。使用它的代码看起来有点像这样:

import'package:convert/convert.dart';
导入“包装:jovial_misc/io_utils.dart”;
void main()异步{
最终acc=ByteAccumulatorSink();
最终输出=数据输出接收器(acc);
out.writeUTF8(“你好,世界”);
out.close();
最终流=stream.fromIterable([acc.bytes]);
最终dis=数据输入流(流);
打印(等待dis.readUTF8());
等待dis.close();
}
当然通常来自套接字,或者
File.openRead()
,等等。还有一个
DataInputStream
变量,它是同步的,如果前面有所有可用的字节数据,它会采用一个
Iterable

DataInputStream
DataOutputSink
几乎就是
java.io
类的明显映射。棘手的部分是缓冲区管理,因为流在
列表
实例中向您推送数据,这些实例可能与您想要的数据不一致。当然,一切都必须异步进行


HTH.

谢谢。这似乎还可以,但这样做相当麻烦。希望对io的更好支持即将到来。Dart库将在不久的将来刷新。确保你根据自己的具体需要提交一个bug。他的要求不限于任意对象序列化。我认为使用类似于DataInputstream/DataOutputStream的东西是合理的。如果您正在读取具有特定布局的二进制格式文件(压缩文件、Adobe colorbook文件等),或者您希望控制输出文件的精确布局,则这些功能尤其有用。Protobufs和其他人没有提供这个。哎呀,你是对的,我错了。但是,在ByteArray和OutputStream之上编写一个简单的抽象非常简单。