77 votes

Flux de mémoire en Java

Je suis à la recherche d'un flux de mémoire de mise en œuvre en Java. La mise en œuvre doit être à peu près suivant le modèle .NET flux de mémoire (*) la mise en œuvre.

Fondamentalement, je voudrais avoir une classe MemoryStream qui a de l'usine méthodes:

 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 MemoryStreamje doit être capable de simultanément en même temps, créer d'entrée et de sortie des flux, ce qui devrait également permettre d' positionnement dans n'importe quelle direction. Le flux de mémoire nécessaire ne pas être circulaire, il doit travailler pour les petites tailles bien et augmente automatiquement. Le flux de mémoire a besoin seulement être confiné dans un seul processus.

Toute sortie de la boîte de code?

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

117voto

Jesper Points 65733

ByteArrayInputStream et ByteArrayOutputStream est 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 s'agrandira automatiquement à mesure que vous écrivez des données dans le flux.

Consultez la documentation de l' API pour plus d'informations (celles-ci se trouvent dans le package java.io ).

9voto

Peter Lawrey Points 229686

At-il besoin de prendre en charge les flux d’entrée et de sortie? Sinon, je voudrais simplement 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 (ex. Échangeur) et les processus (à l'aide de fichiers mappés en mémoire).

8voto

Angelo Neuschitzer Points 6166

Vous pouvez utiliser PipedInputStream et PipedOutputStream

comme ça:

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

cela ne vous autorisera pas directement à chercher, mais vous permettra de sauter autant d'octets que vous voulez du flux 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 un BufferedInputStream, alors vous n'avez pas à vous embêter. .

3voto

Amir Afghani Points 17519

NIO vous permet de transférer directement des données dans la mémoire du noyau - je ne sais pas si cela chevauche exactement le flux de mémoire de .NET. Voici un exemple simple de mappage d’un fichier entier en mémoire pour la lecture.

1voto

BVSmallman Points 531

De base de Java n'ont pas les mêmes fonctionnalités de Flux de Mémoire dans .Net vous probabaly à la recherche pour. Il y a cependant un tiers-parti créé Java mise en œuvre de l' .Net Flux de Mémoire de la fonctionnalité. Voir le lien.

http://www.mikepaul.ca/index.php?option=com_content&view=article&id=3:net-style-memorystream-for-javaj2me&catid=4:mobile-dev&Itemid=4

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X