операции с двоичными файлами Java - PullRequest
1 голос
/ 22 февраля 2012

У меня есть куча разных объектов (и типов объектов), которые я хочу записать в двоичный файл. Прежде всего мне нужно, чтобы файл был структурирован так:

`Тип объекта1

obj1, obj2 ...

Тип объекта2

obj1, obj2...

....

Будучи двоичным файлом, это не помогает пользователю прочитать его, но я хочу иметь структуру, чтобы я мог искать, удалять или добавлять объект по его типу, а не анализировать весь файл. И это то, что я не знаю, как сделать. Это вообще возможно?

1 Ответ

1 голос
/ 22 февраля 2012

Вы должны будете поддерживать заголовок в начале файла (или где-то еще), чтобы отмечать положение и длину каждого из ваших объектов.

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

object1 500 1050
object2 1550 800
object3 2350 2000
<some padding to cover 500 bytes>
<the 1050 bytes of object1><the 800 bytes of object2><the 2000 bytes of object3> 

и знать, что object1 начинается со смещения 400 в файле и имеет длину1050 байт.

Поскольку кажется, что у вас есть различные типы объектов, которые вы хотите сохранить, вам, вероятно, потребуется добавить некоторые дополнительные данные в ваш заголовок.

Позаботьтесь о следующем:

  • Каждый раз, когда вы добавляете, удаляете или модифицируете файл, вам придется обновлять в заголовке смещение для всех последующих файлов (например,если я удаляю object2, то смещение для object3 теперь равно 1550).
  • Если вы сохраняете заголовок в том же файле, что и данные, то при вычислении смещений необходимо учитывать размер заголовка (этобудет намного сложнее, я предлагаю вам держать заголовок и двоичные данные разделенными.
  • Вам придется читать и анализировать заголовок каждый раз, когда вы хотите получить доступ к объекту. Рассмотрите возможность использования стандартного формата для заголовка, чтобыизбегайте проблем (YML или XML).

Я не знаю ни одной библиотеки, которая поможет вам реализовать такую ​​функцию, но я почти уверен, что есть такие. Может быть, кто-то сможет предложитьone.

-

Другим решением было бы использовать что-то вроде ZipFile (который изначально поддерживается Java) и записывать каждый из ваших объектов вОтличный ZipEntry.Таким образом, вам не придется самостоятельно управлять разделением объектов, и вам нужно будет только знать, какой именно ZipEntry вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...