Czy możesz wyjaśnić pojęcie strumieni?

Rozumiem, że strumień jest reprezentacją sekwencji bajtów. Każdy strumień zapewnia środki do odczytu i zapisu bajtów do danego magazynu kopii zapasowej. Ale jaki jest sens strumienia? Dlaczego sam sklep nie jest tym, z czym współpracujemy?

Z jakiegokolwiek powodu ta koncepcja po prostu nie jest dla mnie. Czytałem kilka artykułów, ale chyba potrzebuję analogii.

Author: Hosam Aly, 2009-02-03

15 answers

Słowo "strumień" zostało wybrane, ponieważ reprezentuje (w prawdziwym życiu) bardzo podobne znaczenie do tego, co chcemy przekazać, gdy go używamy.

Zapomnijmy na chwilę o zapleczu i zastanówmy się nad analogią do strumienia wody. Otrzymujesz ciągły przepływ danych, tak jak woda stale przepływa w rzece. Nie musisz koniecznie wiedzieć, skąd pochodzą dane, a najczęściej nie musisz; czy to z pliku, gniazda, czy innego źródła, to nie ma (nie powinno) znaczenia. Jest to bardzo podobne do otrzymywania strumienia wody, dzięki czemu nie trzeba wiedzieć, skąd pochodzi; czy to z jeziora, fontanny, czy z jakiegokolwiek innego źródła, to nie ma (nie powinno) znaczenia.

To powiedziawszy, gdy zaczniesz myśleć, że zależy Ci tylko na uzyskaniu potrzebnych danych, niezależnie od tego, skąd pochodzą, abstrakcje, o których mówili inni, stają się jaśniejsze. Zaczynasz myśleć, że możesz owijać strumienie, a twoje metody będą nadal działa idealnie. Na przykład możesz to zrobić:

int ReadInt(StreamReader reader) { return Int32.Parse(reader.ReadLine()); }

// in another method:
Stream fileStream = new FileStream("My Data.dat");
Stream zipStream = new ZipDecompressorStream(fileStream);
Stream decryptedStream = new DecryptionStream(zipStream);
StreamReader reader = new StreamReader(decryptedStream);

int x = ReadInt(reader);

Jak widzisz, bardzo łatwo jest zmienić źródło wejściowe bez zmiany logiki przetwarzania. Na przykład, aby odczytać dane z gniazda sieciowego zamiast pliku:

Stream stream = new NetworkStream(mySocket);
StreamReader reader = new StreamReader(stream);
int x = ReadInt(reader);
Tak łatwo, jak to tylko możliwe. I piękno nadal, jak można użyć dowolnego źródła wejściowego, tak długo, jak można zbudować strumień "wrapper" dla niego. Można nawet to zrobić:
public class RandomNumbersStreamReader : StreamReader {
    private Random random = new Random();

    public String ReadLine() { return random.Next().ToString(); }
}

// and to call it:
int x = ReadInt(new RandomNumbersStreamReader());
Widzisz? Tak długo, jak twoja metoda nie dba o to, co źródło wejściowe to, możesz dostosować swoje źródło na różne sposoby. Abstrakcja pozwala na oddzielenie wejścia od logiki przetwarzania w bardzo elegancki sposób.

Zauważ, że strumień, który sami stworzyliśmy, nie ma zaplecza, ale nadal doskonale służy naszym celom.

Podsumowując, strumień jest tylko źródłem danych wejściowych, ukrywając (abstrakcyjnie) inne źródło. Dopóki nie złamiesz abstrakcji, Twój kod będzie bardzo elastyczny.

 213
Author: Hosam Aly,
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-10-28 13:04:22

Chodzi o to, że nie powinieneś wiedzieć, co to jest sklep zapasowy - To abstrakcja nad nim. Rzeczywiście, może nawet nie być zapasowego magazynu - możesz czytać z sieci, a dane nigdy nie są "przechowywane" w ogóle.

Jeśli możesz napisać kod, który działa, niezależnie od tego, czy mówisz do systemu plików, pamięci, sieci lub czegokolwiek innego, co obsługuje ideę strumienia, Twój kod jest o wiele bardziej elastyczny.

Ponadto strumienie są często połączone łańcuchami-ty moĹĽe mieÄ ‡ strumieniä ™ ktĂłra kompresuje to co wĹ ' Ä ... cza siÄ ™ do niej, zapisujÄ ... c formÄ ™ skompresowanä ... do innego strumienia, lub takiego ktĂłry szyfruje dane, itp. Na drugim końcu byłby odwrotny łańcuch, deszyfrowanie, dekompresja czy cokolwiek.

 35
Author: Jon Skeet,
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-02-03 16:09:32

Celem strumienia jest dostarczenie warstwy abstrakcji między tobą a zapasowym sklepem. Tak więc dany blok kodu, który używa strumienia, nie musi przejmować się tym, czy zapasowym magazynem jest plik na dysku, pamięć itp...

 30
Author: Torlack,
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-02-03 16:08:13

Tu nie chodzi o strumienie - chodzi o pływanie. Jeśli możesz popłynąć jednym strumieniem, możesz popłynąć dowolnym strumieniem, który napotkasz.

 11
Author: dmajkic,
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-02-03 16:13:05

Aby dodać do komory ECHA, strumień jest abstrakcją, więc nie dbasz o podstawowy sklep. Ma to największy sens, gdy rozważasz scenariusze ze strumieniami i bez nich.

Pliki są w większości nieciekawe, ponieważ strumienie nie robią wiele ponad to, co nie-strumieniowe metody, które znam. Zacznijmy od plików internetowych.

Jeśli chcę pobrać plik z Internetu, muszę otworzyć Gniazdo TCP, nawiązać połączenie i otrzymać bajtów, dopóki nie ma więcej bajtów. Muszę zarządzać buforem, znać rozmiar oczekiwanego pliku i napisać kod, aby wykryć, kiedy połączenie zostanie przerwane i odpowiednio to obsłużyć.

Powiedzmy, że mam jakiś obiekt TcpDataStream. Tworzę go z odpowiednimi informacjami o połączeniu, a następnie odczytuję bajty ze strumienia, dopóki nie powie, że nie ma więcej bajtów. Strumień obsługuje zarządzanie buforem, warunki końca danych i zarządzanie połączeniami.

W tym sposób, strumienie ułatwiają We / Wy. Z pewnością mógłbyś napisać klasę TcpFileDownloader, która robi to, co strumień, ale wtedy masz klasę, która jest specyficzna dla TCP. Większość interfejsów stream dostarcza po prostu metody Read () I Write (), a wszelkie bardziej skomplikowane koncepcje są obsługiwane przez wewnętrzną implementację. Z tego powodu możesz użyć tego samego podstawowego kodu do odczytu lub zapisu w pamięci, plikach dyskowych, gniazdach i wielu innych magazynach danych.

 7
Author: OwenP,
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-02-03 16:22:30

To tylko koncepcja, kolejny poziom abstrakcji, który ułatwia życie. Wszystkie mają wspólny interfejs, co oznacza, że można je łączyć w sposób podobny do rury. Na przykład Zakoduj do base64, a następnie zip, a następnie zapisz to na dysk i wszystko w jednej linii!

 4
Author: vava,
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-02-03 16:14:43

Wizualizacja, której używam to przenośniki taśmowe, Nie w prawdziwych fabrykach, bo nic o tym Nie wiem, ale w fabrykach kreskówek, gdzie przedmioty poruszają się wzdłuż linii i są stemplowane, pakowane, liczone i sprawdzane przez sekwencję głupich urządzeń.

Masz proste komponenty, które robią jedną rzecz, na przykład urządzenie do układania wisienki na torcie. To urządzenie ma strumień wejściowy ciastek bez czereśni i strumień wyjściowy ciastek z wiśniami. Warto wspomnieć o trzech zaletach struktura przetwarzania w ten sposób.

Po pierwsze upraszcza same komponenty: jeśli chcesz położyć polewę czekoladową na torcie, nie potrzebujesz skomplikowanego urządzenia, które wie wszystko o ciastach, możesz stworzyć głupie urządzenie, które przykleja polewę czekoladową do tego, co jest do niej podawane (w kreskówkach, to idzie tak daleko, jak nie wiedząc, że następny przedmiot nie jest ciastem, to Wile E. Coyote).

Po drugie można tworzyć różne produkty, umieszczając urządzenia w różne sekwencje: być może chcesz, aby Twoje ciasta miały wisienkę na wierzchu wiśni, a nie wisienkę na wierzchu wisienki, a możesz to zrobić po prostu wymieniając urządzenia na linii.

Po trzecie, urządzenia nie muszą zarządzać zapasami, boksem lub unboxingiem. Najbardziej efektywny sposób agregowania i pakowania rzeczy jest zmienny: może dzisiaj wkładasz swoje ciasta do pudełek po 48 i wysyłasz je ciężarówką, ale jutro chcesz wysłać pudełka po 6 w odpowiedź na niestandardowe zamówienia. Tego rodzaju zmiany można uwzględnić poprzez wymianę lub rekonfigurowanie maszyn na początku i na końcu linii produkcyjnej; maszyna cherry w środku linii nie musi być zmieniana, aby przetworzyć inną liczbę elementów na raz, zawsze działa z jednym elementem na raz i nie musi wiedzieć, jak grupuje się jej wejście lub wyjście.

 4
Author: ,
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-02-03 18:47:28

Najlepsze wyjaśnienie strumieni jakie widziałem to Rozdział 3 SICP . (Być może będziesz musiał przeczytać pierwsze 2 rozdziały, aby to miało sens, ale i tak powinieneś. :-)

W ogóle nie używają steramów dla bajtów, ale raczej liczb całkowitych. Wielkie punkty, które z niego otrzymałem to:

  • Streamy są listami opóźnionymi
  • [[7]} obliczeniowy overhead [ochoczo computing wszystko przed czasem, w niektórych przypadkach] jest skandaliczne
  • możemy używać strumieni do reprezentowania sekwencji które są nieskończenie długie
 3
Author: Ken,
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-02-03 19:03:53

W informatyce strumień jest ciągłym przepływem informacji.

Kiedy myślę o streamingu, myślę o wideo data delivery service . Chociaż streaming nie ogranicza się do wideo. Pliki Tekstowe, audio, zip mogą być również przesyłane strumieniowo. Ponadto strumieniowanie nie ogranicza się do plików. Można również przesyłać strumieniowo połączenia HTTP, FTP, SSH oraz wejścia/Wyjścia.

Aby zrozumieć pojęcie streamingu, można porównać inne pojęcia dystrybucji danych.

Klasyczne pobieranie plików nie dzieje się to w czasie rzeczywistym. Przed pobraniem pliku do użycia musisz poczekać, aż pobieranie zostanie zakończone.

Progressive download umożliwia oglądanie pliku wideo podczas jego pobierania. Możliwe jest szybkie przekazywanie i przewijanie. W tym celu wykorzystuje bufor, który przechowuje dane tymczasowe w pamięci komputera odbierającego plik wideo. Mimo że dane są chunked, to nie jest prawdziwy streaming.

Streaming dzieje się w czasie rzeczywistym i kawałki danych. Streaming jest realizowany w transmisjach na żywo. Klienci słuchający transmisji nie mogą szybko przekierowywać ani przewijać. W strumieniach wideo dane są odrzucane po odtworzeniu.

Serwer strumieniowy utrzymuje połączenie dwukierunkowe ze swoim klientem, podczas gdy serwer internetowy zamyka połączenie po odpowiedzi serwera.

Usefull linki:

  1. http://www.slideshare.net/auroraeosrose/writing-and-using-php-streams-and-sockets-zendcon-2011 zapewnia bardzo jasne
 3
Author: Julian,
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-01-24 23:06:30

Kolejny punkt (do odczytu sytuacji pliku):

  1. stream może pozwolić Ci zrobić coś innego przed finished reading all content of the file.
  2. można zapisać pamięć, ponieważ nie trzeba ładować całej zawartości pliku na raz.
 2
Author: vikyd,
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-07-21 13:24:09

Pomyśl o strumieniach jako o abstrakcyjnym źródle danych (bajty, znaki itp.). Przedstawiają one rzeczywistą mechanikę odczytu i zapisu do konkretnego źródła danych, czy to gniazda sieciowego, pliku na dysku czy odpowiedzi z serwera www.

 1
Author: Anton Gogolev,
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-02-03 16:10:34

Myślę, że należy wziąć pod uwagę, że sam sklep jest często po prostu kolejną abstrakcją. Strumień pamięci jest dość łatwy do zrozumienia, ale plik różni się radykalnie w zależności od używanego systemu plików, nieważne, jakiego dysku twardego używasz. Nie wszystkie strumienie w rzeczywistości siedzą na zapleczu sklepu: strumienie sieciowe w zasadzie są strumieniami.

Sens strumienia polega na tym, że ograniczamy naszą uwagę do tego, co ważne. Przez posiadanie standardowej abstrakcji, możemy wykonywać zwykłe operacje. Nawet jeśli nie chcesz, na przykład, przeszukiwać pliku lub odpowiedzi HTTP dla adresów URL dzisiaj, nie oznacza to, że nie chcesz jutro.

Strumienie były pierwotnie tworzone, gdy pamięć była mała w porównaniu do pamięci masowej. Samo czytanie pliku C może być znaczącym obciążeniem. Minimalizacja pamięci była niezwykle ważna. Dlatego bardzo przydatna była abstrakcja, w której bardzo mało trzeba było załadować. Dziś jest równie przydatny przy wykonywaniu sieci komunikacji i, jak się okazuje, rzadko tak restrykcyjne, gdy mamy do czynienia z plikami. Możliwość przezroczystego dodawania rzeczy, takich jak buforowanie w ogólny sposób, czyni go jeszcze bardziej użytecznym.

 1
Author: Julian Birch,
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-02-03 16:18:53

Strumień jest abstrakcją sekwencji bajtów. Chodzi o to, że nie musisz wiedzieć, skąd pochodzą bajty, tylko, że możesz je odczytać w znormalizowany sposób.

Na przykład, jeśli przetwarzasz dane za pomocą strumienia, to nie ma znaczenia dla Twojego kodu, czy dane pochodzą z pliku, połączenia sieciowego, łańcucha znaków, Bloba w bazie danych itd itd.

Nie ma nic złego per-se w interakcji z samym sklepem zapasowym, z wyjątkiem faktu, że łączy cię z wdrożenie sklepu wspomagającego.

 0
Author: Sean,
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-02-03 16:09:50

Strumień jest abstrakcją, która zapewnia standardowy zestaw metod i właściwości do interakcji z danymi. Oddzielając się od rzeczywistego nośnika pamięci, Twój kod może zostać napisany bez całkowitego polegania na tym, czym jest ten nośnik, ani nawet na jego implementacji.

Dobrą analogią może być rozważenie torby. Nie obchodzi cię, z czego wykonana jest torba, ani co robi, gdy wkładasz do niej swoje rzeczy, o ile torba spełnia zadanie bycia torbą i możesz dostać swoje rzeczy cofnij się. Strumień definiuje dla nośników do przechowywania, co pojęcie torby definiuje dla różnych instancji torby (takich jak worek na śmieci, torebka, plecak, itp.)- zasady interakcji.

 0
Author: Jeff Yates,
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-02-03 16:12:41

Będę się streszczał, brakowało mi tylko słowa Tutaj:

strumienie są kolejkami Zwykle przechowywanymi w buforze zawierającym dowolne dane.

(teraz, ponieważ wszyscy wiemy, co to są kolejki, nie ma potrzeby wyjaśniać tego dalej.)

 0
Author: Marcus,
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
2013-02-13 22:59:26