C # using streams

Strumienie są dla mnie trochę tajemnicze. Nie wiem kiedy i jak używać tego strumienia. Czy ktoś może mi wyjaśnić, w jaki sposób wykorzystuje się strumienie?

Jeśli dobrze rozumiem, są trzy rodzaje strumieni:

  • stream
  • read stream
  • write stream
Czy to prawda? Na przykład, jaka jest różnica między Memorystream a FileStream?
 91
Author: LightCC, 2009-09-10

7 answers

A stream jest obiektem służącym do przesyłania danych. Istnieje ogólna Klasa strumienia System.IO.Stream, z którego pochodzą wszystkie inne klasy strumienia w. NET. Klasa Stream zajmuje się bajtami.

Konkretne klasy strumienia są używane do radzenia sobie z innymi typami danych niż bajty. Na przykład:

  • klasa FileStream jest używana, gdy zewnętrznym źródłem jest plik
  • MemoryStream służy do przechowywania danych w pamięci
  • System.Net.Sockets.NetworkStream obsługuje sieć dane

Strumienie Reader/writer takie jak StreamReader i StreamWriter nie są strumieniami - nie pochodzą z System.IO.Stream, są zaprojektowane tak, aby pomóc w zapisywaniu i odczytywaniu danych z I do strumienia!

 54
Author: Arsen Mkrtchyan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-24 04:36:05

Aby rozwinąć trochę inne odpowiedzi tutaj i pomóc wyjaśnić wiele przykładowego kodu, który zobaczysz kropkowany o, większość czasu nie czytać i pisać bezpośrednio do strumienia. Strumienie są niskopoziomowym środkiem do przesyłania danych.

Zauważysz, że funkcje do odczytu i zapisu są zorientowane na bajty, np. WriteByte (). Nie ma funkcji do radzenia sobie z liczbami całkowitymi, łańcuchami itp. To sprawia, że strumień jest bardzo uniwersalny, ale mniej prosty w obsłudze, jeśli, powiedzmy, chcesz po prostu aby przesłać tekst.

Jednak. Net zapewnia klasy, które konwertują między natywnymi typami i niskopoziomowym interfejsem strumienia i przesyłają dane do lub ze strumienia za Ciebie. Niektóre godne uwagi takie klasy to:

StreamWriter // Badly named. Should be TextWriter.
StreamReader // Badly named. Should be TextReader.
BinaryWriter
BinaryReader

Aby ich użyć, najpierw zdobywasz swój strumień, a następnie tworzysz jedną z powyższych klas i kojarzysz ją ze strumieniem. Np.

MemoryStream memoryStream = new MemoryStream();
StreamWriter myStreamWriter = new StreamWriter(memoryStream);

StreamReader i StreamWriter konwertują między natywnymi typami i ich reprezentacjami ciągów, a następnie przenoszą ciągi do i ze strumienia jako bajty. Więc

myStreamWriter.Write(123);

Napisze " 123 " (trzy znaki '1', '2' i '3') do strumienia. Jeśli masz do czynienia z plikami tekstowymi (np. html), StreamReader i StreamWriter to Klasy, których byś użył.

]}

myBinaryWriter.Write(123);

Zapisze cztery bajty reprezentujące 32-bitową wartość całkowitą 123 (0x7B, 0x00, 0x00, 0x00). Jeśli masz do czynienia z plikami binarnymi lub protokołami sieciowymi BinaryReader i BinaryWriter są tym, czego możesz użyć. (Jeśli wymieniasz dane z sieci lub innych systemów, trzeba pamiętać o endianness, ale to kolejny post.)

 42
Author: Tim Williams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:01

Strumienie są dobre do radzenia sobie z dużą ilością danych. Gdy niepraktyczne jest jednoczesne ładowanie wszystkich danych do pamięci, możesz otworzyć je jako strumień i pracować z małymi fragmentami.

 16
Author: meatvest,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-10 09:47:54

Zacznę od czytania streamów na MSDN: http://msdn.microsoft.com/en-us/library/system.io.stream.aspx

Memorystream i FileStream to strumienie używane odpowiednio do pracy z surową pamięcią i plikami...

 3
Author: Robban,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-10 09:44:06

Istnieje tylko jeden podstawowy typ Stream. Jednak w różnych okolicznościach niektórzy członkowie będą rzucać wyjątek, gdy zostaną wywołani, ponieważ w tym kontekście operacja nie była dostępna.

Na przykład a MemoryStream jest po prostu sposobem na przenoszenie bajtów do i z kawałka pamięci. Stąd możesz wywołać Odczyt i zapis na nim.

Z drugiej strony a FileStream pozwala na odczyt lub zapis (lub oba) z / do pliku. To czy potrafisz czytać czy pisać zależy od tego jak plik został otwarty. Nie można zapisywać do pliku, jeśli został on otwarty tylko dla dostępu do odczytu.

 3
Author: AnthonyWJones,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-10 09:45:42

Stream jest tylko abstrakcją (lub opakowaniem) nad physical strumieniem bajtów. Ten strumień physical nazywa się base stream. Tak więc zawsze istnieje strumień bazowy, nad którym tworzony jest stream wrapper, a tym samym wrapper jest nazwany od podstawowego strumienia typu ie FileStream, MemoryStream itd.

Zaletą wrappera strumienia jest to, że otrzymujesz zunifikowane api do interakcji ze strumieniami dowolnego podstawowego typu usb, file itp.

dlaczego traktujesz dane jako strumień - ponieważ kawałki danych są ładowane na żądanie, możemy sprawdzać/przetwarzać dane jako kawałki, a nie ładować całe dane do pamięci. W ten sposób większość programów zajmuje się dużymi plikami, np. szyfrowaniem pliku obrazu systemu operacyjnego.

 2
Author: Anwar Husain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-20 11:25:34

Nie nazwałbym tych różnych strumieni. Klasa Stream posiada właściwości CanRead i CanWrite, które informują, czy dany strumień może być odczytywany i zapisywany do.

Główną różnicą pomiędzy różnymi klasami strumienia (np. MemoryStream vs FileStream) jest magazyn kopii zapasowych - gdzie dane są odczytywane lub gdzie są zapisywane. To oczywiste z nazwy. MemoryStream przechowuje dane tylko w pamięci, FileStream jest wspierany przez plik na dysku, a NetworkStream odczytuje dane z sieci i tak dalej.

 1
Author: Mattias S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-10 09:46:00