
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); } }