В Java, при записи в файл с помощью DataOutputStream, как мне определить Endian записываемых данных? - PullRequest
7 голосов
/ 11 августа 2011

Я использую 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?

Ответы [ 5 ]

9 голосов
/ 11 августа 2011

Вы не можете сделать это с DataOutputStream, в котором всегда используется порядковый номер.

Вы можете использовать ByteBuffer, для которого вы можете позвонить order(), чтобы влиять на то, как он читает и записывает данные.

Вы можете использовать ByteBuffer или , чтобы подготовить byte[], который вы будете писать с классическим OutputStream позже или , полностью перейти на NIO и использовать любые WritableByteChannel для написания

3 голосов
/ 19 августа 2015

Вы можете использовать: com.google.common.io.LittleEndianDataOutputStream из

https://google.github.io/guava/releases/17.0/api/docs/com/google/common/io/LittleEndianDataOutputStream.html или скопируйте этот класс: http://www.cafeaulait.org/books/javaio/ioexamples/07/LittleEndianOutputStream.java

0 голосов
/ 11 августа 2011

все приведенные ответы верны.Однако вы можете взять источник DataOutputStream, вставить его в новый класс и изменить порядок байтов в различных writeShort, writeLong и т. Д. (Или, по крайней мере, в тех, которые вам нужны).Это не такая сложная работа.

Очевидно, что вы не сможете использовать ее для связи с DataInputStream с другой стороны, но я полагаю, вам нужно записать в файл или сокет программу C на другой сторонепоэтому вам не понадобится DataInputStream.

0 голосов
/ 11 августа 2011

Он выводит данные способом, который читается DataInputStream.

Если вам нужно беспокоиться о порядке байтов, вам не следует использовать Data * Stream.

0 голосов
/ 11 августа 2011

Вы не можете :

Записывает короткое замыкание в основной выходной поток как два байта, старший байт первым.

Все "многобайтовые" методы работают так. Если вам это нужно, вы должны сами написать байты.

...