8
votes

Comment est-ce que je "fourchette" un flux dans .NET?

comme Discuté avant , lorsqu'un binaryReader ou un binarywriter est fermé, son flux sous-jacent se fermait également (Aargh). Considérez cette situation: une routine r code> est passée à une mémoire MemorMODream, disons m code>; Je voudrais écrire des choses à M code>, puis transmettez-la à une autre routine pour plus de traitement (pas nécessairement d'écrire). Pour la commodité, j'aimerais envelopper M code> dans un binarywriter pour faire mon écriture. Après écrit, j'ai fini avec le binarywriter mais pas avec m code>.

void R(MemoryStream M)
{
    using (B = new BinaryWriter(M))
    {
        // write some stuff using B
    }

    S(M);  // now pass M to another routine for further processing
}


2 commentaires

Je ne sais pas C #, mais à Java, vous venez d'abandonner simplement sans fermer le binarywriter. L'utilisation de {...} ne ferme pas la fermeture de la force? Ensuite, n'utilisez pas cette construction!


P.s. Mais vous devez vous assurer de vous assurer de chasser le binarywriter avant de l'abandonner.


7 Réponses :


0
votes

Une approche quelque peu naïve consiste à utiliser xxx pré>

pour copier le contenu du flux sur un tableau d'octets. Vous pouvez le retourner dans un flux avec P>

MemoryStream ms = new MemoryStream(buf);


1 commentaires

Mise à la peine d'être soulignée: cette méthode fonctionne sur un flux fermé ainsi que sur une.



2
votes

Vous pouvez:

  • appelez m.toTarray () pour obtenir le flux comme une gamme d'octets.
  • Sous-classe BinaryWriter et remplacer la méthode d'élimination pour empêcher la fermeture du flux enfant

1 commentaires

Vous ne pouvez pas simplement éviter d'appeler fermer / éliminer?



0
votes

Accorde à Ce m.clone (); devrait marcher. Mais je me trompe peut-être ...


1 commentaires

-1 pour la publication sur un site Web qui ne permet pas de visionner son contenu gratuitement, qui est à peu près inutile



7
votes

Vous devriez mieux obtenir le tampon d'octet sous-jacent [] à l'aide de xxx

, puis copiez les données d'octets à l'aide de la méthode Array.copy (). Vous êtes libre de créer un nouveau flux avec elle.


3 commentaires

Je ne comprends pas pourquoi vous dites qu'il est préférable d'utiliser GetBuffer, puis de faire une copie à l'aide de Tary.copy. Si je voulais une copie, je n'utiliserais que de Toarray.


De MSDN DOC, cette méthode omet des octets inutilisés dans MemorMemstream de la matrice. Pour obtenir le tampon entier, utilisez la méthode GetBuffer. msdn.microsoft.com/en-us/Library/ ...


La "Cette méthode" ci-dessus fait référence à la mémoire MemorMem.Tearray ()



2
votes

Grâce à plusieurs personnes qui ont suggéré de cochary, on m'a conduit à une bonne réponse, ce qui est «m.getbuffer». Toarray n'est pas trop mauvais, mais il

  • fait une copie
  • ne fait qu'une partie du tampon

    GetBuffer prend juste une référence à l'octet sous-jacent [], qui est ce que je suis après.


0 commentaires

5
votes

Vous pouvez utiliser des choses comme le Miscuil.io.nonclosingStreamwrapper code> dans MISCUTIL , qui enveloppe un flux code> Ignore simplement Fermer code> / Dispose code> Demandes. Pour juste cet objectif.

void R(MemoryStream M)
{
    using (B = new BinaryWriter(new NonClosingStreamWrapper(M)))
    {
        // write some stuff using B
    }

    S(M);  // now pass M to another routine for further processing
}    


0 commentaires

1
votes

Juste pour l'ajouter ici, une solution très simple serait non forte> à disposer () l'écrivain.

void R(MemoryStream M)
{
    B = new BinaryWriter(M);

    // write some stuff using B        
    B.Flush();
    S(M);  // now pass M to another routine for further processing
}


2 commentaires

Mais assurez-vous d'appeler b.flush () après avoir terminé avec cela au cas où il n'a pas tout poussé à M. (c'est ce qui serait nécessaire à Java, aucune idée de C #)


Ok, Adrian & Marc, j'ai oublié de chasser ().