Мне нужна помощь/подсказки для преобразования кругового буфера на основе памяти на диск ... с операциями чтения/записи в файл на Java для хранения серии изображений.Реализация циклического буфера на диске
исследования в Интернете я обнаружил, что мне нужно:
* нет необходимости в кадрах фиксированного размера, но префикс каждого кадра с заголовком, который включает в себя фактический размер, а также временные метки и флаги. Затем вы можете просто запомнить смещение заголовка первого допустимого фрейма и смещение конца последнего допустимого фрейма, и вы сможете реализовать циклический буфер FIFO. * Используйте упаковку по 8 для структуры заголовка и нанесите буфер на кратное 8, чтобы вы могли читать/записывать в файл без ошибок выравнивания.
Ниже приведен код, я использую в настоящее время:
class CircularBuffer {
private ImageIcon buffer[];
private int lastIdx;
private int firstIdx;
private int size;
private boolean empty;
/** default size */
static final int DEFAULT_SIZE = 50;
public CircularBuffer(int size) {
this.size = size;
this.clear();
}
public CircularBuffer() {
this(CircularBuffer.DEFAULT_SIZE);
}
public synchronized void push(ImageIcon data) {
buffer[this.lastIdx] = data;
if(this.lastIdx == this.firstIdx && !this.empty) {
this.firstIdx++;
this.firstIdx %= this.size;
}
if (this.empty){
this.empty = false;
}
this.lastIdx++;
this.lastIdx %= this.size;
}
public synchronized int getLength() {
if (this.empty)
return 0;
int len = this.lastIdx - this.firstIdx;
if (len < 0)
len = this.size + len;
return len == 0 ? this.size-1 : len;
}
public synchronized ImageIcon pop() {
if (isEmpty()) {
throw new IndexOutOfBoundsException("Empty buffer");
}
ImageIcon res = buffer[this.firstIdx];
buffer[this.firstIdx] = null;
this.firstIdx++;
this.firstIdx %= this.size;
if (this.firstIdx == this.lastIdx)
this.empty = true;
return res;
}
public synchronized boolean isEmpty() {
return this.empty;
}
public void clear() {
this.firstIdx = 0;
this.lastIdx = 0;
this.empty = true;
this.buffer = new ImageIcon[size];
}
public int getSize() {
return this.size;
}
}
Спасибо за вашу помощь!
Что вы хотите сказать? – Nick
Вопрос: Как изменить приведенный выше код для выполнения операций на диске, а не в памяти ... – Tekmanoid
И что вы пробовали? – Nick