【问题标题】:DataOutputStream equivalent for Dart相当于 Dart 的 DataOutputStream
【发布时间】:2012-09-23 09:59:33
【问题描述】:

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

【问题讨论】:

    标签: dart


    【解决方案1】:

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

    【讨论】:

    • 谢谢 这似乎没问题,但这样做比较麻烦。希望对 io 的更好支持即将到来。
    • Dart 基础库将在不久的将来更新。确保根据您的特定需求提交错误。
    【解决方案2】:

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

    它在https://pub.dev/packages/jovial_miscio_streams 上发布,或者如果您愿意,https://github.com/zathras/misc/tree/master/dart/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&lt;List&lt;int&gt;&gt; 当然通常来自套接字或File.openRead() 等。还有一个同步的DataInputStream 变体并采用Iterable,如果你确实有所有可用的字节数据前面。

    DataInputStreamDataOutputSink 几乎是java.io 类的明显映射。棘手的部分是缓冲区管理,因为流在​​List&lt;int&gt; 实例中向您推送数据,这些实例可能与您想要的数据没有对齐。而且,当然,有必要异步执行所有操作。

    HTH。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 他的要求不限于任意对象序列化。我认为拥有类似于 DataInputstream/DataOutputStream 的东西是合理的。如果您正在阅读具有特定布局的二进制格式文件(压缩文件、Adobe colorbook 文件等等),或者您想要控制输出文件的精确布局,这些功能特别有用。 Protobufs 和其他人不提供这个。
      • 哎呀,你是对的,我错了。但是,在 ByteArray 和 OutputStream 之上编写一个简单的抽象非常简单。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        你可以使用这个类: 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

        【讨论】:

          猜你喜欢
          • 2014-12-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-12
          • 2020-01-29
          • 1970-01-01
          • 2016-09-29
          • 2019-02-08
          相关资源
          最近更新 更多