2013-09-04 1 views
0

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

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

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

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

Если поток работает через ByteArray, для меня? (В отличие от того, что я сказал out.writeChar (byteArray [2])?

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

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

ответ

1

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

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

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 для регистрации всех известных парсеры с их Струнный 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.

0

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

DataInputStream myDataInputStream=new DataInputStream(myByteInputStream); 
myDataInputStream.readDouble(); 
myDataInputStream.readInt(); 
myDataInputStream.readChar(); 
myDataInputStream.readLong(); 

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

  • Нет связанных вопросов^_^