Strumienie są dla mnie trochę tajemnicze. Nie wiem, kiedy użyć którego strumienia i jak z niego korzystać. Czy ktoś może mi wyjaśnić, jak używane są strumienie?
Jeśli dobrze rozumiem, istnieją trzy typy strumieni:
stream
read stream
write stream
Czy to jest poprawne? Na przykład, jaka jest różnica między a Memorystream
i a FileStream
?
Stream
), które ujawnia przydatne metody, takie jak czytanie, pisanie i zmiana pozycji. Teraz możesz tworzyć klasy na podstawie ich magazynu zapasowego (FileStream, MemoryStream), które dziedzicząStream
i budują na podstawie tej funkcji w oparciu o określony magazyn zapasowy.Odpowiedzi:
Strumień Przedmiotem wykorzystywane do przesyłania danych. Istnieje ogólna klasa strumienia
System.IO.Stream
, z której pochodzą wszystkie inne klasy strumieni w .NET. PlikStream
Klasa zajmuje bajtów.Konkretne klasy strumienia są używane do obsługi innych typów danych niż bajty. Na przykład:
FileStream
Klasa jest używana, gdy źródło zewnątrz jest plikiemMemoryStream
służy do przechowywania danych w pamięciSystem.Net.Sockets.NetworkStream
obsługuje dane siecioweStrumienie czytające / zapisujące, takie jak
StreamReader
iStreamWriter
nie są strumieniami - nie są one pochodnymiSystem.IO.Stream
, zostały zaprojektowane, aby pomóc w zapisywaniu i odczytywaniu danych zi do przesyłania strumieniowego!źródło
Aby rozwinąć trochę inne odpowiedzi tutaj i pomóc wyjaśnić wiele przykładowego kodu, który zobaczysz z kropkami, przez większość czasu nie czytasz i nie piszesz bezpośrednio w strumieniu. Strumienie to niskopoziomowe środki do przesyłania danych.
Zauważysz, że funkcje do odczytu i zapisu są zorientowane na bajty, np. WriteByte (). Nie ma funkcji zajmujących się liczbami całkowitymi, łańcuchami itp. To sprawia, że strumień jest bardzo uniwersalny, ale trudniejszy w obsłudze, jeśli, powiedzmy, chcesz po prostu przesłać tekst.
Jednak platforma .NET udostępnia klasy, które konwertują między typami natywnymi a interfejsem strumienia niskiego poziomu oraz przesyłają dane do lub ze strumienia za Ciebie. Niektóre godne uwagi takie klasy to:
Aby z nich skorzystać, najpierw zdobądź swój strumień, a następnie utwórz jedną z powyższych klas i skojarz ją ze strumieniem. Na przykład
StreamReader i StreamWriter konwertują między typami natywnymi i ich reprezentacjami ciągów, a następnie przesyłają ciągi do i ze strumienia jako bajty. Więc
zapisze do strumienia „123” (trzy znaki „1”, „2”, a następnie „3”). Jeśli masz do czynienia z plikami tekstowymi (np. Html), StreamReader i StreamWriter to klasy, których użyjesz.
Natomiast
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, możesz użyć BinaryReader i BinaryWriter. (Jeśli wymieniasz dane z sieciami lub innymi systemami, musisz uważać na endianness , ale to kolejny post.)
źródło
Strumienie są dobre do obsługi dużych ilości danych. Jeśli załadowanie wszystkich danych do pamięci w tym samym czasie jest niepraktyczne, możesz otworzyć je jako strumień i pracować z małymi fragmentami.
źródło
Strumień to tylko abstrakcja (lub opakowanie) na
physical
strumieniu bajtów. Tenphysical
strumień nazywa siębase stream
. Więc nie zawsze jest strumień bazowy, nad którym owinięcie strumień jest tworzony, a zatem owinięcie jest nazwany rodzaju strumienia bazowego tjFileStream
,MemoryStream
etc.Zaletą opakowania strumienia jest to, że otrzymujesz ujednolicony interfejs API do interakcji ze strumieniami dowolnego bazowego typu
usb, file
itp.Dlaczego miałbyś traktować dane jako strumień - ponieważ fragmenty danych są ładowane na żądanie, możemy sprawdzać / przetwarzać dane jako fragmenty, zamiast ładować całe dane do pamięci. W ten sposób większość programów radzi sobie z dużymi plikami, np. Z szyfrowaniem pliku obrazu systemu operacyjnego.
źródło
Jest tylko jeden podstawowy typ
Stream
. Jednak w różnych okolicznościach niektórzy członkowie będą zgłaszać wyjątek po wywołaniu, 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 fragmentu pamięci. Dlatego możesz na nim wywołać odczyt i zapis.Z drugiej strony a
FileStream
pozwala na odczyt lub zapis (lub oba) z / do pliku. To, czy możesz rzeczywiście czytać, czy zapisywać, zależy od tego, jak plik został otwarty. Nie możesz zapisywać do pliku, jeśli otworzyłeś go tylko do odczytu.źródło
Zacząłbym od czytania strumieni w MSDN: http://msdn.microsoft.com/en-us/library/system.io.stream.aspx
Memorystream i FileStream to strumienie używane odpowiednio do pracy z pamięcią surową i plikami ...
źródło
Nie nazwałbym tych różnych rodzajów strumieni. Klasa Stream ma właściwości CanRead i CanWrite, które informują, czy określony strumień może być odczytywany i zapisywany.
Główną różnicą między różnymi klasami strumieni (takimi jak MemoryStream vs FileStream) jest magazyn zapasowy - skąd dane są odczytywane lub gdzie są zapisywane. To dość oczywiste z nazwy. MemoryStream przechowuje dane tylko w pamięci, FileStream jest wspierany przez plik na dysku, NetworkStream odczytuje dane z sieci i tak dalej.
źródło