web-dev-qa-db-ja.com

メモリストリームJava

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からインスタンスを取得したら、入力ストリームと出力ストリームを同時に同時に作成できるようになります。これにより、任意の方向に配置できるようになります。メモリストリームは循環である必要はありません。小さなサイズでもうまく機能し、自動的に成長します。メモリストリームは1つのプロセスに限定する必要があります。

すぐに使用可能なコードはありますか?

63

ByteArrayInputStream および ByteArrayOutputStream は探しているものです。

これらは、メモリ内のバイト配列を読み書きするインターフェースInputStreamおよびOutputStreamの実装です。 ByteArrayOutputStreamの場合、ストリームにデータを書き込むと配列が自動的に大きくなります。

94
Jesper

PipedInputStreamとPipedOutputStreamを使用できます

このような:

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

直接シークすることはできませんが、入力ストリームから必要なバイト数をスキップできます。

Outstrに書き込むたびに、instrからすべてが読み取られるまでブロックされることに注意してください(つまり、Streamsがバッファリングしないことを正しく覚えていれば、BufferedInputStreamでデコレートできるので、気にする必要はありません) 。

9
Angelo Fuchs

入力および出力ストリームをサポートする必要がありますか?そうでない場合は、ランダムな場所でプリミティブ型を読み書きできるByteBufferを使用します。 (最大2 GB)

リーダーとライター間でByteBufferを共有できます。

例えば.

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

スレッド(Exchangerなど)とプロセス(メモリマップファイルを使用)の間でメモリを共有できます。

8
Peter Lawrey

[〜#〜] nio [〜#〜] を使用すると、カーネルメモリ内でデータを直接転送できます。NETのメモリストリームと正確に重複するかどうかはわかりません。 Here's ファイル全体を読み取り用にメモリにマッピングする簡単な例。

4
Amir Afghani