|
Dit artikel is gepubliceerd op zondag 31 juli 2011 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.
10.1.1. Stream ObjectenOm tekst te lezen uit een bestand kunnen we gebruik maken van een "stream" ( System.IO.Stream ). Net als een rivierstroom die gebruikt wordt om goederen te vervoeren, kunnen we streamobjecten gebruiken om data te vervoeren. Deze data kan als bron of bestemming een bestand zijn ( System.IO.StreamReader ), maar dit kan bijvoorbeeld net zo goed een bepaalde locatie zijn op het netwerk ( System.Net.Sockets.NetworkStream ) of een bepaalde locatie in het geheugen ( System.IO.MemoryStream ).
In tegenstelling tot een rivierstroom is het bij streamobjecten niet altijd zo dat men informatie in beide richtingen kan vervoeren.
Steamobjecten kenmerken zich doorgaans in het feit dat ze met "schaarse" bronnen of doelen ( "resources" ) omgaan. Dergelijke bron/doel ( bijvoorbeeld een bestand ) kan door verschillende applicaties, componenten, threads, ... gedeeld worden. Het vrijgeven van de resources - en dus het beschikbaar stellen voor anderen - of simpelweg het finaliseren van de stream ( het afwerken en beëindigen van de datatransfer ) moet dan doorgaans ook expliciet worden aangegeven. Om dit ( het finaliseren van de stream en eventueel vrijgeven van schaarse bronnen ) te verwezelijken is vaak een Close method aanwezig. In de volgende voorbeelden zal je dan ook zien hoe na gebruik van de streamobjecten de Close method wordt aangeroepen. boven
10.1.2. System.IO.StreamReaderOm tekst te lezen vanuit een bestand kan je gebruik maken van een StreamReader object uit de System.IO' namespace. Deze namespace bevat overigens vele datatypes die bruikbaar zijn om input/output ( vandaar IO ) operaties uit te voeren doorgaans op het filesysteem ( bijvoorbeeld bestanden ). boven
10.1.3. Regel per Regel InlezenVeronderstel dat we over volgend bestand ( TextFile1.txt ) beschikken : Bij constructie van een StreamReader object geven we het pad op van het bestand dat onze stream moet gebruiken. Bemerk dat dit in volgend voorbeeld gaat om een relatief pad ( zonder absolute verwijzing naar drive en directories ). Dit veronderstelt dat het bestand zich op dezelfde locatie bevindt als onze applicatie executable. Visual Studio : Als je dit bestand ( TextFile1.txt ) aan een Visual Basic project toevoegd en in het Properties toolvenster ( Menu : View > Properties Window ) de eigenschap Copy to Output Directory op Copy if newer instelt, zal bij elke wijziging aan dit bestand uit het project dit bestand bij het builden van het project ook worden gekopieerd naar de output folder van het project. Dit is doorgaans de Bin\Debug\ of Bin\Release\ subfolder van de project directory. Men kan echter ook een absoluut pad naar het bestand opgeven, bijvoorbeeld "C:\Test\TextFile1.txt".
De property EndOfStream van een StreamReader object is bruikbaar om na de gaan of de huidige "cursor" positie zich op het eind van de stream ( bestand ) bevindt.
Deze cursor positie wordt beïnvloed door de leesoperaties die worden gemaakt. Methods als Read, ReadBlock, ReadLine en ReadToEnd ( die men kan gebruiken om de inhoud van het bestand in te lezen ) zullen dan ook deze cursor ( huidige "inleespositie" ) verplaatsen.
In volgend voorbeeld wordt de ReadLine method geïllustreerd die de inhoud vanaf de huidige cursor positie tot net voor het endline karakter zal gaan opleveren ( in tekst ( String ) vorm ). De cursor wordt hiermee ook verplaatst tot net na het newline karakter. Dit zorgt ervoor dat een volgende aanroep van deze functie de volgende lijn zal inlezen. Als we dit herhalen totdat de property EndOfStream False oplevert lezen we in dat geval dus alle regels in. Visual Basic 2010 Broncode Module StreamReaderReadLineExample Sub Main() Dim path As String = "TextFile1.txt" Dim streamReader As New System.IO. StreamReader(path) Do Until streamReader.EndOfStream Dim line As String = streamReader.ReadLine() Console.WriteLine(line) Loop streamReader.Close() Console.ReadLine() End SubEnd ModuleDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Console Application Output abc
de
f boven
10.1.4. Volledige Bestandsinhoud InlezenIndien je meteen de volledige bestandsinhoud wil inlezen kan je gebruik maken van de ReadToEnd method. Ook deze zal in String vorm de inhoud opleveren. Deze keer inclusief de newline karakters. Visual Basic 2010 Broncode Module StreamReaderReadToEndExample Sub Main() Dim streamReader As New System.IO. StreamReader( "TextFile1.txt") Dim fileContent As String = streamReader.ReadToEnd() Console.WriteLine(streamReader.EndOfStream) streamReader.Close() Console.WriteLine(fileContent) Console.ReadLine() End SubEnd ModuleDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
De cursor wordt door ReadToEnd dan ook meteen verplaatst naar de "end-of-stream" positie (1). Console Application Output True
abc
de
f Bemerk overigens ook hoe we hier pas de bestandsinhoud afdrukken nadat de stream werd gesloten ( aanroep van de Close method ). Dit is geen probleem gezien de bestandsinhoud hier reeds in het geheugen ( variabele fileContent ) was ingeladen. Het is trouwens een goede gewoonte om streamobjecten zo snel als mogelijk te gaan sluiten/finaliseren. boven
10.1.5. My.Computer.FileSystem.ReadAllTextDoor gebruik te maken van de ReadAllText method van het My object My.Computer.FileSystem kan men op nog eenvoudigere wijze de volledige bestandsinhoud inlezen. Geen gedoe met streamobjecten, of het finaliseren van deze objecten, dit wordt reeds verwezelijkt door deze ReadAllText functie. Deze zal in String vorm de volledige inhoud van dit bestand opleveren. Visual Basic 2010 Broncode Module MyComputerFileSystemReadAllTextExample Sub Main() Dim path As String = "TextFile1.txt" Dim fileContent As String fileContent = My.Computer.FileSystem.ReadAllText(path) Console.Write(fileContent) Console.ReadLine() End SubEnd ModuleDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Console Application Output abc
de
f Objecten en hun methods uit de My namespace zijn niet in elke .NET taal beschikbaar. Deze kunnen we echter wel gebruiken in Visual Basic. Voor meer uitleg over deze namespace verwijs ik naar het desbetreffende topic.
Er is in dit My.Computer.FileSystem object ook method beschikbaar om aparte regels te gaan inlezen. Ook hierdoor wordt het vaak noodzakelijk om zelf manueel aan de hand van streamobjecten te gaan werken.
Om individuele karakters in te lezen kan je gebruik maken van methods als StreamReader.Read en StreamReader.ReadBlock.
Dit artikel is gepubliceerd op zondag 31 juli 2011 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.
|