2010-09-06 5 views
2

Je cherche quelque chose comme ByteArrayOutputStream mais avec une taille limitée. Si la taille est dépassée, les anciennes données doivent être écrasées. C'est aussi loin que je comprends un ringbuffer. Des idées?ringbuffer pour ByteArrayOutputStream en java

+0

Voulez-vous à étendre OutputStream? – aioobe

+0

peut-être? Je veux juste une implémentation où l'utilisation de la mémoire est restreinte? Dans ByteArrayOutputStream le tableau d'octets se développe sans limite autant que je comprends. – Martin

Répondre

3

Il n'y a pas vraiment grand-chose. Vous pourriez le faire vous-même. Voici un début:

class ByteArrayRingBuffer extends OutputStream { 

    byte[] data; 
    int capacity, pos = 0; 
    boolean filled = false; 

    public ByteArrayRingBuffer(int capacity) { 
     data = new byte[capacity]; 
     this.capacity = capacity; 
    } 

    @Override 
    public synchronized void write(int b) { 
     if (pos == capacity) { 
      filled = true; 
      pos = 0; 
     } 
     data[pos++] = (byte) b; 
    } 

    public byte[] toByteArray() { 
     if (!filled) 
      return Arrays.copyOf(data, pos); 
     byte[] ret = new byte[capacity]; 
     System.arraycopy(data, pos, ret, 0, capacity - pos); 
     System.arraycopy(data, 0, ret, capacity - pos, pos); 
     return ret; 
    } 
} 

(Vous pouvez passer outre write(byte[] b, int off, int len) si vous avez besoin de l'efficacité.)

+0

Merci, exactement ce dont j'avais besoin. Je me demandais juste si je suis le seul à avoir besoin d'une telle chose? Cela ne me semble pas exotique. – Martin

+1

Avez-vous cherché "java ringbuffer" sur google? Il y a des tonnes d'implémentations. – aioobe