Mylicie się, jeśli myśleliście że to koniec prezentowania poszczególnych konstrukcji przeznaczonych do obsługi plików, jak na jakimś pokazie mody. "StreamWriter" w języku C# - oto kolejny byt jaki może nam wszystkim pomóc zapisywać plik, tylko łatwiej i efektywniej. To jest jakby "addon" do opisanego wcześniej "FileStream". Zaciekawieni? To włazić!

"STREAMWRITER" W JĘZYKU C# WYKONUJE TO SAMO...TYLKO OFERUJE WIĘCEJ!

Jest szansa, że mogliście dostrzec, iż "FileStream" choć istotnie pozwala na modyfikację pliku ORAZ zawartości pliku, to jednak...coś jest kurczę jeszcze niedoskonałe. Mamy prawo zapisywać dane do pliku, ale tylko w formie bajtów. Mamy prawo odczytywać z pliku, ale także w postaci wyłącznie bajtów. Wszystko opiera się na bajtach. Cholera, lipa trochę bo przecież nasze programy obracają się wokół różnych typów danych. Przecież jest potrzebny "int", "string", "double", nie wspomnę już o obiektach. Teoretycznie można bawić się w rzutowania typów jednak dla "kilogramów" danych to chyba by był strzał samemu sobie w potylicę. Czy jest zatem coś, co może nam pomóc W ŁATWYM I PRZYJEMNYM zapisywaniu danych RÓŻNYCH typów?

W tym miejscu...

...wyłania się...

...bohater tego artykułu...

...jakim jest "StreamWriter" w języku C#! To on pomoże nam w poszerzeniu wachlarza zdolności zapisu do pliku. Jego "potęga" polega na możliwości "wkładania" do wejścia różnych typów danych i konwertowaniu na tekst. "FileStream" ogranicza się tylko do bajtów, "StreamWriter" może przerabiać bajty, liczby całkowite, łańcuchy znaków i całą paletę typów prostych, a wszystko przy pomocy prostych wywołań klarownych metod.

METODY KLASY "STREAMWRITER"

Jakie to są metody? Te najważniejsze ukazuje poniższa tabela:

Nazwa Znaczenie
Close Zamknięcie strumienia (bardzo ważnym jest, żeby ZAWSZE na końcu wywołać tę metodę; inaczej plik może się nie ukazać w katalogu i nie będzie możliwe wykonywanie na nim operacji!).
Dispose Zapis danych bufora do strumienia i zwolnienie niezarządzanych zasobów (parametr "boolowski" pozwala także zwolnić te zarządzane).
Flush Czyszczenie buforów strumienia i zapis danych bufora do pliku.
Write Zapis danych do strumienia (przeciążenia tej metody pozwalają na wprowadzenie dowolnego typu prostego).
WriteLine Zapis danych do strumienia wraz z dodaniem na końcu znaku nowej linii.

PRZYKŁAD KODU ŹRÓDŁOWEGO

Czas podsumować wszystkie zebrane informacje krótkim przykładem. Wprowadźmy sobie parę liczb zmiennoprzecinkowych "float":

string filename = "data.txt";
FileStream fs = new FileStream(filename, FileMode.Create);
StreamWriter sw = new StreamWriter(fs);
float[] floats = {35.69f, 116.01f, 57.84f, 1920.056f};

foreach (float f in floats)
{
	sw.WriteLine(f);
}

sw.Close();

Parę zdań tytułem objaśnienia. Konstruktor "StreamWriter" w języku C# używany w przykładzie wymaga utworzenia instancji "FileStream", klasy opisanej w jednym z poprzednich materiałów. Można także "wszczepić" obiekt klasy "FileStream" bezpośrednio do "StreamWriter'a", jeśli macie pewność że nie będziecie z niego w ogóle korzystać:

StreamWriter sw = new StreamWriter(new FileStream(filename, FileMode.Create));

Proponuję jednak rozdzielić instrukcje na dwie części, aby pochylić się w stronę czytelności kodu. Dalej, inicjujemy sobie tablicę "float'ów" wypełniając ją przykładowymi liczbami i przy pomocy pętli "foreach", zapisujemy sobie każdą z nich używając metody "WriteLine", która spowoduje zapisanie każdej danej w osobnym wierszu, dzięki czemu nie będą się ze sobą zlewać. Na samym końcu jest zamknięcie strumienia, które jest równie ważną operacją co cała reszta!

A CO Z OBIEKTAMI?

A z obiektami to już inna historia, bo tu sama komenda nie wystarczy. Nie da się o tak na pstryknięcie palcem, zapisać obiektu do pliku jako pojedynczego bytu (potrzebna jest tzw. "serializacja", która wymaga ZUPEŁNIE ODMIENNEGO podejścia). Możecie próbować, ale i tak zostanie wywołana jedynie metoda "ToString", a w pliku znajdzie się zwrócona przez nią wartość. Na etapie klasy "StreamWriter" możecie co najwyżej zapisać każde osobne pole, ale nie ma co liczyć na zapis obiektu...jako obiektu. To tylko poprzez serializację.

Klasa "StreamWriter" w języku C#

"StreamWriter" w połączeniu z "FileStream", otwiera drogę do zapisu różnych prostych typów danych. Nadal jedynym ograniczeniem są obiekty.


Tak się kończy wpis dotyczący klasy "StreamWriter" w języku C#. A już w kolejnym materiale...czynności przeprowadzane w drugą stronę.

PODOBNE ARTYKUŁY