I/O und Serialisierung Proseminar Objektorientiertes Programmieren mit.net und C# Sebastian Bendeich Institut für Informatik Software & Systems Engineering
Agenda Datei-/Ordnermanipulation Streamkonzept FileStream Reader/Writer StreamReader/-Writer BinaryReader/-Writer Serialisierung Motivation Binäre Serialialiserung XML Serialisierung 25.11.11 Sebastian Bendeich IO und Serialisierung 2
Datei-/Ordnermanipulation Ermöglicht das Anlegen, Kopieren, Verschieben, Löschen, etc. von Dateien und Ordnern Namespace: System.IO Klasse Funktion File FileInfo Directory DirectoryInfo Path DriveInfo SpecialDirectories Statische Methoden zur Dateimanipulation Vgl. File, aber instanziiert Statische Methoden zur Ordnermanipulation Vgl. Directory, aber instanziiert Statische Methoden zum Erzeugen/Analysieren von Pfadangaben Informationen zu einem bestimmten Laufwerk bzw. Finden von Laufwerken Behält besondere Ordner (z.b. Eigene Dokumente ) als statische Attribute bereit 25.11.11 Sebastian Bendeich IO und Serialisierung 3
Path Methode ChangeExtension(String path, String newext) Combine(String[] teile) IsPathRooted(String path) GetPathRoot(String path) GetDirectoryName(String path) GetFileName(String path) GetTempFileName() Funktion Ersetzt/Löscht Dateierweiterung @ C:\test\sub\datei.txt, jpg -> C:\test\datei.jpg Fügt Elemente des Arrays zu Pfadangabe zusammen [ C:, @ test\sub, bsp.txt ] Prüft, ob absolute Pfadangabe Extrahiert den Stammordner (Laufwerk) C:\ Extrahiert den Ordner C:\test\sub Extrahiert Dateiangabe datei.txt Erstellt temporäre Datei und gibt absolute Pfadangabe zurück Feld DirectorySeparatorChar enthält Verzeichnistrennzeichen 25.11.11 Sebastian Bendeich IO und Serialisierung 4
Directory Methode CreateDirectory(string) Delete(string, boolean) Exists(string) GetDirectories(string) GetParent(string) Move(src, dest) Funktion Erstellt Verzeichnis(se) gemäß Pfadangabe Löscht das Verzeichnis und falls true auch alle Unterverzeichnisse/Dateien Prüft, ob Verzeichnis existiert Gibt die Unterverzeichnisse des angegebenen Pfads zurück (String[]) Liefert das übergeordnete Verzeichnis Verschiebt Ordner samt Unterverzeichnisse/Dateien an neuen Ort 25.11.11 Sebastian Bendeich IO und Serialisierung 5
File Methode Exists(string) Copy(src, dest) Move(src, dest) Delete(string) Funktion Prüft, ob Datei vorhanden ist Kopiert angegebene Datei Verschiebt angegebene Datei Löscht angegebene Datei Create(string) Open(string, FileMode) OpenText(string) Erstellt Datei und liefert FileStream (ReadWrite), überschreibt ggf. vorhandene Datei Öffnet Datei im angegebenen Modus (Create, Append, Open, OpenOrCreate, ), liefert FileStream (ReadWrite) Öffnet Datei (UTF8-codiert) zum Lesen, liefert StreamReader 25.11.11 Sebastian Bendeich IO und Serialisierung 6
File (Fortsetzung) Methode ReadAllBytes(string) ReadAllText(string) ReadAllLines(string) WriteAllBytes(string, byte[]), WriteAllLines(string, byte[]), WriteAllText(string, string) AppendAllText(string, string) AppendText(string) Funktion Öffnet Datei, liest alle Bytes in Array ein und schließt Datei wieder (byte[]) Vgl. ReadAllBytes, Rückgabewert allerdings als String interpretiert (Unterstützt BOM) (string) Vgl. ReadAllText, aber jede Zeile als ein eigener String (string[]) Zu *Read analoger Schreibbefehl (überschreibt bereits vorhandene Daten) Fügt Zeichenfolge an bestehende Datei an oder erstellt Datei neu Öffnet Datei zum Schreiben, instanziiert StreamWriter (UTF-8) und gibt diesen zurück 25.11.11 Sebastian Bendeich IO und Serialisierung 7
Beispiel Datei-/Ordnermanipulation 25.11.11 Sebastian Bendeich IO und Serialisierung 8
Streams Abstrahieren Datenströme (Datei, Netzwerk, etc.) Derselbe Stream kann für Lese- und Schreiboperationen verwendet werden Unterstützung von asynchronem Lesen bzw. Schreiben Existenz von Pass-Through-Streams (BufferedStream, GZipStream, CryptoStream u.v.m.) 25.11.11 Sebastian Bendeich IO und Serialisierung 9
Stream <abstract> Felder/Eigenschaften CanRead CanWrite CanSeek Length Position Funktion Kann man auf Stream lesen (bool) Kann man auf Stream schreiben (bool) Kann man Zeiger im Stream manipulieren Streamlänge in Bytes (long) Auslesen/Setzen der Zeigerposition 25.11.11 Sebastian Bendeich IO und Serialisierung 10
Stream (Fortsetzung) Methoden WriteByte(byte) Write(byte[], int offset, int count) ReadByte() Read(byte[], int offset, int count) Seek(long offset, SeekOrigin org) Close() Flush() Funktion Schreibt Byte an aktuelle Stelle in den Stream Schreibt count viele Elemente aus Bytearray ab Position offset in Stream Liest ein Byte an aktueller Position, -1 falls Streamende (int) Liest maximal count Bytes in übergebenen Array ab Position offset (int Anzahl gelesene Bytes) Setzt den Zeiger auf byte offset relativ zu Origin (Begin, Current, End) Schließt den Streams (Flush) Schreibt Pufferänderungen in Datei (Position wird angepasst für konsekutives Lesen) 25.11.11 Sebastian Bendeich IO und Serialisierung 11
FileStream Unterstützt Read, Write und Seek (nur bei Datenträgerdateien) Puffert Daten (Standardpuffer 8 KB) Konstruktur FileStream(String file, FileMode mode) FileStream(String file, FileMode mode, FileAccess access) 25.11.11 Sebastian Bendeich IO und Serialisierung 12
Beispiel FileStream 25.11.11 Sebastian Bendeich IO und Serialisierung 13
Reader/Writer U.a. StreamReader, BinaryReader (bzw. Writer) KEINE abstrakte Oberklasse StreamReader Verarbeitung von Textdateien BinaryReader Verarbeitung verschiedener Typen gemischt 25.11.11 Sebastian Bendeich IO und Serialisierung 14
Beispiel StreamReader/StreamWriter 25.11.11 Sebastian Bendeich IO und Serialisierung 15
BinaryReader/BinaryWriter Erlaubt das Lesen bzw. Schreiben von hauptsächlich primitiven Datentypen in ihrer Bytedarstellung Vereinfacht manuelle Serialisierung von Objekten/Datenstrukturen 25.11.11 Sebastian Bendeich IO und Serialisierung 16
Beispiel BinaryReader/BinaryWriter 25.11.11 Sebastian Bendeich IO und Serialisierung 17
Serialisierung Objekte über Laufzeit hinaus erhalten Weitergabe von Objekten an verschiedene Instanzen Übertragung von Objekten über das Netzwerk Bei C#: Binäre Serialisierung XML-Serialisierung 25.11.11 Sebastian Bendeich IO und Serialisierung 18
Binäre Serialisierung - Vorbedingungen Klasse mittels Attribut [Serializable] als serialisierbar gekennzeichnet Einzelne Felder können via [NonSerialized] ausgeschlossen werden Verwendete Klassen müssen auch serialisierbar sein (De-)Serialisierung erfolgt mittels Objektmethoden von System.Runtime.Serialization.Formatters.Binary.BinaryFormatter Serialize(Stream s, Object o) (MeinTyp) Deserialize(Stream) 25.11.11 Sebastian Bendeich IO und Serialisierung 19
Beispiel binäre Serialisierung 25.11.11 Sebastian Bendeich IO und Serialisierung 20
XML Serialisierung Kein Attribut notwendig Achtung: Unterstützt keine zirkulären Referenzen! Klasse muss public sein Verarbeitet nur public Felder bzw. les- und schreibbare Eigenschaften Klasse muss public, parameterlosen Konstruktor aufweisen Durch Attribute (System.XML.Serialization) lässt sich Serialisierungsergebnis beeinflussen (De-)Serialisierung erfolgt mittels System.XML.Serialization.XmlSerializer Objekt XmlSerializer(Type) Serialize(Stream s, Object o) (MeinTyp) Deserialize(Stream s) 25.11.11 Sebastian Bendeich IO und Serialisierung 21
Beispiel XML-Serializer 25.11.11 Sebastian Bendeich IO und Serialisierung 22
Quellen MSDN Library (http://msdn.microsoft.com/de-de/library/ms123401.aspx) Visual C# 2010, Andreas Kühnel, Galileo Computing, ISBN 978-3-8362-1552-7 25.11.11 Sebastian Bendeich IO und Serialisierung 23
DriveInfo Konstruktor erwartet Laufwerksbuchstabe als String Methode/Felder AvailableFreeSpace DriveFormat DriveType RootDirectory <static> GetDrives() Funktion Zur Verfügung stehender Speicherplatz (long) Verwendete Dateisystem (String) Liefert Laufwerkstyp (DriveType Enum) Liefert das Stammverzeichnis (DirectoryInfo) Liefert Array aller logischen Laufwerke auf dem Rechner (DriveInfo[]) 25.11.11 Sebastian Bendeich IO und Serialisierung 24
DriveType Enum Unknown NoRootDirectory Removable Fixed Network CDRom RAM Beschreibung Typ unbekannt Laufwerk hat kein Stammverzeichnis Wechseldatenträger Festplatte Netzlaufwerk Optischer Datenträger RAM-Laufwerk 25.11.11 Sebastian Bendeich IO und Serialisierung 25
StreamReader Konstruktor StreamReader(Stream s) StreamReader(String path) StreamReader(Stream s, bool detectbom) Funktion Liest von s und interpretiert Daten gemäß UTF-8 Öffnet Datei path zum Lesen (UTF-8) Liest von s und interpretiert Daten gemäß gefundener BOM (true) oder UTF-8 Methode Peek() Read() ReadLine() ReadToEnd() Funktion Liefert das nächste Zeichen (int) oder -1 ohne Zeiger zu verändern Vgl. Peek, Zeiger wird um eins vorgeschoben Liefert String bis von aktueller Position bis zum nächsten Zeilenvorschub/Wagenrücklauf Liefert String aus Zeichen von aktueller Position bis Ende 25.11.11 Sebastian Bendeich IO und Serialisierung 26
StreamWriter Konstruktor StreamWriter(Stream s) StreamWriter(String path) Funktion Schreibt Daten nach s gemäß UTF-8 (legt keine BOM an) Schreibt in Datei path (vgl. oben) Methode Write(String s) Write(Object o) Write(int i) WriteLine() WriteLine( ) Funktion Schreibt s ab aktueller Zeigerposition Schreibt Wert von o.tostring() Schreibt i in Dezimaldarstellung Schreibt Zeilenumbruch (\r\n) Vgl. Überladung Write mit anschließendem Zeilenumbruch 25.11.11 Sebastian Bendeich IO und Serialisierung 27