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