75

我正在寻找 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我应该能够同时创建输入和输出流,这也应该允许在任何方向上定位。内存流不必是循环的,它应该适用于小尺寸并自动增长。内存流只需限制在一个进程中。

有可用的开箱即用代码吗?

4

4 回答 4

115

ByteArrayInputStream并且ByteArrayOutputStream是您正在寻找的。

这些是接口的实现,InputStream它们OutputStream从内存中的字节数组读取和写入。对于ByteArrayOutputStream,当您将数据写入流时,数组将自动增长。

于 2011-12-08T22:06:15.670 回答
9

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

您可以在读取器和写入器之间共享 ByteBuffer。

例如

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

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

于 2011-12-08T19:47:15.453 回答
8

您可以使用 PipedInputStream 和 PipedOutputStream

像这样:

PipedOutputStream outstr = new PipedOutputStream();
PipedInputStream instr = new PipedInputStream(outstr);

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

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

于 2011-12-08T19:53:30.510 回答
3

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

于 2011-12-08T19:46:55.833 回答