Читать структурированный двоичный файл

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

3 ответа

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

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

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

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

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

Пытаться

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();
}
Другие вопросы по тегам