Лучший способ считать структурированные двоичные файлы с Java

Заменить эту строку: getResources().getDrawable(R.drawable.your_drawable)

с ResourcesCompat.getDrawable(getResources(), R.drawable.your_drawable, null)

EDIT

ResourcesCompat также устарела. Но вы можете использовать это:

ContextCompat.getDrawable(this, R.drawable.your_drawable) (Здесь this - это контекст)

для получения более подробной информации по этой ссылке: ContextCompat

49
задан Daniel Rikowski 6 May 2009 в 07:37
поделиться

11 ответов

К моему знанию Java вынуждает Вас считать файл как байты, а не способность заблокировать чтение. При сериализации объектов Java это была бы другая история.

другие примеры, показанные использование класс DataInputStream с Файлом, но можно также использовать ярлык: класс RandomAccessFile :

RandomAccessFile in = new RandomAccessFile("filename", "r");
int version = in.readInt();
byte type = in.readByte();
int beginOfData = in.readInt();
byte[] tempId;
in.read(tempId, 0, 16);
String id = new String(tempId);

Примечание, что Вы могли превратить объекты ответа в класс, если это облегчит.

34
ответ дан Powerlord 7 November 2019 в 21:33
поделиться

Я написал методику, позволяющую делать подобные вещи в java - аналогично старой C-подобной идиоме чтения битовых полей. Обратите внимание, что это только начало, но его можно расширить.

здесь

2
ответ дан 7 November 2019 в 11:33
поделиться

Если бы вы использовали Preon , то все, что вам нужно было бы сделать, это следующее:

public class Header {
    @BoundNumber int version;
    @BoundNumber byte type;
    @BoundNumber int beginOfData;
    @BoundString(size="15") String id;
}

Получив это, вы создаете кодек, используя одну строку:

Codec<Header> codec = Codecs.create(Header.class);

И вы используете кодек например:

Header header = Codecs.decode(codec, file);
20
ответ дан 7 November 2019 в 11:33
поделиться

Я бы создал объект, который обертывает представление данных ByteBuffer и предоставляет геттеры для чтения непосредственно из буфера. Таким образом вы избегаете копирования данных из буфера в примитивные типы. Кроме того, вы можете использовать MappedByteBuffer для получения байтового буфера. Если ваши двоичные данные сложны, вы можете смоделировать их с помощью классов и дать каждому классу нарезанную версию вашего буфера.

class SomeHeader {
    private final ByteBuffer buf;
    SomeHeader( ByteBuffer fileBuffer){
       // you may need to set limits accordingly before
       // fileBuffer.limit(...)
       this.buf = fileBuffer.slice();
       // you may need to skip the sliced region
       // fileBuffer.position(endPos)
    }
    public short getVersion(){
        return buf.getShort(POSITION_OF_VERSION_IN_BUFFER);
    }
}

Также полезны методы для чтения значений без знака из байтовых буферов.

HTH

3
ответ дан 7 November 2019 в 11:33
поделиться

Вы могли использовать класс DataInputStream следующим образом:

DataInputStream in = new DataInputStream(new BufferedInputStream(
                         new FileInputStream("filename")));
int x = in.readInt();
double y = in.readDouble();

etc.

, Как только Вы получаете эти значения, которые можно сделать с ними как Вам нравится. Ищите java.io. Класс DataInputStream в API для большего количества информации

19
ответ дан Vincent Ramdhanie 7 November 2019 в 21:33
поделиться

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

, Если это действительно имеет место, Вы играете в очень опасную игру. По крайней мере, в C, стандарт не осуществляет вещи как дополнение или выравнивание членов структуры. Не говоря уже о вещах как большой/маленький порядок байтов или биты четности... Таким образом, даже если Ваш код, оказывается, работает, это очень непортативно и опасно - Вы зависите от создателя компилятора, не передумавшего на будущих версиях.

Лучше для создания автомата обоим проверяют считанную структуру (байт на байт) от HD допустимо, и заполнение структуры в оперативной памяти, если это действительно в порядке. Можно освободить некоторые миллисекунды (не так, поскольку это может казаться для современных Ose, делают большое кэширование чтения с диска), хотя Вы получаете независимость компилятора и платформа. Плюс, Ваш код будет легко портирован на другой язык.

Постредактирование: В некотором роде я сочувствую Вам. В хорошие-ol' дни DOS/Win3.11 я когда-то создал программу C для чтения файлов BMP. И используемый точно та же техника. Все было хорошо, пока я не пытался скомпилировать его для Windows - ой!! Интервал был теперь 32 бита длиной, а не 16! То, когда я пытался скомпилировать на Linux, обнаружило, что gcc имел совсем другие правила для выделения битовых полей, чем Microsoft C (6.0!). Я должен был обратиться к макро-приемам для создания его портативным...

10
ответ дан Joe Pineda 7 November 2019 в 21:33
поделиться

Я предполагаю, что FileInputStream позволяет Вам читать в байтах. Так, открывая файл с FileInputStream и чтением в sizeof (заголовок). Я предполагаю, что заголовок имеет фиксированный формат и размер. Я не вижу, что упомянул в первом сообщении, но предположив, что это имеет место, поскольку это стало бы намного более сложным, если заголовок имеет дополнительный args и различные размеры.

, Как только у Вас есть информация, может быть класс заголовка, в котором Вы присваиваете содержание буфера, который Вы уже считали. И затем проанализируйте записи подобным способом.

4
ответ дан Arvind 7 November 2019 в 21:33
поделиться

Поскольку другие люди упоминают DataInputStream, и Буферы являются, вероятно, API низкого уровня, который Вы после для контакта с двоичными данными в Java.

Однако Вы, вероятно, хотите что-то как Конструкция (страница Wiki имеет хорошие примеры также: http://en.wikipedia.org/wiki/Construct_ (python_library) , но для Java.

я не знаю ни о ком (версии Java) от руки, но проявления, что подход (декларативно определение структуры в коде), вероятно, был бы правильным способом пойти. С подходящим быстрый интерфейс в Java это, вероятно, было бы весьма схоже с DSL.

РЕДАКТИРОВАНИЕ: бит гугления показывает это:

http://javolution.org/api/javolution/io/Struct.html

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

3
ответ дан John Montgomery 7 November 2019 в 21:33
поделиться

Вот ссылка для чтения байта с помощью ByteBuffer (NIO Java)

http://exampledepot.com/egs/java.nio/ReadChannel.html

4
ответ дан Javamann 7 November 2019 в 21:33
поделиться

В прошлом я использовал DataInputStream для чтения данных произвольных типов в указанном порядке. Это не позволит Вам легко объяснять проблемы с обратным порядком байтов/с прямым порядком байтов.

С 1,4 java.nio. Буферная семья могла бы быть способом пойти, но кажется, что Ваш код мог бы на самом деле быть более сложным. Эти классы действительно имеют поддержку обработки проблем порядка байтов.

1
ответ дан Darron 7 November 2019 в 21:33
поделиться

Только что я нашел эта статья об использовании отражения и парсинге считывать двоичные данные. В этом случае автор использует отражение для чтения двоичного файла Java .class файлы. Но если Вы считываете данные в файл класса, это может иметь некоторую справку.

1
ответ дан Thomas Jones-Low 7 November 2019 в 21:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: