Подтвердить что ты не робот

Поток памяти в Java

Я ищу реализацию потока памяти в Java. Реализация должна быть примерно смоделирована после реализации потока памяти .NET.

В принципе, я хотел бы иметь класс MemoryStream который имеет фабричные методы:

 class MemoryStream {
     MemoryInput createInput();
     MemoryOutput createOutput();
 }

 class MemoryInput extends InputStream {
    long position();
    void seek(long pos);
 }

 class MemoryOutput extends OutputStream {
    long position();
    void seek(long pos);
 }

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

Любой из доступных кодов коробки?

4b9b3361

Ответ 1

ByteArrayInputStream и ByteArrayOutputStream - это то, что вы ищете.

Это реализация интерфейсов InputStream и OutputStream, которые читаются и записываются в массив байтов в памяти. Для ByteArrayOutputStream массив будет расти автоматически при записи данных в поток.

Ответ 2

Вы можете использовать PipedInputStream и PipedOutputStream

вот так:

PipedOutputStream outstr = new PipedOutputStream();
PipedInputStream instr = new PipedInputStream(outstr);

который напрямую не позволит вам искать, но это позволяет вам пропускать столько байтов из входного потока.

Имейте в виду, что всякий раз, когда вы записываете в outstr, он блокируется до тех пор, пока все не будет прочитано в instr (то есть: если я правильно помню, Streams не Buffer, но вы можете украсить их BufferedInputStream, тогда вы не приходится беспокоиться.

Ответ 3

Нужно ли поддерживать потоки ввода и вывода? Если нет, я бы просто использовал ByteBuffer, который позволяет вам читать/писать примитивные типы в случайных местах. (До 2 ГБ)

Вы можете делиться ByteBuffer между читателем и писателем.

например.

// 1 GB of virtual memory outside the heap.
ByteBuffer writer = ByteBuffer.allocateDirect(1024*1024*1024); 
ByteBuffer reader = writer.slice();

Вы можете обмениваться памятью между потоками (например, Exchanger) и процессами (используя файлы с отображением памяти)