Чтение из массива байтов в консоль (или файл) Java

Итак, у меня есть два файла: двоичный файл, который я прочитал в массив байтов, и текстовый файл, который я прочитал в ArrayList of Strings. Теперь давайте предположим, что мой ArrayList имеет значения «char», «int», «double» и служит схемой для чтения моего двоичного файла.

Это означает, что первые два байта в массиве байтов я хочу интерпретировать как char, следующие четыре — как int, а следующие 8 — как двойные, и это будет повторяться до тех пор, пока файл не закончится.

Я реализовал чтение всех данных, но не могу найти хороший способ правильно интерпретировать двоичные данные в соответствии с файлом схемы. Есть ли хороший способ сделать это?

IE (псевдокод) с использованием PrintStream out = new PrintStream (new OutputStream(byteArray)) out.writeChar() out.writeInt() out.writeDouble()

Где у меня работает Stream через byteArray? (В отличие от того, что я говорю out.writeChar(byteArray[2])?

Я понял всю логику сопоставления схемы с правильным действием, но у меня возникли проблемы с правильным преобразованием данных. Есть предположения?

Я хочу записать эту информацию либо в консоль (или в файл).


person Taylor C. White    schedule 04.09.2013    source источник


Ответы (2)


Думайте объектно-ориентированно! Вы должны создать класс для каждого желаемого типа данных, который способен анализировать данные во входном потоке.

Шаги (не заботясь об исключениях):

1) Создайте интерфейс для этих классов:

interface DataParser {
    void parse(DataInputStream in, PrintStream out);
}

2) Создайте класс для каждого типа данных, реализующего этот интерфейс. Пример:

class IntParser implements DataParser {
    public void parse(DataInputStream in, PrintStream out) {
        int value = in.readInt();
        out.print(value);
    }
}

3) Используйте HashMap для регистрации всех известных парсеров с их String ID:

Map<String, DataParser> parsers = new HashMap<>();
parsers.put("int", new IntParser());

4) Теперь вы можете использовать его так:

DataInputStream in = ... ;
PrintStream out = ... ;
...
while(hasData()) {
    String type = getNextType();
    DataParser parser = parsers.get(type);
    parser.parse(in, out);
}
// close streams and work on the output here

Метод hasData должен определить, есть ли еще данные во входном потоке. Метод getNextType должен возвращать строку следующего типа из вашего ArrayList.

person Seelenvirtuose    schedule 04.09.2013

если вам нужны только примитивные типы или строки, вы должны использовать DataInputStream для переноса ваших данных:

DataInputStream myDataInputStream=new DataInputStream(myByteInputStream);
myDataInputStream.readDouble();
myDataInputStream.readInt();
myDataInputStream.readChar();
myDataInputStream.readLong();
person Oren Ezer    schedule 04.09.2013