Praktikum aus Softwareentwicklung 2 Grundlegende Java Bibliotheken Praktikum aus Softwareentwicklung 2 Java Praktikum – SS 2009 – [email protected] 1 Praktikum aus Softwareentwicklung 2 Grundlegende Java-Bibliotheken • • • • Ein-/Ausgabe – Standard-IO, Streams, Files, ... Ausnahmebehandlung New IO – Character (En)Coding Reflection-Mechanismus, dynamisches Laden von Klassen – Dynamisch erweiterbare Programme Java Praktikum – SS 2009 – [email protected] 2 Praktikum aus Softwareentwicklung 2 Ein- und Ausgabe Datenströme • • Ein- und Ausgabe erfolgt ausschließlich über Streams Packages: java.io, java.nio, javax.image.io, javax.sound.midi liest Quelle Daten Datei, Speicher, Socket, … Programm Programm Ein Stream schreibt Daten Java Praktikum – SS 2009 – [email protected] Ziel 3 Praktikum aus Softwareentwicklung 2 Ein- und Ausgabe Datenströme • Unterteilung von Datenstrom Klassen nach: (1) dem verarbeiteten Datentyp Text: char Bytes: byte Java Praktikum – SS 2009 – [email protected] 4 Praktikum aus Softwareentwicklung 2 Ein- und Ausgabe Datenströme • Unterteilung von Datenstrom Klassen nach: (2) Lesend oder Schreibend Text: char IN Bytes: byte IN OUT OUT Java Praktikum – SS 2009 – [email protected] 5 Praktikum aus Softwareentwicklung 2 Ein- und Ausgabe Datenströme • Unterteilung von Datenstrom Klassen nach: (3) Verarbeitung oder Zugriff auf Medium Text: char IN Bytes: byte IN OUT OUT Java Praktikum – SS 2009 – [email protected] 6 Praktikum aus Softwareentwicklung 2 Eingabe - Reader Zugriff Verarbeitung Java Praktikum – SS 2009 – [email protected] 7 Praktikum aus Softwareentwicklung 2 Ausgabe - Writer Java Praktikum – SS 2009 – [email protected] 8 Praktikum aus Softwareentwicklung 2 Ein- und Ausgabe Character-Streams • • • Für Textverarbeitung ● Unicode-Unterstützung (UTF) Abstrakte Basisklassen: ● Reader ● Writer Reader/Writer – lesen/schreiben von Zeichen ● Java intern 2 Bytes pro Zeichen Java Praktikum – SS 2009 – [email protected] 9 Praktikum aus Softwareentwicklung 2 InputStream Java Praktikum – SS 2009 – [email protected] 10 Praktikum aus Softwareentwicklung 2 OutputStream Java Praktikum – SS 2009 – [email protected] 11 Praktikum aus Softwareentwicklung 2 Ein- und Ausgabe Byte-Streams • Abstrakte Basisklassen: ● InputStream ● OutputStream • Stream - lesen/schreiben Bytes Typische Verwendung ● Verarbeitung binärer Daten: Bilder, Sounds... ● Objektserialisierung • Java Praktikum – SS 2009 – [email protected] 12 Praktikum aus Softwareentwicklung 2 Ein- und Ausgabe InputStream • Basiert auf den Typ byte abstract public public public public public public public public public } class InputStream { int read(); int read(byte[] b); int read(byte[] b, int off, int len); int available(); void close(); void mark(int readlimit); boolean markSupported(); void reset(); long skip(int n); Java Praktikum – SS 2009 – [email protected] 13 Praktikum aus Softwareentwicklung 2 Ein- und Ausgabe Reader • Basiert auf den Typ char abstract class java.io.Reader { public int read(); public int read(char[] cbuf); public int read(char[] cbuf, int off, int len); protected Reader(); protected Reader(Object lock); public void close(); public void mark(int readAheadLimit); public boolean markSupported(); public void reset(); public long skip(long n); } Java Praktikum – SS 2009 – [email protected] 14 Praktikum aus Softwareentwicklung 2 Ein- und Ausgabe OutputStream • Schreibfunktionalität basierend auf dem Typ byte abstract public public public public public } • class java.io.OutputStream { OutputStream(); void close(); void write(int b); void write(byte[] b); void write(byte[] b, int off, int len); Bei write(int b) werden die 8 niederwertigsten Bits zur Darstellung des Bytes verwendet; die 24 höherwertigen Bits werden ignoriert – Bsp.: write(24272) geschrieben wird "208" 10111101 1010000 1011110 11010000 Java Praktikum – SS 2009 – [email protected] 15 Praktikum aus Softwareentwicklung 2 Ein- und Ausgabe Writer • Schreibfunktionalität basierend auf dem Typ char abstract class java.io.Writer { protected Writer(); protected Writer(Object lock); Niederwertige 16 bit; public abstract void close(); höherwertige 16 bit ignoriert public abstract void flush(); public void write(int c); public void write(char[] cbuf); public void write(char[] cbuf, int off, int len); public void write(String str); public void write(String str, int off, int len); } Java Praktikum – SS 2009 – [email protected] 16 Praktikum aus Softwareentwicklung 2 Ein- und Ausgabe File ● java.io.File ● Zugriff auf Verzeichnisse und Dateien ● Verzeichnis filtern: ● String[] list(); ● String[] list(FilenameFilter filter); ● File[] listFiles(FilenameFilter filter); Java Praktikum – SS 2009 – [email protected] 17 Praktikum aus Softwareentwicklung 2 Ein- und Ausgabe File • Zeichen aus sequentiell aus einer Datei lesen java.lang.Object | +-- java.io.Reader | +-- java.io.InputStreamReader | +-- java.io.FileReader • Stream wird erzeugt aus einem ● Dateinamen ● File-Objekt oder ● FileDescriptor-Object Java Praktikum – SS 2009 – [email protected] 18 Praktikum aus Softwareentwicklung 2 Ein- und Ausgabe File • In eine Datei schreiben java.lang.object | +-- java.io.Writer | +-- java.io.InputStreamWriter | +-- java.io.FileWriter • RandomAccessFile ● Positionieren in Dateien ● Art des Zugriffs wird beim Öffnen festgelegt (r, w, rw) Java Praktikum – SS 2009 – [email protected] 19 Praktikum aus Softwareentwicklung 2 Ein- und Ausgabe Textdatei kopieren import java.io.*; public class Copy { public static void main(String[] args) throws IOException { File inputFile = new File("input.txt"); File outputFile = new File("output.txt"); FileReader in = new FileReader(inputFile); FileWriter out = new FileWriter(outputFile); int c; while ((c = in.read()) != -1) // schlechte Performanz! out.write(c); in.close(); out.close(); } } Java Praktikum – SS 2009 – [email protected] 20 Praktikum aus Softwareentwicklung 2 Ein- und Ausgabe Binäre Daten kopieren import java.io.*; public class CopyBytes { public static void main(String[] args) throws IOException { File inputFile = new File("in.gif"); File outputFile = new File("out.gif"); FileInputStream in = new FileInputStream(inputFile); FileOutputStream out = new FileOutputStream(outputFile); int c; while ((c = in.read()) != -1) // schlechte Performanz! out.write(c); in.close(); out.close(); } } Java Praktikum – SS 2009 – [email protected] 21 Praktikum aus Softwareentwicklung 2 Ein- und Ausgabe Filter • • Komplexe Verarbeitung durch Kombination verschiedener Klassen Konstruktorverschachtelung: new InputStream_A ( new InputStream_B ( new InputStream_C (…))) … • Textuelle Darstellung von Daten: – PrintStream, PrintWriter • Bytekodierung von Daten: DataInput, DataOutput • Bufferung für mehr Performanz – – – BufferedInputStream BufferedOutputStream BufferedReader Java Praktikum – SS 2009 – [email protected] 22 Praktikum aus Softwareentwicklung 2 Ein- und Ausgabe Filter Kombination • Es soll typspezifisch und gepuffert von einer Datei gelesen werden: DataInputStream din = new DataInputStream ( new BufferedInputStream ( new FileInputStream ( aFile), 256)); … int nr = din.readInt(); … SYSTEM FileInputStream read () BufferedInputStream read () DataInputStream readInt() Java Praktikum – SS 2009 – [email protected] 23 Praktikum aus Softwareentwicklung 2 Ein- und Ausgabe Filter • Neue Funktionalität implementieren durch Ableiten – InputStream – Reader – OutputStream – Writer – • Alle Methoden überschreiben! Vorgefertigte Filter Klassen – – – FilterInputStream FilterReader… Methoden nach Bedarf überschreiben Java Praktikum – SS 2009 – [email protected] 24 Praktikum aus Softwareentwicklung 2 Ein- und Ausgabe Verwendung von Streams (1/3) • Dateien – – • ZIP – • FileReader / FileWriter FileInputStream / FileOutputStream ZipOutputStream zipFile; ZipEntry = zipEntry; zipFile.putNextEntry(zipEntry); // write to zip stream... zipFile.closeEntry(); Objektserialisierung – ObjectInputStream / ObjectOutputStream Java Praktikum – SS 2009 – [email protected] 25 Praktikum aus Softwareentwicklung 2 Ein- und Ausgabe Verwendung von Streams (2/3) • Speicher – Werden auf Arrays definiert • • – Speziell für Strings: • • CharArrayReader/CharArrayWriter ByteArrayInputStream/ ByteArrayOutputStream StringReader/StringWriter Pipe – Datenaustausch zwischen Threads – PipedReader/PipedWriter PipedInputStream/PipedOutputStream – Java Praktikum – SS 2009 – [email protected] 26 Praktikum aus Softwareentwicklung 2 Ein- und Ausgabe Verwendung von Streams (3/3) • • Datenkonvertierung – Primitive Datentypen in maschinen-unabhängigem Format Lesen bzw. Schreiben – DataInputStream / DataOutputStream Schreibfunktionalität für alle Datentypen – – • PrintWriter PrintStream Konvertierung zwischen Bytes und Characters – – InputStreamReader OutputStreamWriter Java Praktikum – SS 2009 – [email protected] 27 Praktikum aus Softwareentwicklung 2 Ein- und Ausgabe Lesen von der Konsole • Console seit Java 1.6 public static void main(String[] args) { String input; Console con; if ((con = System.console()) != null) { input = con.readLine( "Enter some text:\n"); con.writer().println( "You entered \"" + input + "\""); } } Java Praktikum – SS 2009 – [email protected] 28 Praktikum aus Softwareentwicklung 2 Ein- und Ausgabe Objektserialisierung (1/4) • • Binäres Abbild von Objekten ● Persistenz ● Datenübertragung (z.B. RMI) Serialisierung: ● FileOutputStream out = new FileOutputStream("theTime"); ObjectOutputStream s = new ObjectOutputStream(out); s.writeObject("Today"); s.writeObject(new Date()); s.flush(); Java Praktikum – SS 2009 – [email protected] 29 Praktikum aus Softwareentwicklung 2 Ein- und Ausgabe Objektserialisierung (2/4) • • Objektstrom ist mit einem FIFO-Puffer zu vergleichen, d.h. die Reihenfolge der Serialisierung bleibt erhalten Alle Objekte, die das Interface Serializable unterstützen, können serialisiert werden package java.io; public interface Serializable {}; • Serialisierbare Klasse: public class MySerializableClass implements Serializable { ... } Java Praktikum – SS 2009 – [email protected] 30 Praktikum aus Softwareentwicklung 2 Ein- und Ausgabe Objektserialisierung (3/4) • writeObject - Members und referenzierte Objekte – • readObject – • Ausnahme von als transient deklarierten Variablen: private transient String workingDirectory; FileInputStream in = new FileInputStream("day.obj"); ObjectInputStream s = new ObjectInputStream(in); String day = (String)s.readObject(); Date date = (Date)s.readObject(); transient – – Object: null, int: 0, boolean: false… Initialisierung mit Java Defaultwert Java Praktikum – SS 2009 – [email protected] 31 Praktikum aus Softwareentwicklung 2 Ein- und Ausgabe Objektserialisierung (4/4) • Serialisierte Klassen erhalten eine eindeutige ID – – • Wird vom Entwickler vergeben Mit Werkzeug serialver.exe kann diese abgefragt werden Beispiel C:\jdk1.6\bin> serialver java.lang.String static final long serialVersionUID = -6849794470754667710L; • JVM verwendet diese ID für Kompatibilitätscheck – Zum Beispiel bei über das Netzwerk übertragene Objekte (RMI, IIOP) Java Praktikum – SS 2009 – [email protected] 32 Praktikum aus Softwareentwicklung 2 Grundlegende Java-Bibliotheken • Ein-/Ausgabe – • • Ausnahmebehandlung New IO – • Standard-IO, Streams, Files, ... Character (En)Coding Reflection-Mechanismus, dynamisches Laden von Klassen – Dynamisch erweiterbare Programme Java Praktikum – SS 2009 – [email protected] 33 Praktikum aus Softwareentwicklung 2 Ausnahmebehandlung Exceptions • • Unterscheidung: schwerer Fehler (Error) vs. Ausnahme Elementarer Bestandteil der Sprache und der APIs – • throw, throws und try-catch-finally Vorteile des Java-Exceptionhandlings – – – Fehlerbehandlung getrennt vom "eigentlichen" Code "Weiterreichen" von Ausnahmen Gruppierung von Fehler-Typen Java Praktikum – SS 2009 – [email protected] 34 Praktikum aus Softwareentwicklung 2 Ausnahmebehandlung Klassen Object Exception Throwable … Error RuntimeException … VirtualMachineErro r … IndexOutOf BoundsException Java Praktikum – SS 2009 – [email protected] IOException … EOFExceptio n 35 Praktikum aus Softwareentwicklung 2 Ausnahmebehandlung Definition & Auslösung • Verwenden einer bestehenden Exception-Klasse Exception, RuntimeException, IllgegalArgumentException • ...oder neue Exceptions durch Ableiten class MyException extends Exception {} • 2 Konstruktoren: Default und mit Message MyException(String msg) { super(msg); } • „Werfen“ einer Exception: throw-Anweisung throw new MyException("ohje..."); Java Praktikum – SS 2009 – [email protected] 36 Praktikum aus Softwareentwicklung 2 Ausnahmebehandlung Behandlung (1/2) • Lokale Fehlerbehandlung try { ... } // Algorithmus catch(IOException ioexc) {...} catch(MYException myexc) {...} catch(Exception e) { System.out.println("Fehler: " + e.getMessage()); } finally {...} • finally-Blöcke werden immer ausgeführt, wichtig für Freigabe von Resourcen im Fehlerfall: … finally { if(outStream!=null) outStream.close(); } Java Praktikum – SS 2009 – [email protected] 37 Praktikum aus Softwareentwicklung 2 Ausnahmebehandlung Behandlung (2/2) • Weitergabe der Exception (back propagation) public void openFile(String fileName) throws FileNotFoundException { FileInputStream st = new FileInputStream(fileName); ... } • Kosten von Ausnahmebehandlung – – – Verwalten der notwendigen Objekte Implementieren der try und catch Blöcke Speicherbedarf nicht relevant Java Praktikum – SS 2009 – [email protected] 38 Praktikum aus Softwareentwicklung 2 Grundlegende Java-Bibliotheken • Ein-/Ausgabe – • • Ausnahmebehandlung New IO – • Standard-IO, Streams, Files, ... Character (En)Coding Reflection-Mechanismus, dynamisches Laden von Klassen – Dynamisch erweiterbare Programme Java Praktikum – SS 2009 – [email protected] 39 Praktikum aus Softwareentwicklung 2 New IO • Seit J2SDK 1.4, erweitert IO, – • java.nio Features – – – – – Buffers für primitive Datentypen Character-Set Encoders and Decoders Regular Expressions (java.util.regex) Channels - a new primitive I/O abstraction Verbindungen zu IO fähigen Entitäten (Files, Sockets) Dateischnittstellen für das Sperren von Dateien und Memory Mapped Files Java Praktikum – SS 2009 – [email protected] 40 Praktikum aus Softwareentwicklung 2 Character Sets • java.nio.charset – – • Definiert Zeichensätze, Kodier- und Dekodier- Werkzeuge für die Transformation von Text Charset – ASCII (7 Bit) ISO-8859-1 oder Latin-1 oder CP1252 (8 Bit) UTF-8, UTF-16, UTF-32 – Kodierungsvorschrift für Text – Jeder Zeichensatz besitzt einen eindeutig Namen (canonical) – RFC 2278: IANA Charset Registration Procedures: http://ietf.org/rfc/rfc2278.txt – A '\u0041' , 9 '\u0039' Java Praktikum – SS 2009 – [email protected] 41 Praktikum aus Softwareentwicklung 2 Java Character Coding • Strings immer in UTF-16 – • 2 Bytes für char Default Zeichensatz der JVM hängt vom OS ab: – – – Windows: CP1252 Linux RedHat 7.1: ISO-8859-15 Ubuntu: UTF8 Java Praktikum – SS 2009 – [email protected] 42 Praktikum aus Softwareentwicklung 2 Character Coding 1/3 • Codieren eines Strings in ISO-8859-1 ● String text = new String("Das Euro Symbol: €!"); byte byteArrIso[]; try { byteArrIso = text.getBytes("ISO-8859-1"); System.out.println("Orginal String: " + text); System.out.println("Bytes to ISO-8859-1: " + new String(byteArrIso)); } catch (UnsupportedEncodingException ue) { } Java Praktikum – SS 2009 – [email protected] 43 Praktikum aus Softwareentwicklung 2 Character Coding 2/3 • java.io.OutputStreamWriter extends Writer Filter: Character Streams zu Byte Streams Writer out = new BufferedWriter( new OutputStreamWriter( new FileOutputStream(outFile), "UTF-8")); • java.io.InputStreamReader extends Reader Filter: Byte Streams zu Character Streams Reader in = new BufferedReader( new InputStreamReader( new FileInputStream(inputFile), "UTF-8")); Java Praktikum – SS 2009 – [email protected] 44 Praktikum aus Softwareentwicklung 2 Character Coding 3/3 • Schreiben einer Datei String text = new String("Das Euro Symbol: €"); File outFile = new File("C:\\UTF-8.txt"); OutputStreamWriter outWriter = new OutputStreamWriter( new BufferedOutputStream( new FileOutputStream(outFile),4096), "UTF-8"); outWriter.write(text); • Lesen analog mit InputStreamReader Java Praktikum – SS 2009 – [email protected] 45 Praktikum aus Softwareentwicklung 2 Grundlegende Java-Bibliotheken • Ein-/Ausgabe – • • Ausnahmebehandlung New IO – • Standard-IO, Streams, Files, ... Character (En)Coding Reflection-Mechanismus, dynamisches Laden von Klassen – Dynamisch erweiterbare Programme Java Praktikum – SS 2009 – [email protected] 46 Praktikum aus Softwareentwicklung 2 Reflection Übersicht • Schnittstelle zwischen Anwendungsprogramm und virtueller Maschine – java.lang.reflect • Zugriff auf Metadaten von Klassen – Class Browser • Dynamische Änderung des Verhaltens zur Laufzeit – – – – • Erzeugen von Klassen und Feldern Zugriff und Modifikation von Objekten und auch Klassen Aufruf von Methoden Zugriff und Modifikation von Feldelementen Debugger Java Praktikum – SS 2009 – [email protected] 47 Praktikum aus Softwareentwicklung 2 Reflection Dynamisches Laden von Klassen • Klassen werden erst bei Bedarf geladen – – Automatisch durch die JVM Programmatisch, z.B.: if (Oracle database driver needed? ) Class.forName(“oracle.jdbc.driver.OracleDriver”); • System-ClassLoader lädt Klassen und Packages – – – • Umgebungsvariable CLASSPATH Verzeichnisse mit .class-Dateien und .jar-Archive Bei Applets auch via HTTP, siehe java.net.URLClassLoader Selbst definierte ClassLoader Java Praktikum – SS 2009 – [email protected] 48 Praktikum aus Softwareentwicklung 2 Reflection Dynamisches Laden, Metadaten • java.lang.Class Class c1 = Class.forName("java.util.Vector"); Class c2 = obj.getClass(); c1.getName(); Vector v = (Vector)c1.newInstance(); boolean b = Vector.class == Class.forName("java.util.Vector"); • java.lang.reflect Class s = c1.getSuperclass(); Class[] interf = s.getInterfaces(); Constructor[] con = s.getDeclaredConstructors(); Field[] fields = s.getDeclaredFields(); Method[] methods = s.getDeclaredMethods(); Java Praktikum – SS 2009 – [email protected] 49 Praktikum aus Softwareentwicklung 2 Reflection Nachteile • Performanz – • Sicherheit – • JVM kann nicht optimieren Security Management der JVM ermöglicht Einschränkungen – Laufzeitfehler (Applets…) Zugriff auf Internals – Aufruf/Ändern von private Methoden/Feldern Java Praktikum – SS 2009 – [email protected] 50 Praktikum aus Softwareentwicklung 2 Ende der 1. Übung Java Praktikum – SS 2009 – [email protected] 51