Поток памяти в 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
я смогу одновременно одновременно создавать входные и выходные потоки, которые также должны позволять позиционирование в любом направлении. Поток памяти не обязательно должен быть круговым, он должен хорошо работать при небольших размерах и автоматически увеличиваться. Поток памяти должен быть ограничен только одним процессом.
Любой из доступных кодов коробки?
Ответы
Ответ 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) и процессами (используя файлы с отображением памяти)
Ответ 4
NIO позволяет напрямую передавать данные в память ядра - я не уверен, что он точно перекрывается с потоком памяти .NET. Вот простой пример сопоставления всего файла в памяти для чтения.