Чтение структурированного бинарного файла

Я хочу прочитать двоичный файл на Java. Я знаю, что файл содержит последовательность структур данных, таких как: строка байтов ANSI ASCII, целое число, строка байтов ANSI ASCII. Как я могу прочитать и получить данные файла, даже если предположить, что количество структур данных уже известно (N)? Я вижу, что интерфейс DataInput имеет метод readUTF() для чтения строки, но использует формат UTF-8. Как мы можем обрабатывать случай ASCII?


person arjacsoh    schedule 17.04.2013    source источник


Ответы (3)


Я думаю, что наиболее гибкий (и эффективный) подход:

  1. Откройте FileInputStream.
  2. Получите FileChannel, используя метод getChannel() потока.
  3. Сопоставьте канал с MappedByteBuffer, используя метод канала map().
  4. Доступ к данным через различные get* методы буфера.
person Ted Hopp    schedule 17.04.2013

пытаться

public static void main(String[] args) throws Exception {
    int n = 10;
    InputStream is = new FileInputStream("bin");
    for (int i = 0; i < n; i++) {
        String s1 = readAscii(is);
        int i1 = readInt(is);
        String s2 = readAscii(is);
    }
}

static String readAscii(InputStream is) throws IOException, EOFException,
        UnsupportedEncodingException {
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    for (int b; (b = is.read()) != 0;) {
        if (b == -1) {
            throw new EOFException();
        }
        out.write(b);
    }
    return new String(out.toByteArray(), "ASCII");
}

static int readInt(InputStream is) throws IOException {
    byte[] buf = new byte[4];
    int n = is.read(buf);
    if (n < 4) {
        throw new EOFException();
    }
    ByteBuffer bbf = ByteBuffer.wrap(buf);
    bbf.order(ByteOrder.LITTLE_ENDIAN);
    return bbf.getInt();
}
person Evgeniy Dorofeev    schedule 17.04.2013
comment
Простой код не является ответом. Вы должны объяснить это и объяснить, как это отвечает на вопрос. - person user207421; 18.04.2013

Как мы можем справиться с ASCII?

Вы можете справиться с этим с помощью readFully().

NB readUTF() предназначен для определенного формата, созданного DataOutput.writeUTF(), и ничем другим, о чем я знаю.

person user207421    schedule 17.04.2013