Stream Wiederverwendung in C #

8

Ich habe mit einer Idee gespielt, die ich für eine einfache Idee hielt. Ich möchte in der Lage sein, eine Datei von irgendwo (Website, Dateisystem, ftp) einzulesen, einige Operationen darauf durchzuführen (komprimieren, verschlüsseln, etc.) und dann irgendwo speichern (irgendwo kann ein Dateisystem, ftp oder was auch immer sein) . Es ist ein einfaches Pipeline-Design. Ich würde gerne die Datei einlesen und auf einen MemoryStream schreiben, dann die Operationen für die Daten im MemoryStream ausführen und diese Daten dann irgendwo im MemoryStream speichern. Ich dachte, ich könnte den gleichen Stream dazu verwenden, aber ich habe ein paar Probleme:

  1. Jedes Mal, wenn ich einen StreamWriter oder StreamReader verwende, muss ich ihn schließen und der Stream wird geschlossen, so dass ich ihn nicht mehr verwenden kann. Das scheint so zu sein, als müsste es einen Weg geben, das zu umgehen.
  2. Einige dieser Dateien sind möglicherweise groß und daher kann der Speicher knapp werden, wenn ich versuche, die ganze Sache sofort zu lesen.

Ich hatte gehofft, dass ich jeden der Schritte als separate Threads ausführen kann und den Komprimierungsschritt starten kann, sobald Daten im Stream vorhanden sind, und sobald die Komprimierung einige komprimierte Daten im Stream verfügbar hat Ich könnte damit anfangen, es zu speichern (zum Beispiel). Ist so etwas mit den C # Streams problemlos möglich? Haben Sie Gedanken, wie Sie das am besten erreichen können?

Danke,

Mike

    
MikeD 10.06.2009, 03:54
quelle

3 Antworten

4

Verwenden einer Hilfsmethode zum Steuern des Streams:

%Vor%

Sie können einfach kombinieren, was Sie brauchen:

%Vor%

Je nachdem, was Sie eigentlich tun möchten, würden Sie die Streams anders verketten. Dies verwendet auch relativ wenig Speicher, da nur die Daten im Speicher sind.

    
jerryjvl 10.06.2009, 04:04
quelle
1

StreamReader / StreamWriter sollte nicht entworfen worden sein, um den zugrunde liegenden Stream zu schließen - das ist ein schreckliches Fehlverhalten in der BCL. Aber sie tun, sie werden nicht geändert werden (wegen der Abwärtskompatibilität), also sind wir mit dieser Katastrophe einer API fest.

Aber es gibt einige gut etablierte Problemumgehungen, wenn Sie StreamReader / Writer verwenden möchten, aber den Stream danach geöffnet lassen.

  • Für einen StreamReader: Entsorgen Sie den StreamReader nicht. So einfach ist das. Es ist harmlos, einen StreamReader einfach gehen zu lassen, ohne Dispose zu rufen. Der einzige Effekt ist, dass Ihr Stream nicht vorzeitig geschlossen wird, was eigentlich ein Plus ist.
  • Für einen StreamWriter: Es sind möglicherweise gepufferte Daten vorhanden, so dass Sie nicht damit davonkommen können, es einfach loszulassen. Sie müssen Flush aufrufen, um sicherzustellen, dass gepufferte Daten in den Stream geschrieben werden. Dann können Sie den StreamWriter einfach loslassen. (Im Grunde genommen hast du einen Flush, wo du normalerweise einen Dispose gelegt hättest.)
Joe White 10.06.2009 04:07
quelle
0

Es sei denn, Sie lesen Streams, die größer sind als Ihre Festplatte, ich glaube nicht, dass Ihnen der Speicher ausgehen wird.

Ссылка

    
jasonh 10.06.2009 04:25
quelle

Tags und Links