我正在寻找Java中的内存流实现。实施 应该在.NET memory stream实施后大致建模。
基本上我想要一个必须出厂的班级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
的实例我
应该能够同时创造
输入和输出流,也应该允许
在任何方向定位。内存流需要
它不是圆形的,它适用于小尺寸
并自动成长。只需要内存流
被限制在一个过程中。
任何开箱即用的代码?
答案 0 :(得分:93)
ByteArrayInputStream
和ByteArrayOutputStream
正是您要找的。 p>
这些是接口InputStream
和OutputStream
的实现,它们读取和写入内存中的字节数组。对于ByteArrayOutputStream
,当您将数据写入流时,数组将自动增长。
答案 1 :(得分:9)
您可以使用PipedInputStream和PipedOutputStream
像这样:PipedOutputStream outstr = new PipedOutputStream();
PipedInputStream instr = new PipedInputStream(outstr);
不会直接允许您搜索,但它确实允许您从输入流中跳过所需的字节数。
请注意,无论何时写入outtr,它都会被阻塞,直到从instr中读取所有内容(即:如果我没记错,Streams不会缓冲,但你可以使用BufferedInputStream来装饰它们,那么你就不会不得不打扰。
答案 2 :(得分:8)
是否需要支持输入和输出流?如果不是,我只会使用ByteBuffer,它允许您在随机位置读/写原始类型。 (最多2 GB)
您可以在读者和作家之间共享ByteBuffer。
e.g。
// 1 GB of virtual memory outside the heap.
ByteBuffer writer = ByteBuffer.allocateDirect(1024*1024*1024);
ByteBuffer reader = writer.slice();
您可以在线程(例如Exchanger)和进程(使用内存映射文件)之间共享内存
答案 3 :(得分:4)