Вставка данных в RandomAccessFile и обновление индекса - PullRequest
0 голосов
/ 10 октября 2011

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

Так что если я хочу сейчас, где я могу найти данные набора данных № 3, например.Я прочитал 8 байтов по смещению (2 * 8).(Индексирование начинается с 0).

Сам набор данных состоит из 4 байтов, представляющих размер набора данных, а затем всех байтов, принадлежащих к набору данных.

Так что это прекрасно работает в случае, если явсегда переписывать весь файл.

Здесь очень важно, чтобы набор данных № 3 мог быть записан как первая запись в файле, так что индекс упорядочен, но не сами данные.

Еслия вставляю новый набор данных, я всегда добавляю его в конец файла.Но количество наборов данных, которые могут быть в одном файле, ограничено.Если я могу сохранить в файле 100 наборов данных, в индексе всегда будет 100 записей.Если смещение, считанное из индекса набора данных, равно 0, набор данных является новым и будет добавлен в файл.

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

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

Есть идеи, как это сделать?Или, может быть, есть лучший способ управлять хранением этих наборов данных в файле?

PS: Да, конечно, я думал об использовании базы данных, но это не применимо для моего проекта.Мне действительно нужны простые файлы.

Ответы [ 3 ]

1 голос
/ 10 октября 2011

Вы не можете легко вставить данные в середину файла.В основном вам нужно прочитать все оставшиеся данные, записать «новые» данные, а затем переписать «старые» данные.В качестве альтернативы, вы могли бы сделать недействительной старую «медленную» (потенциально позволяющую использовать ее позже), а затем просто записать всю новую запись в конец файла.Если честно, ваш формат файла не совсем понятен, но, по сути, вы должны знать, что вы не можете вставить (или удалить) в середине файла.

0 голосов
/ 15 мая 2014

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

  • Ограничьте все наборы данных фиксированной длиной .
  • Удалить поизменение / удаление индекса и добавление всегда добавляя в конец файла.Обновите, удалив старый набор данных и добавив новый набор данных в конец, если новый набор данных длиннее. Время от времени сжимайте файл, фактически удаляя «игнорируемые наборы данных» и перемещая все действительные наборы данных вместе (переписывая все).
  • Если вы не можете ограничить набор данных фиксированной длинойи вы намереваетесь обновить набор данных, увеличив его длину, вы также можете оставить указатель в конце первой части набора данных и продолжить его позже в файле.Таким образом, вы получите структуру, подобную связанному списку .Если имеет место большое редактирование, то здесь также имеет смысл перегруппировать и сжать файл.

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

PS: Я надеюсь, что можно ответить на такие старые вопросы - я не смог найти ничего об этом в справочном центре, и я относительно новичокздесь.

0 голосов
/ 10 октября 2011

У меня есть RandomAccessFile в Java, где я управляю некоторыми данными.

Стоп. У вас есть файл. В настоящее время вы обращаетесь к нему через RandomAccessFile в Java. Однако весь ваш вопрос относится к самому файлу, а не к RandomAccessFile или Java. У вас есть серьезная проблема с дизайном файлов, так как вы предполагаете такие возможности, как вставка в середину файла, которого нет ни в одной файловой системе, которую я использовал с 1979 года.

...