Как пакетировать данные, используя кольцевой буфер - PullRequest
0 голосов
/ 25 января 2019

Я создал кольцевой буфер и хотел бы создать пакет из 1000 записей. Как только в моем буфере будет 1000 записей, я хотел бы записать данные в файл и очистить буфер.Каждая партия будет новым файлом.Я попытался использовать метод reset () для сброса буфера после заполнения емкости.Я не знаю, как записать данные в виде нового файла. Пожалуйста, помогите

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.List;

public class DataBuffer<T> {

    public T[] elements = null;

    public int capacity = 0;
    public int writePos = 0;
    public int readPos = 0;

    public boolean flipMarker = false;

    public DataBuffer(Class<T> type, int capacity) {
        this.capacity = capacity;
        @SuppressWarnings("unchecked")
        final T[] elements = (T[]) Array.newInstance(type, capacity);
        this.elements = elements;
    }

    public T get(int i) {
        return elements[i];
    }

    public void reset() {
        this.writePos = 0;
        this.readPos = 0;
        this.flipMarker = false;
    }

    public int available() {
        if (!flipMarker) {
            return capacity - writePos;
        }
        return readPos - writePos;
    }

    public int remainingCapacity() {
        if (!flipMarker) {
            return capacity - writePos;
        }
        return readPos - writePos;
    }

    public boolean put(T element) {
        if (!flipMarker) {
            if (writePos == capacity) {
                writePos = 0;
                flipMarker = true;

                if (writePos < readPos) {
                    elements[writePos++] = element;
                    return true;
                } else {
                    return false;
                }
            } else {
                elements[writePos++] = element;
                return true;
            }
        } else {
            if (writePos < readPos) {
                elements[writePos++] = element;
                return true;
            } else {
                return false;
            }
        }
    }

    public T take() {
        if (!flipMarker) {
            if (readPos < writePos) {
                return elements[readPos++];
            } else {
                return null;
            }
        } else {
            if (readPos == capacity) {
                readPos = 0;
                flipMarker = false;

                if (readPos < writePos) {
                    return elements[readPos++];
                } else {
                    return null;
                }
            } else {
                return elements[readPos++];
            }
        }
    }

    public List<T> getAll(){
        return (List<T>) Arrays.asList(elements);
    }
}

Код, который пытался пролить данные на диск, как показано ниже

private DataBuffer<Employee> processedSyslogDataBuffer = new DataBuffer<>(Employee.class, 1000);
 processedSyslogDataBuffer.put(processedMessage);
if(processedSyslogDataBuffer.remainingCapacity() == 0) {
    List<Employee> data = processedSyslogDataBuffer.getAll();
    logger.info("Writing processed data with size :: "+data.size());
    writerService.writeProcessed(data);
   logger.info("resetting the buffer to accomodate next batch of records");
    processedSyslogDataBuffer.reset();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...