【问题标题】:In Java, when writing to a file with DataOutputStream, how do I define the Endian of the data being written?在 Java 中,使用 DataOutputStream 写入文件时,如何定义正在写入的数据的 Endian?
【发布时间】:2011-08-11 10:04:56
【问题描述】:

我正在使用DataOutputStream 写入文件,但是我想更改数据的字节序。

这就是我将字节数据写入文件的方式(默认以小端格式输出)

public void generateBinObjFile(String outputFile)
    try {
        // Create file

        DataOutputStream stream = new DataOutputStream(
                new FileOutputStream(outputFile));

        stream.writeShort(this.quantize(this.xComponents.get(index), //<-- Short is written in little Endian
                    this.min_x, this.max_x) - 32768);

        } // catch statements here

有没有一种方法可以定义字节数据在 Java 中的写入方式?

【问题讨论】:

    标签: java io endianness


    【解决方案1】:

    DataOutputStream 不能这样做,它总是使用大端序。

    可以使用ByteBuffer,您可以在其上调用order() 来影响它读取和写入数据的方式。

    您可以使用ByteBuffer either 准备一个byte[],稍后您将使用经典的OutputStream 编写它完全转到 NIO 和使用任何WritableByteChannel 进行写作

    【讨论】:

    • 它说“无法实例化类型'ByteBuffer'”。我正在使用 new 关键字来创建它的对象,是否有不同或更正确的方法来创建对象的实例?
    • @deztructius:请检查我链接到的 JavaDoc。
    • 你可以使用ByteBuffer.allocateDirect(int size)
    【解决方案2】:
    【解决方案3】:

    You cannot:

    以两个字节的形式向底层输出流写入一个short,首先是高字节。

    所有“多字节”方法都是这样工作的。 如果你需要它,你需要自己写字节。

    【讨论】:

      【解决方案4】:

      所有给出的答案都是正确的。但是,您可以获取 DataOutputStream 的源,将其粘贴到一个新类中,并颠倒各种 writeShort、writeLong 等(或至少在您需要的那些)中的字节顺序。这不是一项艰巨的工作。

      显然你不能用它来与另一端的 DataInputStream 通信,但我想你需要用另一端的 C 程序写入文件或套接字,所以你不需要 DataInputStream。

      【讨论】:

        【解决方案5】:

        它以 DataInputStream 可读的方式输出数据。

        如果您必须担心字节顺序,则不应使用 Data*Stream。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-12-28
          • 2010-09-05
          • 2018-03-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多