Flux de mémoire en Java

Je recherche une implémentation de stream de mémoire en Java. L’implémentation doit être grossièrement modélisée après l’implémentation du stream de mémoire .NET (*).

En gros, je voudrais avoir une classe MemoryStream qui a pour méthodes d’usine:

  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); } 

Donc, une fois que j’ai une instance de la classe MemoryStream je devrais pouvoir créer simultanément simultanément des stream d’entrée et de sortie, ce qui devrait également permettre un positionnement dans n’importe quelle direction. Le stream de mémoire ne doit pas nécessairement être circulaire, il doit fonctionner correctement pour les petites tailles et croître automatiquement. Le stream de mémoire doit seulement être confiné dans un processus.

Tout code de la boîte disponible?

(*) Flux de mémoire .NET
http://msdn.microsoft.com/en-us/library/system.io.memorystream.aspx

    ByteArrayInputStream et ByteArrayOutputStream sont ce que vous recherchez.

    Ce sont des implémentations des interfaces InputStream et OutputStream qui lisent et écrivent dans un tableau d’octets en mémoire. Pour ByteArrayOutputStream , le tableau croît automatiquement lorsque vous écrivez des données dans le stream.

    Vous pouvez utiliser PipedInputStream et PipedOutputStream

    comme ça:

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

    cela ne vous permettra pas de rechercher directement, mais cela vous permet d’ignorer autant d’octets que vous voulez du stream d’entrée.

    Sachez que chaque fois que vous écrivez dans outstr, il est bloqué jusqu’à ce que tout soit lu dans instr (c’est-à-dire: si je me souviens bien, les Streams ne tamponnent pas, mais vous pouvez les décorer avec .

    A-t-il besoin de prendre en charge les stream d’entrée et de sortie? Sinon, je voudrais juste utiliser un ByteBuffer qui vous permet de lire / écrire des types primitifs à des emplacements aléatoires. (Jusqu’à 2 Go)

    Vous pouvez partager un ByteBuffer entre un lecteur et un écrivain.

    par exemple

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

    Vous pouvez partager la mémoire entre les threads (par exemple, Exchanger) et les processus (en utilisant des fichiers mappés en mémoire)

    NIO vous permet de transférer directement des données au sein de la mémoire du kernel. Je ne suis pas sûr que cela corresponde exactement au stream de mémoire de .NET. Voici un exemple simple de mappage d’un fichier entier en mémoire pour la lecture.