Я хочу прочитать двоичный файл на Java. Я знаю, что файл содержит последовательность структур данных, таких как: строка байтов ANSI ASCII, целое число, строка байтов ANSI ASCII. Как я могу прочитать и получить данные файла, даже если предположить, что количество структур данных уже известно (N)? Я вижу, что интерфейс DataInput имеет метод readUTF() для чтения строки, но использует формат UTF-8. Как мы можем обрабатывать случай ASCII?
Чтение структурированного бинарного файла
Ответы (3)
Я думаю, что наиболее гибкий (и эффективный) подход:
- Откройте
FileInputStream
. - Получите
FileChannel
, используя методgetChannel()
потока. - Сопоставьте канал с
MappedByteBuffer
, используя метод каналаmap()
. - Доступ к данным через различные
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
Простой код не является ответом. Вы должны объяснить это и объяснить, как это отвечает на вопрос.
- person user207421; 18.04.2013
Как мы можем справиться с ASCII?
Вы можете справиться с этим с помощью readFully().
NB readUTF() предназначен для определенного формата, созданного DataOutput.writeUTF(), и ничем другим, о чем я знаю.
person
user207421
schedule
17.04.2013