Java中的内存流


69

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

有没有可用的现成代码?

Answers:


108

ByteArrayInputStream而且ByteArrayOutputStream是你在找什么。

这些是接口的实现InputStreamOutputStream从该读取和写入到存储器中的字节数组。对于ByteArrayOutputStream,当您将数据写入流时,数组将自动增长。


ByteArrayInputStream支持mark()reset()标记信息流中的位置,以便您以后可以跳回该位置。ByteArrayOutputStream没有这个。彼得·劳瑞(Peter Lawrey)使用NIO的建议ByteBuffer可能更有用。
杰斯珀,

这允许在任何方向上定位吗?
Mostowski崩溃

这些字节缓冲区,我还不确定。问题是对非功能性需求的普遍理解:频率,数据量和访问类型。依靠它们可能是个好主意。
Mostowski崩溃

3
因此,最终的解决方案(无随机定位)ByteArrayOutputStream inMemoryStream = new ByteArrayOutputStream(); /* write into stream */; ByteArrayInputStream inputStream = new ByteArrayInputStream(inMemoryStream.toByteArray()); /* read from the inputStream */
Lu55

9

您可以使用PipedInputStream和PipedOutputStream

像这样:

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

那不会直接允许您搜索,但确实允许您从输入流中跳过任意多个字节。

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


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)和进程之间共享内存(使用内存映射文件)


如何用于小尺寸?它会自动增长吗?
Mostowski崩溃

它不会自动增长。但是,如果您将直接缓冲区设置为比您需要的大得多,但是您不使用它,则操作系统不会为您的进程分配内存。
彼得·劳瑞

啊哈,好吧,我不知道。是否可以跨OS和JVM保证?
Mostowski崩溃

是的,输入/输出是强制性的。这样我就可以插入现有的应用程序。
Mostowski崩溃

是的,应用程序实际上是通过RandomAccessFile而不是通过输入/输出流来进行随机访问的。但是从RandomAccessFile产生了输入/输出流。但是,为了使事情变得不太复杂,我发布了上述接口规范。
Mostowski崩溃

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.