Streams i .NET

Tags:    .net
Skrevet af Bruger #4522 @ 20.04.2008

BufferStream: en deokoratør-stream


En buffer bruges til at forbedre en datastrøms ydeevne ved at fungere som et midlertidigt lager førend at data sendes videre. Stort set alle I/O-enheder har en form for buffer, bl.a. printere.

Når du udvikler programmer der gør brug af I/O-handlinger vil du som regel ønske at bruge en buffer da fordelene er så store, og heldigvis er det nemt i .NET. Du bruger blot den dekoratør-stream der hedder BufferedStream. Da der her er tale om en dekoratør-stream skal den bruges på en allerede oprettet lager-stream. Da FileStream har sin egen buffer indbygget, og man ikke bruger en buffer ved MemoryStream vil man oftest kun bruge en buffer på en NetworkStream (i nogle tilfælde kan det være givtigt af bruge en buffer på en FileStream for på den måde at udvide dens allerede eksisterende buffer).

Følgende metode viser hvordan man kan bruge en BufferedStream:

Fold kodeboks ind/udKode 


Kyptering af kommunikationen - CryptoStream: en dekoratør-stream


Noget data er konfidentiel og transmission af sådanne over nettet kræver at man påtager sig nogle sikkerhedshensyn. En måde at sikre kommunikation på er ved at kryptere indholdet med en hemmelig nøgle. Modtageren af beskeden kan da så afkode det sendte også ved anvendelse af en hemmelig nøgle. Afhængig af kypteringsalgoritmen er de to anvendte nøgler enten ens eller forskellig.

Ved at bruge CryptoStream kan du i et .NET program meget nemt anvende ekstremt sofistikeret krypteringsteknikker til at sikre din kommunikation. Hvis sådanne sikkerheds foranstaltninger er nødvendige for dig så sørg altid for at anvende anerkendte krypteringsalgoritmer; der er ikke noget farligere, ud fra et sikkerheds synspunkt, end en kypteringsalgoritme udviklet af amatør kryptologer/matematikker. Overlad dette til dem der har brugt årevis på det og anvend i stedet én af de kendte algoritmer.

Via CryptoStream kan du bruge følgende anerkendte krypteringsalgoritmer: DES (Data Encryption Standard, som dog ikke anses som sikker længere, så hold dig fra denne medmindre du har god grund til at anvende den), RC2 (Rivest Cipher), Rijndael (også kendt som AES: Advanced Encryption Standard) og triple DES (som er DES anvendt tre gange).

Følgende program illustreret hvordan man kan bruge en CryptoStream til at skrive noget krypteret tekst til en fil:

Fold kodeboks ind/udKode 


Det første vi gør er at oprette et SymmetricalAlgorithm-objekt med den algoritme vi ønsker at bruge til krypteringen. Som udgangspunkt anvendes Rijndael og det gør vi også her (bemærk at som navnet antyder, SymmetricalAlgorithm, er disse krypteringsalgoritmer symmetriske hvilket betyder at samme nøgle anvendes til både kryptering og dekryptering). Næste trin er at lave et objekt som repræsenterer den transformation vi ønsker, dvs. om vi ønsker at kryptere eller dekryptere. Da vi her ønsker at kryptere kalder vi CreateEncryptor metoden på vores SymmetricalAlgorithm-objekt, hvilket giver os et objekt af typen ICryptoTransform som vi bruger senere til at lave et CryptoStream-objekt. Men før vi når til det, opretter vi et FileStream-objekt der repræsenterer den fil vi ønsker at skrive den krypteret tekst til. Nu opretter vi så et CryptoStream-objekt, og det gøres ved at angive både vores FileStream-objekt, vores ICryptoTransform-objekt samt at vi ønsker skriverettigheder til kypterings-datastrømmen (det gør vi via den enum der hedder CryptoStreamMode). Og endelig kan vi skrive den krypterede besked til filen ved at bruge Write-metoden, fuldstændig på samme måde som vi har gjort i vores andre eksempler.

Efter at have kørt programmet kan du åbne den fil vi oprettede - InvasionsPlan.dat - for at se hvad der blev skrevet. I mit tilfælde blev der skrevet:

6Ä`M”ñèlêÔW.øvX‡3‰ ’‹ÝPwH‹<;)Fÿg

Sådan en besked som er krypteret med Rijndael er ubrydelig såfremt der bruges en lang nok nøgle.

Et sidste eksempel: StreamReader


Faktisk kunne vi stort set klare det meste af vores I/O ønsker med det vi har set indtil videre. Vi kan læse hvad vi ønsker fra en datastrøm, og skrive hvad vi ønsker til en datastrøm.

Der er dog en lidt irriterende ting, og det er at vi sandsynligvis ønsker at læse og skrive tekst ganske tit, og så er det lidt irriterende at vi hele tiden selv skal sørge for at kode til og fra rene bytes for at det virker. Her kommer stream-adaptere til hjælp.

Til at håndtere tekst kan du gøre brug af klasserne StreamReader og StreamWriter. Følgende kodeeksempel illustrerer kort hvordan man kan bruge StreamReader.

Fold kodeboks ind/udKode 


Jeg starter med at oprette et FileStream-objekt for en fil der indeholder en af mine tidligere artikler. Derefter oprettet jeg en StreamReader så jeg kan læse tekst fra filen uden selv at skulle håndtere de enkelte bytes.

Eksemplet forsætter med en while-løkke der skriver alle tekstlinjer fra filen til konsollen. Til sidst husker jeg at kalde Close() på min filstrøm og stream-adapter. Bemærk at jeg i modsætning til tidligere eksempler ikke har noget at gøre med nogle bytes her - jeg kan nøjes med blot at tænke på tekst og lader StreamReader håndtere alle de underliggende detaljer.

Der findes også en stream-adapter til at håndtere primitive datatyper. BinaryReader og BinaryWriter kan respektive læse og skrive primitive datatyper. BinaryReader har f.eks. metoder med navne som ReadChar() og ReadInt32().

Hvis du lave meget XML I/O er der også to klasser til det: XmlReader og XmlWriter.

Jeg har her kun overfladisk berørt stream-adaptere, men som du kan se fra ovenstående eksempel er de ligetil at bruge så kom bare i gang med at læse og skrive alt hvad du kan!

Afslutning


I denne artikel har vi kigget på brugen af stream i .NET. Jeg håber at du har fundet den informativ, og kan bruge det til noget.


Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.

Del også gerne artiklen med dine Facebook venner:  

Kommentarer (2)

User
Bruger #6559 @ 20.04.08 11:17
En meget god artikel. Jeg synes at når du begynder at skrive om MemoryStream, så er det synd du ikke går mere i dybden med det når du alligevel begynder at fortælle lidt om klassen. Der burde du måske bare have undværet det helt og så skrevet i starten at det ikke var med i artiklen. Ellers faldt jeg ikke over det helt store. Godt beskrivende og helt sikkert noget jeg kommer til at bruge. Keep up the good work :)
User
Bruger #4522 @ 20.04.08 15:54
Tak for dine kommentarer Martin. Du har en pointe omkring MemoryStream og jeg vil prøve at uddybe det lidt mere i artiklen.
Du skal være logget ind for at skrive en kommentar.
t