Java中的内存流

Tra*_*ers 65 java memory stream seek

我正在寻找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);
 }
Run Code Online (Sandbox Code Playgroud)

因此,一旦我有一个类的实例,MemoryStream我应该能够同时创建输入和输出流,这也应该允许在任何方向上定位.内存流不必是圆形的,它应该适用于小尺寸并自动生长.内存流只需要限制在一个进程中.

任何开箱即用的代码?

(*).NET内存流
http://msdn.microsoft.com/en-us/library/system.io.memorystream.aspx

Jes*_*per 97

ByteArrayInputStream而且ByteArrayOutputStream正是你要找的.

这些是接口的实现InputStreamOutputStream从读取和写入到存储器中的字节数组.因为ByteArrayOutputStream,在将数据写入流时,数组将自动增长.

  • 所以最终的解决方案(没有随机定位)`ByteArrayOutputStream inMemoryStream = new ByteArrayOutputStream();/*写入流*/; ByteArrayInputStream inputStream = new ByteArrayInputStream(inMemoryStream.toByteArray());/*从inputStream*/`读取 (3认同)

Ang*_*chs 9

您可以使用PipedInputStream和PipedOutputStream

像这样:

PipedOutputStream outstr = new PipedOutputStream();
PipedInputStream instr = new PipedInputStream(outstr);
Run Code Online (Sandbox Code Playgroud)

这不会直接允许您搜索,但它确实允许您从输入流中跳过所需的字节数.

请注意,无论何时写入outtr,它都会被阻塞,直到从instr中读取所有内容(即:如果我没记错,Streams不会缓冲,但你可以使用BufferedInputStream来装饰它们,那么你就不必费心了.


Pet*_*rey 8

是否需要支持输入和输出流?如果不是,我只会使用ByteBuffer,它允许您在随机位置读/写原始类型.(最多2 GB)

您可以在阅读器和编写器之间共享ByteBuffer.

例如

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

您可以在线程(例如Exchanger)和进程(使用内存映射文件)之间共享内存


Ami*_*ani 3

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

  • 您可以将外部链接中的代码添加到您的答案中吗? (3认同)