Удаление частей файла данных в Java - PullRequest
0 голосов
/ 04 июля 2010

У меня есть файл, в котором я пишу некоторые объекты Java.После записи иногда мне нужно удалить некоторые из этих объектов, помещенных в случайные позиции в файле.Есть ли способ удалить выбранный объект из файла без замены всего файла?

Спасибо.

Ответы [ 4 ]

5 голосов
/ 04 июля 2010

Нет, это то, что большинство файловых систем не поддерживает. (Некоторые могут иметь специальные структуры данных, чтобы сделать их дешевыми, но большинство этого не делают - и стандартные API не поддерживают эту идею.)

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

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

2 голосов
/ 04 июля 2010

@ Джон Скит прав.

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

Лучшее, что я мог придумать, было перезаписать его последовательностью 0x73 байтов ... представление null; см. главу 6 Спецификации сериализации Java . Но у этого есть три серьезные проблемы:

  • Перезапись байтами 0x73 превратит один объект в несколько null с, что усложнит жизнь приложению, пытающемуся прочитать поток сериализованных объектов.
  • Если бы любые другие объекты в потоке содержали ссылки на забитый объект, эти ссылки были бы повреждены, и вы получили бы исключение.
  • Было бы трудно определить начальные и байтовые смещения с потоком для объектов, которые должны быть перекрыты.

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

1 голос
/ 04 июля 2010

Вы можете попробовать использовать RandomAccessFile и заменить объект пробелами. Затем в автономном режиме вы можете обрезать его.

0 голосов
/ 06 августа 2014

Вы можете просто пометить свой объект, чтобы сказать, что это свободное место, фактически не удаляя его.Следующий добавляемый объект, если он подходит, может быть вставлен в промежуток, созданный удаленным объектом.Очевидно, что шансы на то, что новый объект не будет полностью заполнять пробел, оставляя некоторое пространство, это называется внутренней фрагментацией, и вы должны ожидать, что он увеличится со многими циклами добавления / удаления.

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

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