2013-02-26 4 views
0

Мне нужна помощь/подсказки для преобразования кругового буфера на основе памяти на диск ... с операциями чтения/записи в файл на 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; 
} 

}

Спасибо за вашу помощь!

+0

Что вы хотите сказать? – Nick

+0

Вопрос: Как изменить приведенный выше код для выполнения операций на диске, а не в памяти ... – Tekmanoid

+0

И что вы пробовали? – Nick

ответ

0

Используйте память MappedByteBuffer .. что дает Java -> память -> диск и массив, так API

+0

Спасибо, что выглядит интересно! – Tekmanoid

1

С другого вопроса, я хотел бы предложить, что вам не нужно беспокоиться имея ничего настолько продвинутые, как дисковые круговые буферы. Что относительно следующего псевдокода:

Start: 
    lastFrame = 0 
    Loop Until STOP_REQUESTED: 
     get_new_image_frame 
     lastFrame++ 
     if (lastFrame > maxFrames) 
     lastFrame = 1 
     EndIf 
     write_image_to_disk_named("image" + lastFrame + ".jpg") 
    EndLoop 

    initialise_video_ready_to_add_frames() 
    Loop: 
     add_image_to_video("image" + lastFrame + ".jpg") 
     lastFrame++ 
     if (lastFrame > maxFrames) 
     lastFrame = 1 
     EndIf 
    EndLoop 
+0

Мне, возможно, придется пойти с чем-то более простым, как это да ... – Tekmanoid

Смежные вопросы