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

すぐに使用できるコードはありますか?

4

4 に答える 4

115

ByteArrayInputStreamそしてByteArrayOutputStreamあなたが探しているものです。

これらはインターフェイスの実装でありInputStreamOutputStreamメモリ内のバイト配列から読み書きします。の場合ByteArrayOutputStream、ストリームにデータを書き込むと配列が自動的に拡張されます。

于 2011-12-08T22:06:15.670 に答える
9

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

リーダーとライターの間で 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 から読み取られるまでブロックされることに注意してください (つまり、私の記憶が正しければ、ストリームはバッファリングされませんが、BufferedInputStream でそれらをデコレートできる場合は、気にする必要はありません)。 .

于 2011-12-08T19:53:30.510 に答える
3

NIOを使用すると、カーネル メモリ内でデータを直接転送できます。これが .NET のメモリ ストリームと正確に重複するかどうかはわかりません。 ファイル全体を読み取り用にメモリにマッピングする簡単な例を次に示します

于 2011-12-08T19:46:55.833 に答える