2016-05-26 5 views
0

Я нахожусь в центре проекта Java, где одна из вещей, которые мне нужно сделать, чтобы заставить его работать, - это писать и читать объекты с диска. В частности, мне нужно написать, а затем загрузить данные данных данного объекта из одного RandomAccessFile с фиксированными размерами записей для каждого объекта. Этот файл представляет собой раздел с фиксированными размерами блоков диска.Java: Каков наилучший способ записи элементов данных объекта в файл?

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

Подход, который я использовал выше, просто чересчур запутан. Есть ли лучший способ, более простой способ? То, о чем я думал, похоже на то, что вы можете сделать на C++. Раньше я сохранял и перезагружал данные объекта из индексированных записей фиксированного размера довольно легко, используя указатель на объект, а затем записывал все байты оттуда с ofstream (или аналогичным) после литья указателя на const char * с использованием reinterpret_cast. Загрузка файла с помощью ifstream (или аналогичного) была такой же простой, просто используя индекс * sizeOf(Foo) для вычисления смещения указателя файла, а затем поиск перед чтением в память из файла.

Есть ли что-то похожее на этот подход в Java?

+0

Ваш подход на С ++ может потерпеть неудачу, если типы не являются типами POD. Вам нужно прочитать о сериализации объектов. – PaulMcKenzie

+0

Как вы храните объект со списком/массивом связанных объектов в записях фиксированного размера? – Andreas

+0

Случайный доступ к этим объектам кажется задачей, которая будет более удобно решать путем записи их в базу данных, а не файлов на диске. Есть ли какие-то ограничения, которые затрудняют это? –

ответ

0

Это похоже на то, что вы ищете, это ObjectOutputStream, который позволяет сериализовать произвольные (но должны реализовывать объекты Serializable) в массив байтов (или в этом случае поток), который затем можно записать на диск. Это само по себе не будет поддерживать ваши потребности в произвольном доступе, но это будет хорошая часть решения, которое не требует специальных адаптеров.