Поток памяти в Java - PullRequest
       50

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

63 голосов
/ 08 декабря 2011

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

В принципе, я хотел бы иметь класс 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 I должен иметь возможность одновременно создавать входные и выходные потоки, которые также должны позволять позиционирование в любом направлении. Поток памяти нужен не должен быть круглым, он должен хорошо работать для небольших размеров и автоматически расти. Поток памяти нужен только быть заключенным в один процесс.

Есть ли в наличии код из коробки?

Ответы [ 4 ]

94 голосов
/ 09 декабря 2011

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

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

9 голосов
/ 08 декабря 2011

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

следующим образом:

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

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

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

8 голосов
/ 08 декабря 2011

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

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

например,

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

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

4 голосов
/ 08 декабря 2011

NIO позволяет напрямую передавать данные в памяти ядра - я не уверен, что они точно совпадают с потоком памяти .NET. Вот простой пример отображения всего файла в памяти для чтения.

...