Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
1 Einführung
2 Grundlagen der Sprachsyntax
3 Klassendesign
4 Weitere Datentypen
5 Multithreading
6 Collections und LINQ
7 Eingabe und Ausgabe
8 Anwendungen: Struktur und Installation
9 Code erstellen und debuggen
10 Einige Basisklassen
11 Windows-Anwendungen erstellen
12 Die wichtigsten Steuerelemente
13 Tastatur- und Mausereignisse
14 MDI-Anwendungen
15 Grafiken mit GDI+
16 Drucken
17 Entwickeln von Steuerelementen
18 Programmiertechniken
19 WPF – Grundlagen
20 Layoutcontainer
21 WPF-Steuerelemente
22 Konzepte von WPF
23 Datenbankverbindung mit ADO.NET
24 Datenbankabfragen mit ADO.NET
25 DataAdapter
26 Offline mit DataSet
27 Datenbanken aktualisieren
28 Stark typisierte DataSets
A Anhang: Einige Übersichten
Stichwort

Jetzt Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Visual Basic 2008 von Andreas Kuehnel, Stephan Leibbrandt
Das umfassende Handbuch
Buch: Visual Basic 2008

Visual Basic 2008
3., aktualisierte und erweiterte Auflage, geb., mit DVD
1.323 S., 49,90 Euro
Rheinwerk Computing
ISBN 978-3-8362-1171-0
Pfeil 7 Eingabe und Ausgabe
Pfeil 7.1 Namensräume der Ein- bzw. Ausgabe
Pfeil 7.2 Ausnahmebehandlung
Pfeil 7.3 Dateien und Verzeichnisse
Pfeil 7.3.1 Dateizugriff mit File
Pfeil 7.3.2 Dateizugriff mit FileInfo
Pfeil 7.3.3 Die Klassen Directory und DirectoryInfo
Pfeil 7.3.4 Dateizugriffe in Aktion
Pfeil 7.3.5 Pfade mit Path
Pfeil 7.3.6 Laufwerksinformation mit DriveInfo
Pfeil 7.3.7 SpecialDirectories
Pfeil 7.4 Datenflüsse in Streams
Pfeil 7.4.1 Die abstrakte Klasse Stream
Pfeil 7.4.2 Stream-Klassen im Überblick
Pfeil 7.4.3 Dateizugriff mit FileStream
Pfeil 7.5 Texte mit TextReader und TextWriter
Pfeil 7.5.1 Texte mit StreamWriter schreiben
Pfeil 7.5.2 Texte mit StreamReader lesen
Pfeil 7.5.3 Zeichenketten mit StringWriter und StringReader
Pfeil 7.6 Binärdaten mit BinaryReader und BinaryWriter
Pfeil 7.6.1 Schreiben mit BinaryWriter
Pfeil 7.6.2 Lesen mit BinaryReader
Pfeil 7.6.3 Binäre Datenströme auswerten
Pfeil 7.6.4 Komplexe binäre Daten
Pfeil 7.7 Serialisierung
Pfeil 7.7.1 Serialisierungsverfahren
Pfeil 7.7.2 Testklassen
Pfeil 7.7.3 Serialisierung mit BinaryFormatter
Pfeil 7.7.4 Serialisierung mit SoapFormatter
Pfeil 7.7.5 Serialisierung mit XmlSerializer


Rheinwerk Computing - Zum Seitenanfang

7.5 Texte mit TextReader und TextWriter Zur nächsten ÜberschriftZur vorigen Überschrift

Zeichenketten werden in .NET in Unicode codiert. Jeder Buchstabe besteht aus 1 bis 2 Byte (bzw. 4 bei Surrogaten). Beim Lesen und Schreiben einzelner Bytes ist es sehr lästig, einzelne Bytes zusammenzusetzen oder auseinanderzupflücken. Daher gibt es in .NET die beiden ab-strakten Klassen TextReader und TextWriter, die sich um das korrekte Hantieren mit Texten kümmern. Aus der folgenden Klassenhierarchie werden wir uns mit den Klassen StreamReader/StreamWriter und StringReader/StringWriter beschäftigen. Die Stream-Variante operiert auf Dateien, die String-Variante auf Zeichenketten.

System.Object 
 +System.MarshalByRefObject 
   +3-+TextReader 
      | +1--DocDataTextReader 
      | +3-+StreamReader 
      |    +StringReader 
      +TextWriter 
        +1--DocDataTextWriter 
        +2--IndentedTextWriter 
        +3-+StreamWriter 
        |  +StringWriter 
        +4--HttpWriter 
        +5--HtmlTextWriter 
             +5-+Html32TextWriter 
             |  | +5--ChtmlTextWriter 
             |  +XhtmlTextWriter 
             +6--MultiPartWriter 
                  +6--MobileTextWriter 
                       +6-+HtmlMobileTextWriter 
                       |  | +6--ChtmlMobileTextWriter 
                       |  +WmlMobileTextWriter 
                       |    +6--UpWmlMobileTextWriter 
                       +7--XhtmlMobileTextWriter

  1: Microsoft.VisualStudio.Shell.Design.Serialization 
  2: System.CodeDom.Compiler 
  3: System.IO 
  4: System.Web 
  5: System.Web.UI 
  6: System.Web.UI.MobileControls.Adapters 
  7: System.Web.UI.MobileControls.Adapters.XhtmlAdapters

Rheinwerk Computing - Zum Seitenanfang

7.5.1 Texte mit StreamWriter schreiben Zur nächsten ÜberschriftZur vorigen Überschrift

Konstruktoren

Wir wenden uns zunächst einigen Konstruktoren der Klasse StreamWriter zu. In der folgenden Syntax sind optionale Parameter kursiv gesetzt.


Public Sub New(path As String, _ 
  append As Boolean, encoding As Encoding, bufferSize As Integer)

Public Sub New(stream As Stream, _ 
  encoding As Encoding, bufferSize As Integer)

Der Endpunkt des Writers wird im ersten Parameter übergeben. Es ist entweder ein Dateipfad oder ein beliebiger von Stream abgeleiteter Strom, zum Beispiel FileStream. In der Einleitung zu Abschnitt 7.4, »Datenflüsse in Streams«, haben wir die Ströme in zwei Klassen eingeteilt. In dieser Terminologie ist der StreamWriter mit Stream-Parameter ein Pass-Through-Stream, sein erster Parameter ist entweder ein Base-Stream oder selbst ein Pass-Through-Stream. Dadurch kann jeder Strom (nachträglich) mit Textverarbeitungsfähigkeiten ausgestattet werden.

Zum Zugriff auf eine Datei können Sie einfach den Pfad zur Datei angeben, zum Beispiel so:

Dim myStreamWriter As StreamWriter = New StreamWriter("C:\MyText.txt")

Wir erzeugen mit dieser Anweisung einen Base-Stream, der eine Zeichenfolge in eine Datei schreiben kann. Alternativ können wir den StreamWriter auf einem FileStream aufbauen.

Dim fs As FileStream = New FileStream("C:\Test.txt", FileMode.CreateNew) 
Dim myStreamWriter As StreamWriter = New StreamWriter(fs)

In der ersten Zeile erzeugen wir einen FileStream, der auf die Datei Test.txt im Stammverzeichnis des Laufwerks C: zugreifen kann. Auf ihn bauen wir in der zweiten Zeile einen StreamWriter auf. Durch die Hintereinanderschaltung von FileStream und StreamWriter werden deren Fähigkeiten kombiniert: Der FileStream-Teil kümmert sich um das byteweise Lesen und Schreiben, während der StreamWriter aus den einzelnen Bytes Zeichen macht bzw. diese in Bytes zerlegt (das Encoding regelt, wie das geschieht). Genauso können Sie natürlich auch einen MemoryStream oder NetworkStream als Argument übergeben.

Standardmäßig verschlüsselt StreamWriter nach UTF-8, Abweichungen davon geben Sie im Parameter vom Typ System.Text.Encoding an, zum Beispiel UTF7Encoding oder UnicodeEncoding (entspricht der UTF-16-Kodierung).


Hinweis
Welchen Buchstaben ein Bytewert beschreibt, regelt die Kodierung. Unter Windows ist in Mitteleuropa ANSI (Codeseite 1252) üblich, das Codes zwischen 0 und 255 erlaubt und Umlaute und einige Sonderzeichen enthält. Demgegenüber läuft ASCII von 0 bis 127 und ist in diesem Bereich mit ANSI identisch. Diesen starken Restriktionen ist Unicode nicht unterworfen, das 1-4 Byte zur Kodierung benutzt. Je nach minimal benutzter Bitzahl unterscheidet man UTF-7, UTF-8, UTF-16 und UTF-32. Der unter .NET verwendete Standard UTF-8 kodiert Codes zwischen 0 und 127 identisch zu ASCII, sodass für diese keine Umkodierung nötig ist und reine ASCII-Systeme damit zurechtkommen.


Ein auf einem Pfad basierender StreamWriter gibt im Parameter append an, ob geschriebene Daten an die Datei angehängt werden oder die Datei überschrieben wird. Existiert die Datei nicht, wird sie erstellt, und der Parameter hat keinen Einfluss. Im letzten Parameter können Sie eine Größe für den Puffer angeben.

Schreiben in den Datenstrom

Das folgende Codefragment schreibt einen kurzen Text in eine (neue) Datei:

Dim sw As StreamWriter = New StreamWriter("C:\NewFile.txt") 
sw.WriteLine("Es saß ein Wiesel") 
sw.WriteLine("auf einem Kiesel") 
sw.Close()

Zuerst wird ein StreamWriter-Objekt unter Angabe eines Dateipfads erzeugt. Daraufhin wird entweder die Datei erzeugt oder eine existierende gleichnamige im angegebenen Verzeichnis überschrieben. Mit jedem Aufruf der von TextWriter geerbten Methode WriteLine wird eine Zeile und ein Zeilenumbruch in die Datei geschrieben, hier zwei Zeilen:


Public Overridable Sub WriteLine()

Public Overridable Sub WriteLine(buffer As Char()) 
Public Overridable Sub WriteLine(buffer As Char(), _ 
                       index As Integer, count As Integer) 
Public Overridable Sub WriteLine(value As Boolean) 
Public Overridable Sub WriteLine(value As Char) 
Public Overridable Sub WriteLine(value As Object) 
Public Overridable Sub WriteLine(value As String) 
Public Overridable Sub WriteLine(value As Zahl)

Public Overridable Sub WriteLine( _ 
                       format As String, ParamArray arg As Object())

Zahl: Decimal, Double, Integer, Long, Single, UInt32, UInt64

Der letzten Überladung bedient sich die Klasse Console zur Ausgabe. Korrespondierend zu dieser Methode schreibt Write Daten, ohne einen Zeilenvorschub anzuhängen (es fehlt nur die parameterlose Variante). Die Methoden Write und WriteLine bilden den Kern der Klasse StreamWriter; Tabelle 7.18 zeigt alle ihre Methoden.


Tabelle 7.18 Methoden von »StreamWriter«

Methode Beschreibung

Close

Schließt das aktuelle Objekt sowie alle eingebetteten Streams.

Flush

Schreibt die gepufferten Daten in den Stream und löscht den Pufferinhalt.

Synchronized

Erstellt einen threadsicheren Wrapper (Shared).

Write

Schreibt in den Stream, ohne einen Zeilenumbruch anzuhängen.

WriteLine

Schreibt in den Stream und schließt mit einem Zeilenumbruch ab.


Eigenschaften

Mit AutoFlush=True wird bei jedem Aufruf von Write-/WriteLine der Puffer in den Datenstrom geschrieben. Die Eigenschaft Encoding liefert die Zeichenkodierung.

Dim sw As StreamWriter = _ 
    New StreamWriter("C:\NewFile.txt", False, Encoding.Unicode) 
Console.WriteLine("Format: {0}", sw.Encoding.ToString())

BaseStream ist der zugrunde liegende Stream, ob explizit gegeben oder implizit durch eine Pfadangabe erzeugt. Tabelle 7.19 zeigt alle Eigenschaften von StreamWriter.


Tabelle 7.19 Eigenschaften von »StreamWriter« (R = ReadOnly)

Eigenschaften Beschreibung

AutoFlush

Löscht den Puffer nach jedem Aufruf von Write oder WriteLine.

BaseStream

Liefert eine Referenz auf den Base-Stream zurück.

R

Encoding

Liefert das aktuelle Encoding-Schema zurück.

R

FormatProvider

Art der Formatierung (Zahlen, Datum)

R

NewLine

Verwendeter Zeilenumbruch

Null

Datenziel »Nirgendwo« (klassengebundenes Feld)

R



Rheinwerk Computing - Zum Seitenanfang

7.5.2 Texte mit StreamReader lesen Zur nächsten ÜberschriftZur vorigen Überschrift

Die aus der Klasse TextReader abgeleitete Klasse StreamReader ist das Gegenstück zum StreamWriter des vorigen Abschnitts. Statt mir Write zu schreiben, liest sie mit Read.

Die Konstruktoren sind identisch zu StreamWriter, außer dass der append-Parameter wegfällt und der neue Parameter detectEncodingFromByteOrderMarks hinzukommt, der angibt, ob die ersten drei Bytes zur automatischen Erkennung des Encodings benutzt werden sollen.

Tabelle 7.20 enthält die Methoden eines StreamReaders.


Tabelle 7.20 Methoden von »StreamReader«

Methode Beschreibung

Close

Schließt das aktuelle Objekt sowie alle eingebetteten Streams.

DiscardBufferedData

Verwirft gepufferte Daten.

Peek

Liest ein Zeichen aus dem Strom, ohne den Positionszeiger zu ändern, und liefert das Zeichen als Integer. Ist der Zeiger hinter dem Datenstrom, ist dieser Wert -1.

Read

Liest ein Zeichen aus dem Strom unter Änderung des Positionszeigers und liefert das Zeichen als Integer. Ist der Zeiger hinter dem Datenstrom, ist dieser Wert –1. Eine zweite Variante liest mehrere Zeichen und gibt die Anzahl gelesener Zeichen zurück.

ReadLine

Liest eine Zeile aus dem Strom – entweder bis zum Zeilenumbruch oder bis zum Ende des Stroms. Der Rückgabewert hat den Typ String (mit dem Wert Nothing, wenn hinter dem Strom gelesen wird).

ReadToEnd

Liest von der aktuellen Position des Positionszeigers bis zum Ende des Stroms alle Zeichen ein (am Stromende steht ein Leerstring).


Wir wollen nun an einem Codebeispiel das Lesen aus einem Strom testen.


'...\IO\Ströme\Texte.vb

Option Strict On 
Imports System.IO 
Namespace EA 
  Module Texte 
    Sub Test() 
      ' Datei erzeugen und mit Text füllen 
      Dim path As String = IO.Path.GetTempFileName() 
      Dim sw As New StreamWriter(path) 
      sw.WriteLine("Es saß ein Wiesel") 
      sw.WriteLine("auf einem Kiesel") 
      sw.Close()

      ' Datei einlesen und an der Konsole ausgeben 
      Dim sr As New StreamReader(path) 
      While sr.Peek() <> –1 
        Console.WriteLine(sr.ReadLine()) 
      End While 
      sr.Close()

      File.Delete(path) 
      Console.ReadLine() 
    End Sub 
  End Module 
End Namespace

Um etwas zu lesen zu haben, schreiben wir mit einem StreamWriter einen zweizeiligen Text in eine beliebige Datei (die Endung des Dateinamens spielt keine Rolle). Damit ein anderer Strom die Datei auslesen kann, schließen wir den StreamWriter.

Mit einem StremReader, der denselben Pfad benutzt, lesen wir mit ReadLine die Zeilen der Datei in einer Schleife aus. Die Abbruchbedingung der Schleife verwendet Peek zur Erkennung des Dateiendes. Die Methode gibt dann -1 zurück. Die Ausgabe zeigt genau zwei Zeilen:

Es saß ein Wiesel 
auf einem Kiesel

Wenn Sie eine Datei komplett einlesen wollen, können Sie statt der Schleife auch

Console.WriteLine(sr.ReadToEnd())

verwenden oder mit

File.ReadAllText(path)

komplett auf den StreamReader verzichten.

Die Read-Methode

Die Read-Methode der Klasse StreamReader ist flexibler als ReadLine und kommt auch mit nicht-zeilenorientierten Strömen zurecht.


Public Overrides Function Read() As Integer 
Public Overrides Function Read( _ 
  buffer As Char(), index As Integer, count As Integer) As Integer

Die parameterlose Variante liest ein Zeichen ein und setzt den Positionszeiger auf das nächste zu lesende Zeichen. Die parametrisierte Variante liest maximal count Zeichen und schreibt sie ab der Position index in das Array buffer. Sie gibt die Zahl der tatsächlich gelesenen Zeichen zurück (0 bei Stromende).

Bei einer Datei gibt Ihnen die Eigenschaft Length von FileInfo die maximale Zahl einlesbarer Zeichen an (maximal, weil ein Buchstabe aus bis zur vier Byte besteht). Die folgende Zeile liest einen Dateiinhalt komplett in den angegebenen Puffer.

sr.Read(puffer, 0, CType(fi.Length, Integer))

Bitte beachten Sie beim Zeichenzählen, dass jeder Zeilenvorschub auch mitzählt. Unter Windows sind es die beiden Zeichen mit den Codes 10 und 13.


Rheinwerk Computing - Zum Seitenanfang

7.5.3 Zeichenketten mit StringWriter und StringReader topZur vorigen Überschrift

Der Endpunkt der Klassen StringReader/StringWriter ist eine Zeichenkette. Damit können Sie diese mit der ganzen Funktionalität der Ströme »nachrüsten«.

StringReader liest Zeichen eines Strings, der dem Konstruktor übergeben wird.


Public Sub New(s As String)

Die Klasse hat keine Eigenschaften, aber (fast) alle Methoden, die auch ein StreamReader hat (mit gleicher Funktionalität).


Public Overrides Sub Close() 
Public Overrides Function Peek() As Integer 
Public Overrides Function Read() As Integer 
Public Overrides Function Read( _ 
  buffer As Char(), index As Integer, count As Integer) As Integer 
Public Overrides Function ReadLine() As String 
Public Overrides Function ReadToEnd() As String

Dazu ein Beispiel:

Dim str As String = "" 
str += "Dunkel war's, der Mond schien helle, " & Environment.NewLine 
str += "Als ein Wagen mit Blitzesschnelle" & Environment.NewLine 
str += "Langsam um die Ecke fuhr." & Environment.NewLine 
' Einlesen und Ausgeben der ersten beiden Zeilen 
Dim sr2 As New StringReader(str) 
Console.WriteLine(sr2.ReadLine()) 
Console.WriteLine(sr2.ReadLine())

StringWriter schreibt die Ausgabe in ein Objekt vom Typ StringBuilder, der im Konstruktor ebenso spezifiziert werden kann wie die Art der Formatierung (Zahlen, Datum).


Public Sub New() 
Public Sub New(formatProvider As IFormatProvider) 
Public Sub New(sb As StringBuilder) 
Public Sub New(sb As StringBuilder, formatProvider As IFormatProvider)

Mit Write schreiben Sie Einzelzeichen oder Zeichenketten in den StringBuilder:

Dim sw As New StringWriter() 
sw.Write("Text des StringWriter-Objekts") 
Console.WriteLine(sw.GetStringBuilder())

Außer GetStringBuilder hat die Klasse keine besonderen Methoden:


Public Overrides Sub Close() 
Public Overridable Function GetStringBuilder() As StringBuilder 
Public Overrides Function ToString() As String 
Public Overrides Sub Write(value As Char) 
Public Overrides Sub Write(value As String) 
Public Overrides Sub Write( _ 
  buffer As Char(),index As Integer, count As Integer)



Ihre Meinung

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.

<< zurück
  Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Visual Basic 2008
Visual Basic 2008
Jetzt Buch bestellen


 Ihre Meinung?
Wie hat Ihnen das Openbook gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Rheinwerk-Shop: Visual Basic 2012






 Visual Basic 2012


Zum Rheinwerk-Shop: Schrödinger programmiert C++






 Schrödinger
 programmiert C++


Zum Rheinwerk-Shop: IT-Handbuch für Fachinformatiker






 IT-Handbuch für
 Fachinformatiker


Zum Rheinwerk-Shop: Professionell entwickeln mit Visual C# 2012






 Professionell
 entwickeln mit
 Visual C# 2012


Zum Rheinwerk-Shop: Windows Presentation Foundation






 Windows Presentation
 Foundation


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo




Copyright © Rheinwerk Verlag GmbH 2009
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern