2013-05-17 23 views
8

W języku Java i C# istnieje kilka klas buforowania strumieni: BufferedStream w języku C#, Buffered(Input|Output)Stream i Buffered(Reader|Writer).Jak działa buforowanie strumieni?

Dostają trochę strumienia w konstruktorze i implementują ten sam interfejs.

Pytanie brzmi - jak to działa?

Co się stanie, gdy próbuję odczytać jeden bajt? Czyta dużą ilość bajtów w buforze wewnętrznym, a następnie zwraca go do bajtu po bajcie? Pisząc jeden bajt? Zapisuje do wewnętrznego bufora i na flush() zapisuje go do strumienia wewnętrznego?

A co z odczytywaniem/pisaniem tablicy bajtów - czy jest to niewydajne w przypadku buforowanych strumieni, które powodują podwójne kopiowanie bajtów do wewnętrznej tablicy?

Odpowiedz

2

Czyta wiele bajtów w buforze wewnętrznym, a następnie zwraca bajt po bajcie do mnie?

Zasadniczo tak. Potrzeba czasu, aby poprosić o dane z talerzy dysku lub ze strumienia TCP, więc może być bardziej wydajne uzyskanie całego kawałka bajtów na raz, zamiast próbować pobrać je pojedynczo ze źródła.

+0

Tak więc buforowany strumień jest przydatny, jeśli czytam dużo bajtów i chcę czytać bajt po bajcie, nie myśląc o wczytaniu do bufora? I jest bezużyteczne, jeśli chcę ręcznie odczytać tablicę bajtów w moim buforze? – VorobeY1326

+2

Strumień buforowany jest przydatny, jeśli źródło danych ma pewne obciążenie związane z żądaniami, a użytkownik chce ograniczyć liczbę żądań. Dysk twardy trwa około 1/120 sekundy, aby całkowicie się obrócić, więc jeśli pobierzesz z niego 120 znaków, znak po znaku, w najgorszym przypadku może zająć całą sekundę. Ale jeśli pobierzesz wszystkie 120 znaków naraz, możesz to zrobić w jednym obrocie. Oczywiście, możesz stworzyć własny bufor, ale po co odkrywać nowe koło? –

+2

Należy zauważyć, że obiekt FileStream w .NET jest już wystarczająco buforowany do użycia z dyskiem twardym. Potrzebujesz tylko "BufferedStream", jeśli czytasz pakiety TCP z gniazda lub coś w tym stylu. –