Co to jest strumień?

Czym jest strumień w świecie programowania? Po co nam to?

Uprzejmie wyjaśnij za pomocą analogii, jeśli to możliwe.

Author: nbro, 2009-08-01

5 answers

Strumień reprezentuje sekwencję obiektów (Zwykle bajtów, ale niekoniecznie), do których można uzyskać dostęp w kolejności sekwencyjnej. Typowe operacje na strumieniu:

  • odczytaj jeden bajt. Następnym razem, gdy przeczytasz, otrzymasz następny bajt i tak dalej.
  • odczyt kilku bajtów ze strumienia do tablicy
  • seek (przesuń swoją bieżącą pozycję w strumieniu, tak aby następnym razem, gdy czytasz, dostajesz bajty z nowej pozycji)
  • zapis jednego bajtu
  • zapis kilku bajtów z tablica do strumienia
  • pomiń bajty ze strumienia (to jest jak odczyt, ale ignorujesz dane. Lub jeśli wolisz to jak szukać, ale może iść tylko do przodu.)
  • wepchnij bajty do strumienia wejściowego (to jest jak "cofnij" do odczytu - wepchnij kilka bajtów do strumienia, aby następnym razem przeczytać to, co zobaczysz. Czasami jest to przydatne dla parserów, jak to jest:
  • peek (spójrz na bajty bez ich odczytywania, aby nadal były w strumieniu do odczytu później)

Dany strumień może obsługiwać odczyt( w tym przypadku jest to "strumień wejściowy"), zapis ("strumień wyjściowy") lub oba. Nie wszystkie strumienie są poszukiwane.

Push back jest dość rzadki, ale zawsze możesz dodać go do strumienia, owijając rzeczywisty strumień wejściowy w inny strumień wejściowy, który zawiera wewnętrzny bufor. Odczyty pochodzą z bufora, a jeśli odepchniesz, dane zostaną umieszczone w buforze. Jeśli w buforze nic nie ma to strumień push back odczytuje z prawdziwy strumień. Jest to prosty przykład "adaptera strumienia": znajduje się on na "końcu" strumienia wejściowego, jest to sam strumień wejściowy i robi coś więcej, czego oryginalny strumień nie zrobił.

Stream jest użyteczną abstrakcją, ponieważ może opisywać pliki (które są naprawdę tablicami, stąd wyszukiwanie jest proste), ale także wejścia/wyjścia terminala( które nie można wyszukiwać, jeśli nie jest buforowane), gniazda, porty szeregowe itp. Więc możesz napisać kod, który mówi albo "chcę trochę danych, i nie obchodzi mnie to skąd pochodzi i jak się tu dostał", lub "wyprodukuję pewne dane i to całkowicie zależy od mojego rozmówcy, co się z nimi stanie". Pierwszy pobiera parametr strumienia wejściowego, drugi pobiera parametr strumienia wyjściowego.

Najlepsza analogia, jaką mogę sobie wyobrazić, to to, że strumień jest przenośnikiem taśmowym zbliżającym się do ciebie lub od Ciebie odchodzącym (lub czasami obu). Bierzesz rzeczy ze strumienia wejściowego, wkładasz rzeczy do strumienia wyjściowego. Niektóre przenośniki można uznać za wychodzące z dziury w ścianie-są nie można szukać, czytanie lub pisanie to jednorazowa transakcja. Niektóre przenośniki są ułożone przed tobą i możesz poruszać się wzdłuż wybierając miejsce w strumieniu, które chcesz czytać/pisać - to jest szukanie.

Jak mówi IRBMe, najlepiej jest myśleć o strumieniu w kategoriach operacji, które oferuje (które różnią się w zależności od implementacji, ale mają wiele wspólnego), a nie przez fizyczną analogię. Strumienie to "rzeczy, które możesz czytać lub pisać". Kiedy zaczniesz podłączać strumień Adaptery, możesz myśleć o nich jak o pudełku z przenośnikiem w środku i przenośniku Na Zewnątrz, które łączysz z innymi strumieniami, a następnie pudełko wykonuje pewną transformację na danych(zipping go, lub zmiana linefeeds UNIX na DOS, lub cokolwiek innego). Rury są kolejnym dokładnym testem metafory: to tam tworzysz parę strumieni, tak aby wszystko, co napiszesz w jednym, można było odczytać z drugiego. Pomyśl o tunelach czasoprzestrzennych: -)

 114
Author: Steve Jessop,
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-08-01 11:42:26

Strumień jest już metaforą, analogią, więc naprawdę nie ma potrzeby, aby povide inny. Można myśleć o tym zasadniczo jak o rurze z przepływem wody w niej, gdzie woda jest rzeczywiście dane, a rura jest strumieniem. Przypuszczam, że jest to rodzaj rury dwukierunkowej, jeśli strumień jest dwukierunkowy. Jest to w zasadzie wspólna abstrakcja, która jest umieszczana na rzeczach, w których istnieje przepływ lub Sekwencja danych w jednym lub obu kierunkach.

W językach takich jak C#, VB.Net, C++, Java itp., the metafora strumienia jest używana do wielu rzeczy. Istnieją strumienie plików, w których otwierasz plik i możesz odczytywać ze strumienia lub zapisywać do niego; istnieją strumienie sieciowe, w których odczyt i zapis do strumienia odczytuje i zapisuje do podstawowego połączenia sieciowego. Strumienie przeznaczone tylko do zapisu są typowo nazywane strumieniami wyjściowymi, jak w w tym przykładzie, i podobnie strumienie przeznaczone tylko do odczytu są nazywane strumieniami wejściowymi, jak w w tym przykładzie.

Strumień może wykonaj transformację lub kodowanie danych (na przykład SslStream W.Net, pożre dane negocjacji SSL i ukryje je przed tobą; TelnetStream może ukryć negocjacje Telnet przed tobą, ale zapewnia dostęp do danych; ZipOutputStream w Javie pozwala zapisywać do plików w archiwum zip bez martwienia się o wewnętrzne pliki w formacie zip.

Inną powszechną rzeczą, którą możesz znaleźć, są strumienie tekstowe, które pozwalają zamiast tego pisać ciągi znaków bajtów, lub niektóre języki dostarczają strumienie binarne, które pozwalają pisać prymitywne typy. Często spotykaną rzeczą w strumieniach tekstowych jest kodowanie znaków, o czym powinieneś wiedzieć.

Niektóre strumienie obsługują również dostęp losowy, jak w w tym przykładzie. Z drugiej strony, strumień sieciowy, z oczywistych powodów, nie zrobiłby tego.

  • Nie jest to jednak żaden problem, ponieważ nie jest to możliwe .]}
  • Sun mają również przegląd swoich ogólnych OutputStream class i inputstream class.
  • W C++, oto istream (strumień wejściowy), ostream (strumień wyjściowy) i iostream (strumień dwukierunkowy) dokumentacja.

UNIKSOPODOBNE systemy operacyjne również obsługują model strumienia z wejściem i wyjściem programu, jak opisano tutaj .

 26
Author: IRBMe,
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-08-01 11:20:54

Oprócz rzeczy wymienionych powyżej istnieje inny rodzaj strumieni-zdefiniowanych w funkcyjnych językach programowania, takich jak Scheme lub Haskell-ewentualnie nieskończona struktura danych, która jest generowana przez jakąś funkcję na żądanie.

 6
Author: EFraim,
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-08-01 11:35:36

Inna analogia: nie można pływać pod strumieniem, dlatego po prostu można pobrać następny bit, bajt, łańcuch lub obiekt ze strumienia, podczas gdy już odczytane dane są usuwane. Bilet w jedną stronę...albo po prostu Kolejka bez przechowywania persistence.

Więc potrzebujemy kolejek? Ty zdecyduj.

 5
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-14 00:53:21

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

Zacznij myśleć o analogii do strumienia wody. Otrzymujesz ciągły przepływ danych, tak jak woda stale przepływa w rzece. Niekoniecznie wiesz, skąd pochodzą dane, a najczęściej nie musisz; czy to z pliku, gniazda, czy innego źródła, nie ma to (nie powinno) znaczenia. Jest to bardzo podobne do otrzymanie strumienia wody, dzięki któremu nie musisz wiedzieć, skąd pochodzi; czy to z jeziora, fontanny, czy z jakiegokolwiek innego źródła, nie ma (nie powinno) znaczenia. Źródło

 4
Author: Premraj,
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 10:31:19