Java. Как вставить строку в начало файла?

Не давно, я начал писать на Java, у меня возникла необходимос в написании простенькой программки для учёта звонков. Учтенные звонки я решил хранить в файлах, в названии которых будет дата + последний звонок должен быть сверху, первый снизу. Для такой структуры файла мне потребовалось вставлять записи вначало, отодвигая все предыдущие записи. Для этого было написано расширение класса RandomAccessFile. Конкретно в фонде Apache Commons такой же штуки мне найти не удалось. И ещё сразу оговорюсь, сам класс я нашел на просторах интернета(ссылка в конце статьи), немного модифицировав его.

package my.pack;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

/**
 *
 * @author http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=86071&msg=625007
 */

public class ExtendedRandomAccessFile extends RandomAccessFile {
   /**
    * Буффер для для чтения и записи в файл
    */
   private byte[] buffer = new byte[8192];

   public ExtendedRandomAccessFile(String name, String mode) throws FileNotFoundException {
      super(name, mode);
   }

   public ExtendedRandomAccessFile(File file, String mode) throws FileNotFoundException {
      super(file, mode);
   }

   public void insert(byte[] buf, long off) throws IOException {
      if (buf == null) {
         throw new NullPointerException();
      }
      if (off < 0) {
         throw new IndexOutOfBoundsException();
      }
      if (buf.length == 0) {
         return;
      }
      /**
       * Запоминаем старый размер файла
       */
      long oldLength = length();

      if (off < oldLength) {
         /**
          * Если смещение меньше длины файла, т.е. вставляем как
          * бы в середину файла...
          * Увеличиваем длину файла на длину вставляемого массива
          */
         setLength(oldLength + buf.length);
         /**
          * Точка начиная с которой будем двигать куски файла в конец
          * buffer.length -размер передвигаемого куска
          */
         long startChunk = oldLength - buffer.length;
         while (true) {
            /**
             * Сначала передвигаем куски равные buffer.length
             */
            if (startChunk >= off) {
               seek(startChunk);
               readFully(buffer);
               seek(startChunk + buf.length);
               write(buffer);
            } else {
                /**
                 * В конце обычно остается кусок меньше buffer.length
                 * соответственно читаем не весь буфер, а только часть
                 */
               seek(off);
               int chunkLength = (int) (buffer.length + startChunk - off);
               readFully(buffer, 0, chunkLength);
               seek(off + buf.length);
               write(buffer, 0, chunkLength);
               break;
            }
            startChunk -= buffer.length;
         }
      } else {
         /**
          * Если смещение больше длины файла,
          * ничего сохранять и перемещать ненадо, просто увеличиваем файл:
          */
         setLength(off + buf.length);
      }
      /**
       * Все данные перемещены(если требовалось), размер файла увеличен
       * перемещаемся на нужную позицию
       */
      seek(off);
      /**
       * и записываем
       */
      write(buf);
   }
}

Теги: , ,

Дата: 28 ноября 2010

Автор: andreykyz

Комментарии: 0

Оставить комментарий

*

Комментарий:

Ваш e-mail не будет опубликован.
Обязательные поля помечены *

Разрешенные HTML теги:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>