我正在寻找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
I应该能够并发地同时创建输入和输出流,这也应该允许定位在任何方向。内存流需求不是圆形的,应该适合小尺寸并自动增长。只需要内存流被限制在一个过程。
有现成的代码吗?
ByteArrayInputStream
和ByteArrayOutputStream
是您正在寻找的。
这些是接口InputStream
和OutputStream
的实现,它们从内存中读取和写入字节数组。对于ByteArrayOutputStream
,当您向流写入数据时,数组将自动增长。
是否需要支持输入和输出流?如果不是,我就使用ByteBuffer,它允许你在随机位置读/写基本类型。(不超过2gb)
可以在读写器之间共享ByteBuffer。
。
// 1 GB of virtual memory outside the heap.
ByteBuffer writer = ByteBuffer.allocateDirect(1024*1024*1024);
ByteBuffer reader = writer.slice();
你可以在线程(例如交换器)和进程(使用内存映射文件)之间共享内存
可以使用PipedInputStream和PipedOutputStream
:
PipedOutputStream outstr = new PipedOutputStream();
PipedInputStream instr = new PipedInputStream(outstr);
,它不直接允许你查找,但它允许你从输入流中跳过你想要的多少字节。
请注意,每当您写入outstr时,它都会被阻塞,直到从instr中读取所有内容(也就是说:如果我没记错的话,流不会缓冲,但您可以使用BufferedInputStream来装饰它们,然后您就不必麻烦了。
NIO允许您直接在内核内存中传输数据-我不确定它是否与。net的内存流完全重叠。下面是将整个文件映射到内存以供读取的简单示例。