Использование файла произвольного доступа для обновления части файла в Java - PullRequest
1 голос
/ 10 марта 2012

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

У меня проблема с записью объекта в файл с помощью RandomAccessFile.Поскольку это объект узла, RAF не имеет методов чтения / записи.Я реализовал Serializable для своего класса дерева, но все еще не уверен, как записать дерево в файл.

Node<String> mynode = new Node<String>();
RandomAccessFile raf = new RandomAccessFile("raf.txt", "rw");
raf.write(mynode, 0, 100);

, который я получаю сообщение об ошибке, потому что mynode не byte[].

Моя вторая проблема - я не уверен, как искать файл для перезаписи.Что я сделал, так это добавил дополнительное поле в нод для идентификатора, и я сохранил хэш-карту для id: position, чтобы найти место для изменения.Не уверен, что это правильный путь

1 Ответ

1 голос
/ 10 марта 2012

Я не думаю, что ваш подход будет работать так, как вы думаете. RandomAccessFile используется для чтения и записи байтов в произвольной позиции. Вы, конечно, можете взять свой объект и сериализовать его в байтовый массив, который вы затем записываете в RAF (или просто записываете сериализованные байты, используя fileoutputstream) - но это не поможет вам, когда вы хотите обновить запись, потому что сериализованная форма записи, вероятно, будет разной длины при каждом ее изменении.

Как уже упоминалось в одном из комментариев, вы ищете базу данных - абстракцию более высокого уровня, чем простая линейная цепочка байтов, к которой RandomAccessFile предоставит вам доступ.

Если вы ищете систему хранения на основе файлов, которая может читать и записывать записи (например, легковесная встроенная база данных), посмотрите jdbm2 - она ​​также имеет встроенные структуры b-дерева ( что гораздо лучше для файловых хранилищ, чем для бинарного дерева).

...