Grundlegende Java Bibliotheken Java Praktikum SS 2009 Gerald.Ehmayer@borland.com 1
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 Gerald.Ehmayer@borland.com 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 Quelle Daten liest Programm Datei, Speicher, Socket, Ein Stream Programm schreibt Ziel Daten Java Praktikum SS 2009 Gerald.Ehmayer@borland.com 3
Ein- und Ausgabe Datenströme Unterteilung von Datenstrom Klassen nach: (1) dem verarbeiteten Datentyp Text: char Bytes: byte Java Praktikum SS 2009 Gerald.Ehmayer@borland.com 4
Ein- und Ausgabe Datenströme Unterteilung von Datenstrom Klassen nach: (2) Lesend oder Schreibend IN Text: char OUT IN Bytes: byte OUT Java Praktikum SS 2009 Gerald.Ehmayer@borland.com 5
Ein- und Ausgabe Datenströme Unterteilung von Datenstrom Klassen nach: (3) Verarbeitung oder Zugriff auf Medium IN Text: char OUT IN Bytes: byte OUT Java Praktikum SS 2009 Gerald.Ehmayer@borland.com 6
Eingabe - Reader Zugriff Verarbeitung Java Praktikum SS 2009 Gerald.Ehmayer@borland.com 7
Ausgabe - Writer Java Praktikum SS 2009 Gerald.Ehmayer@borland.com 8
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 Gerald.Ehmayer@borland.com 9
InputStream Java Praktikum SS 2009 Gerald.Ehmayer@borland.com 10
OutputStream Java Praktikum SS 2009 Gerald.Ehmayer@borland.com 11
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 Gerald.Ehmayer@borland.com 12
Ein- und Ausgabe InputStream Basiert auf den Typ byte abstract class InputStream { public int read(); public int read(byte[] b); public int read(byte[] b, int off, int len); public int available(); public void close(); public void mark(int readlimit); public boolean marksupported(); public void reset(); public long skip(int n); } Java Praktikum SS 2009 Gerald.Ehmayer@borland.com 13
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 Gerald.Ehmayer@borland.com 14
Ein- und Ausgabe OutputStream Schreibfunktionalität basierend auf dem Typ byte abstract class java.io.outputstream { public OutputStream(); public void close(); public void write(int b); public void write(byte[] b); public 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 Gerald.Ehmayer@borland.com 15
Ein- und Ausgabe Writer Schreibfunktionalität basierend auf dem Typ char abstract class java.io.writer { protected Writer(); } protected Writer(Object lock); public abstract void close(); 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); Niederwertige 16 bit; höherwertige 16 bit ignoriert Java Praktikum SS 2009 Gerald.Ehmayer@borland.com 16
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 Gerald.Ehmayer@borland.com 17
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 Gerald.Ehmayer@borland.com 18
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 Gerald.Ehmayer@borland.com 19
import java.io.*; Ein- und Ausgabe Textdatei kopieren 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 Gerald.Ehmayer@borland.com 20
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 Gerald.Ehmayer@borland.com 21
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 Gerald.Ehmayer@borland.com 22
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(); DataInputStream FileInputStream BufferedInputStream readint() read () SYSTEM read () Java Praktikum SS 2009 Gerald.Ehmayer@borland.com 23
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 Gerald.Ehmayer@borland.com 24
Dateien ZIP Ein- und Ausgabe Verwendung von Streams (1/3) FileReader / FileWriter FileInputStream / FileOutputStream ZipOutputStream zipfile; ZipEntry = zipentry; zipfile.putnextentry(zipentry); // write to zip stream... zipfile.closeentry(); Objektserialisierung ObjectInputStream / ObjectOutputStream Java Praktikum SS 2009 Gerald.Ehmayer@borland.com 25
Speicher Ein- und Ausgabe Verwendung von Streams (2/3) Werden auf Arrays definiert CharArrayReader/CharArrayWriter ByteArrayInputStream/ ByteArrayOutputStream Speziell für Strings: StringReader/StringWriter Pipe Datenaustausch zwischen Threads PipedReader/PipedWriter PipedInputStream/PipedOutputStream Java Praktikum SS 2009 Gerald.Ehmayer@borland.com 26
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 Gerald.Ehmayer@borland.com 27
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 Gerald.Ehmayer@borland.com 28
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 Gerald.Ehmayer@borland.com 29
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 Gerald.Ehmayer@borland.com 30
Ein- und Ausgabe Objektserialisierung (3/4) writeobject - Members und referenzierte Objekte Ausnahme von als transient deklarierten Variablen: private transient String workingdirectory; readobject 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 Gerald.Ehmayer@borland.com 31
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 Gerald.Ehmayer@borland.com 32
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 Gerald.Ehmayer@borland.com 33
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 Gerald.Ehmayer@borland.com 34
Ausnahmebehandlung Klassen Object Throwable Exception Error RuntimeException IOException VirtualMachineErro r IndexOutOf BoundsException EOFExceptio n Java Praktikum SS 2009 Gerald.Ehmayer@borland.com 35
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 Gerald.Ehmayer@borland.com 36
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 Gerald.Ehmayer@borland.com 37
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 Gerald.Ehmayer@borland.com 38
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 Gerald.Ehmayer@borland.com 39
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 Gerald.Ehmayer@borland.com 40
java.nio.charset Definiert Zeichensätze, Character Sets 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 Gerald.Ehmayer@borland.com 41
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 Gerald.Ehmayer@borland.com 42
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 Gerald.Ehmayer@borland.com 43
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 Gerald.Ehmayer@borland.com 44
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 Gerald.Ehmayer@borland.com 45
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 Gerald.Ehmayer@borland.com 46
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 Gerald.Ehmayer@borland.com 47
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 Gerald.Ehmayer@borland.com 48
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 Gerald.Ehmayer@borland.com 49
Reflection Nachteile Performanz JVM kann nicht optimieren Sicherheit Security Management der JVM ermöglicht Einschränkungen Laufzeitfehler (Applets ) Zugriff auf Internals Aufruf/Ändern von private Methoden/Feldern Java Praktikum SS 2009 Gerald.Ehmayer@borland.com 50
Ende der 1. Übung Java Praktikum SS 2009 Gerald.Ehmayer@borland.com 51