2016-08-30 5 views
0

Веб-служба предоставляет двоичный код chunked application/octet-stream. Мне нужно создать клиент чтения в java. Я знаю структуру из какой-либо документации и хотел бы использовать этот поток как ObjectInputStream, но прежде чем я могу вызвать любые самодельные методы readObject, этот подход не выполняется из-за java.io.StreamCorruptedException: invalid stream header.Как получить доступ к данным из внешнего потока

Каков наилучший способ заполнения java-объектов из такого потока байтов?

BTW: данные поступают как LittleEndian, тексты в виде 16-битных символов предшествуют 4-байтовой информации размера, например.

03 00 00 00 41 00 62 00 63 00 (шестнадцатеричный)

приведет к "Abc"

+1

'ObjectInputStream' предполагает обработанные данные результат процесса маршалинга java. Ошибка, с которой вы столкнулись, происходит из-за того, что поток данных не начинается с обычных байтов 'aced 0005' – Aaron

+1

Вам нужно будет что-то сделать, например, поменять байты, использовать' DataInputStream' и заполнить объект. – bradimus

+0

@bradimus: Поскольку я сначала должен поменять байты до того, как будет работать dataInput.readInt(), в чем преимущество DataInputStream над базовым InputStream? Здесь (http://stackoverflow.com/questions/14827398/converting-byte-array-values-in-little-endian-order-to-short-values) Я узнал, что переключение с помощью байтов вручную предпочтительнее использования классов, , – datafiddler

ответ

0

Иногда это быстрее, чтобы сделать это с нуля (или с помощью инструментов, которые уже знать), чем искать более сложные решения. я просто создал свой собственный выделенный DataInputStream:

import java.io.IOException; 
import java.io.InputStream; 

public class LittleEndianInputStream { 
    private InputStream s; 

    public LittleEndianInputStream (InputStream in) { s = in; } 

    boolean readBoolean() throws IOException {return (s.read() == 1);} 

    int readInt() throws IOException {return s.read() | s.read() << 8 | s.read() << 16 | s.read() << 24; } 

    char readChar() throws IOException {return (char)(s.read() | s.read() << 8); } 

    String readString() throws IOException { 
     int len = readInt(); 
     char [] tarray = new char[len]; 
     for (int i = 0; i < len; i++) tarray[i] = readChar(); 
     return new String(tarray); 
    } 
} 

быть расширен для более типов данных, необходимых ...

Альтернативные решения по-прежнему приветствуются;)

Смежные вопросы