Praktikum aus Softwareentwicklung 2

Werbung
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
Herunterladen