Очень простой кольцо/кольцевой буфер в Java


Мне нужен простой способ для выполнения тестов на прошлой Н байт данных, полученных из сокета, и кольцевой буфер, как представляется, наиболее эффективный способ справиться с этим. Это очень простой буфер, который хранит целые числа и доступной снимков его содержание как String для быстрого анализа.

public class RingBuffer{
    private final int size;
    private int[] buffer;
    private volatile int index = 0;

    public RingBuffer(int size){
        this.size = size;
        this.buffer = new int[size];
    }

    public int feed(int input){
        int old = buffer[index];
        buffer[index] = input;

        int nextIndex = index + 1;
        index = nextIndex % size;

        return old;
    }

    public String toString(){
        StringBuilder sb = new StringBuilder();
        for(int i=0;i<size;i++)
            sb.append((char)buffer[(index + i) % size]);
        return sb.toString();
    }
}

Я не беспокоюсь о ограниченные функции или потокобезопасность, так как это используется InputStream фантик. Меня больше волнуют возможные проблемы целостности или любое другое базовое надзора, что бы удержать результат не последовательны, т. е. данных, не совпадает с данными происходит в.

Мой использовать случае для связи: отделка под управлением Windows перевод строки и период, если он имеется, из конца потока.

class GopherInputStream extends InputStream{
    private static final int BUFFER_SIZE = 5;
    private final Pattern TRIM_PATTERN = Pattern.compile(".*\r\n\\.(\r\n)?");

    private final InputStream is;
    private final RingBuffer buffer = new RingBuffer(BUFFER_SIZE);

    private volatile boolean started = false, ended = false;

    GopherInputStream(InputStream is){
        this.is = is;
    }

    @Override
    public int read() throws IOException{
        if(!started){
            preload();
            started = true;
        }
        if(ended) return -1;
        int read = is.read();
        if(read == -1){
            if(TRIM_PATTERN.matcher(buffer.toString()).matches()){
                ended = true;
                return -1;
            }
        }

        int buffered = buffer.feed(read);
        if(buffered == -1)
            ended = true;
        return buffered;
    }

    private void preload() throws IOException{
        int i=0, read;
        while(i++<BUFFER_SIZE && (read = is.read()) != -1)
            buffer.feed(read);
        while(i++<BUFFER_SIZE)
            buffer.feed(-1);
    }
}


497
1
задан 6 февраля 2018 в 10:02 Источник Поделиться
Комментарии