Java中的内存流

时间:2011-12-08 19:43:48

标签: java memory stream seek

我正在寻找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的实例我 应该能够同时创造 输入和输出流,也应该允许 在任何方向定位。内存流需要 它不是圆形的,它适用于小尺寸 并自动成长。只需要内存流 被限制在一个过程中。

任何开箱即用的代码?

4 个答案:

答案 0 :(得分:93)

ByteArrayInputStreamByteArrayOutputStream正是您要找的。

这些是接口InputStreamOutputStream的实现,它们读取和写入内存中的字节数组。对于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)

NIO允许您直接在内核内存中传输数据 - 我不确定它是否与.NET的内存流完全重叠。 Here's一个将整个文件映射到内存中以供阅读的简单示例。