Java für Computerlinguisten 3. Bibliothek/Technisches Christian Scheible Institut für Maschinelle Sprachverarbeitung 29. Juli 2009 Christian Scheible Java für Computerlinguisten 29. Juli 2009 1 / 59 Heute: 1 Besprechung der Übungen vom Dienstag 2 Technisches 3 Klassenbibliothek Christian Scheible Java für Computerlinguisten 29. Juli 2009 2 / 59 Technisches • Classpath • Jar • Javadoc • JUnitTest • eclipse Christian Scheible Java für Computerlinguisten 29. Juli 2009 3 / 59 Classpath import java.util.*; import de.unistuttgart.ims.NeuerParser; Classpath • Unterschied zwischen den beiden Zeilen? • Wo findet Java die jeweiligen Pakete? → Classpath: Liste von Verzeichnissen, in denen Klassen/Pakete liegen Linux: Windows: Eclipse: setenv CLASSPATH=Verzeichnis1:Verzeichnis2 set CLASSPATH=Verzeichnis1;Verzeichnis2 Sehen wir morgen Christian Scheible Java für Computerlinguisten 29. Juli 2009 4 / 59 Jar Jar • Java Archive • Compilierte Klassen (.class) verbrauchen Platz • Jar fasst die Dateien zu einem Archiv zusammen → Übersichtlichkeit → Komprimierung → Informationen zum Inhalt werden mit eingepackt (z.B. Version) Christian Scheible Java für Computerlinguisten 29. Juli 2009 5 / 59 Jar Archiv erzeugen jar |{z} cvf Modifikator c f v t x m HelloWorld.jar {z } | Ziel HelloWorld.class | {z } Dateien zum Verpacken Archiv erzeugen jar-Datei schreiben Detailliertere Ausgabe Übersicht anzeigen Archiv auspacken Manifest Christian Scheible Java für Computerlinguisten 29. Juli 2009 6 / 59 Jar Jar ausführen java -jar HelloWorld.jar Woher weiß java, welche Klasse das Hauptprogramm enthält? → Manifest Christian Scheible Java für Computerlinguisten 29. Juli 2009 7 / 59 Jar Manifest • Enthält Informationen über Jar-Archiv • Main-Class: Welche Klasse enthält das Programm? Manifest.txt Main-Class: HelloWorld Archiv erzeugen jar cvmf Manifest.txt Christian Scheible HelloWorld.jar Java für Computerlinguisten HelloWorld.class 29. Juli 2009 8 / 59 Demo Christian Scheible Java für Computerlinguisten 29. Juli 2009 9 / 59 Javadoc Übersicht • Dokumentation ist wichtig! • Kommentare durchlesen ist mühsam • Javadoc kann HTML-Dokumentationen generieren → z.B. Java-Online-Dokumentation • Javadoc-Annotationen in Kommentaren vor Klasse, Interface, Methode (durch den zweiten * im Kommentarbeginn) /** * Schreibt ein <i>Wort</i> in eine <i>Datei</i> * * @param fileName Name der Ausgabedatei * @param wort Wort, das geschrieben werden soll * @return true wenn erfolgreich geschrieben, ansonsten false */ boolean writeToFile (String fileName, Word wort) { // ... } Christian Scheible Java für Computerlinguisten 29. Juli 2009 10 / 59 Javadoc Annotationen (Auszug) Tag @author @version @param @return @exception Ort Klassen, Interfaces Klassen, Interfaces Methoden, Konstruktoren Methoden Bedeutung Autor Version des Programms Funktionsparameter Rückgabewert Exceptions • Reihenfolge wie oben einhalten! • Beschreibung wird für alles generiert, was public ist Christian Scheible Java für Computerlinguisten 29. Juli 2009 11 / 59 Demo Christian Scheible Java für Computerlinguisten 29. Juli 2009 12 / 59 eclipse Übersicht • Entwicklungsumgebung • Projektmanagement • Syntax-/Semantik-Hilfe • Eclipse Cheat Sheet [1] Aufteilung • Workspace • Projekt • .java-Dateien • ... Christian Scheible Java für Computerlinguisten 29. Juli 2009 13 / 59 Demo Christian Scheible Java für Computerlinguisten 29. Juli 2009 14 / 59 Mehr? Apache Ant • Automatische Compilierung für große Java-Projekte • Ähnlich wie make JAD • Java-Decompiler • .class → java • Wird nicht mehr weiterentwickelt JUnit • Wichtig: Tut das Programm, was es soll? • Unit-Tests • Einfache Erstellung von Testfällen Christian Scheible Java für Computerlinguisten 29. Juli 2009 15 / 59 Datenstrukturen & Algorithmen • Listen • Assoziative Speicher (Maps) • Mengen • Algorithmen Christian Scheible Java für Computerlinguisten 29. Juli 2009 16 / 59 Klassenbibliothek • Beinhaltet viele zusätzliche Pakete, unter anderem • Datenstrukturen • Algorithmen • Vollständige Liste in der Java Documentation [2] Beispiele java.awt java.io java.lang java.net java.util java.swing javax.xml Christian Scheible Application Window Toolkit Dateiverarbeitung Standard-Paket (immer eingebunden) Internetverbindung Datenstrukturen, Datum/Zeit Grafische Benutzerinterfaces XML-Verarbeitung Java für Computerlinguisten 29. Juli 2009 17 / 59 Datenstrukturen • Verschiedene Behälter-Strukturen • Interfaces garantieren Standardfunktionen • Hinzufügen • Entfernen • ... • Generisch (können beliebige Referenztypen speichern) Collection Set Christian Scheible List Map Queue Java für Computerlinguisten 29. Juli 2009 18 / 59 Datenstrukturen • Warum Listen, warum nicht einfach Arrays? → Arrays haben feste Größe → Verkettete Liste für manche Anwendungen besser Listen • ArrayList • java.util.ArrayList • Array mit variabler Größe • Vergrößerung teuer • LinkedList • java.util.LinkedList • Verkettete Liste • Zugriff teuer Christian Scheible Java für Computerlinguisten 29. Juli 2009 19 / 59 Datenstrukturen Wichtige Methoden von Listen add(e) get(index) remove(index) clear() Element e hinzufügen Element an Stelle index abfragen Element an Stelle index löschen Leeren indexOf(e) contains(e) isEmpty() size() An welcher Stelle steht e? Ist e enthalten? Liste leer? Anzahl der Elemente iterator() toArray() Iterator zurückgeben Umwandlung in Array Christian Scheible Java für Computerlinguisten 29. Juli 2009 20 / 59 Datenstrukturen Beispiel: ArrayList ArrayList<Integer> liste = new ArrayList<Integer>(); liste.add(23); liste.add(42); liste.add(7); System.out.println(liste.size()); // 3 liste.remove(1); System.out.println(liste.size()); // 2 System.out.println(liste.get(1)); // 7 System.out.println(liste.indexOf(23)); // 0 System.out.println(liste.indexOf(1212)); // -1 Object[] zahlen = liste.toArray(); liste.clear(); System.out.println( liste.size() ); // 0 Christian Scheible Java für Computerlinguisten 29. Juli 2009 21 / 59 Datenstrukturen Beispiel: LinkedList LinkedList<Integer> liste = new LinkedList<Integer>(); // austauschbar liste.add(23); liste.add(42); liste.add(7); System.out.println(liste.size()); // 3 liste.remove(1); System.out.println(liste.size()); // 2 System.out.println(liste.get(1)); // 7 System.out.println(liste.indexOf(23)); // 0 System.out.println(liste.indexOf(1212)); // -1 Object[] zahlen = liste.toArray(); liste.clear(); System.out.println( liste.size() ); // 0 Christian Scheible Java für Computerlinguisten 29. Juli 2009 22 / 59 Datenstrukturen LinkedList<Integer> liste = new LinkedList<Integer>(); liste.add(23); liste.add(42); liste.add(7); // Alle Elemente ausgeben for (int i = 0; i < liste.size(); i++) System.out.println( liste.get(i) ); Was stimmt hier nicht? Christian Scheible Java für Computerlinguisten 29. Juli 2009 23 / 59 Datenstrukturen – Iterator Übersicht • java.util.Iterator; • for-Schleifen über Listen per Indizes schlecht → Verkettete Liste: Kann quadratischen Aufwand haben! ArrayList<Integer> liste = new ArrayList<Integer>(); liste.add(23); liste.add(42); liste.add(7); Iterator<Integer> iter = liste.iterator(); while ( iter.hasNext() ) System.out.println( iter.next() ); // Kurzform: for (Integer i: liste) System.out.println( i ); Christian Scheible Java für Computerlinguisten 29. Juli 2009 24 / 59 Datenstrukturen Map Speicherung von Schlüssel-Wert-Paaren • HashMap • java.util.HashMap • Hash-Tabelle mit Schlüsseln • TreeMap • java.util.TreeMap • Suchbaum über Schlüssel • LinkedHashMap • java.util.LinkedHashMap • Wie HashMap, aber speichert auch die Reihenfolge Christian Scheible Java für Computerlinguisten 29. Juli 2009 25 / 59 Datenstrukturen Wichtige Methoden von Maps put(k, v) get(k) remove(k) clear() Schlüssel k mit Wert v speichern Wert von Schlüssel k abfragen Eintrag für Schlüssel k löschen Leeren containsKey(k) containsValue(v) Gibt es den Schlüssel k? Gibt es den Wert v? isEmpty() size() Map leer? Anzahl der Elemente keySet() valueSet() entrySet() Menge aller Schlüssel Menge aller Werte Menge aller Schlüssel-Wert-Paare Christian Scheible Java füretwas Computerlinguisten Mengenoperatoren funktionieren umständlich. 29. Juli 2009 26 / 59 Datenstrukturen Beispiel: HashMap HashMap<String, Integer> alter = new HashMap<String, Integer>(); alter.put("Peter", 20); alter.put("Hans", 65); System.out.println( alter.get("Peter") ); // 20 System.out.println( alter.get("Michael") ); // null for ( Map.Entry entry: alter.entrySet() ) { System.out.println( entry.getKey() + "\t" + entry.getValue() ); } // Peter 20 // Hans 65 Funktioniert auch für TreeMap und LinkedHashMap Christian Scheible Java für Computerlinguisten 29. Juli 2009 27 / 59 Datenstrukturen Sets Mengen funktionieren mit den selben Strukturen wie Maps. Aber: Assoziiertes Element wird weggelassen. • HashSet • java.util.HashSet • Hash-Tabelle • TreeSet • java.util.TreeSet • Suchbaum • LinkedHashSet • java.util.LinkedHashSet • Wie HashSet, aber speichert auch die Reihenfolge Christian Scheible Java für Computerlinguisten 29. Juli 2009 28 / 59 Datenstrukturen Wichtige Methoden von Mengen add(e) remove(e) clear() Element e einfügen Element e löschen Leeren contains(e) isEmpty() size() Ist e enthalten? Menge leer? Anzahl der Elemente iterator() toArray() Iterator zurückgeben Umwandlung in Array Christian Scheible Java für Computerlinguisten 29. Juli 2009 29 / 59 Datenstrukturen Beispiel: Sets Set<Integer> s1 = new Set<Integer>(); Set<Integer> s2 = new Set<Integer>(); s1.add(1); s1.add(2); s2.add(2); s2.add(3) // Operationen (destruktiv) s1.containsAll(s2); // menge2 Teilmenge von menge1: false s1.addAll(s2); // s1 = Vereinigung von s1 und s2 s1.retainAll(s2); // s1 = Schnitt von s1 und s2 s1.removeAll(s2); // Asymmetrischer Schnitt Christian Scheible Java für Computerlinguisten 29. Juli 2009 30 / 59 Algorithmen Übersicht • Sortieren • Suchen • Sonstiges Christian Scheible Java für Computerlinguisten 29. Juli 2009 31 / 59 Algorithmen Sortieren • java.util.Collections.sort • Sortiert Listen (ähnlich zu java.util.Arrays.sort) • Implementierung: Merge-Sort List<Integer> zahlen = Arrays.asList(new Integer[] {15, 4, 8, 23, 42, 16 }); Collections.sort(zahlen); // 4, 8, 15, 16, 23, 42 Christian Scheible Java für Computerlinguisten 29. Juli 2009 32 / 59 Algorithmen Sortieren mit selbstgemachtem Vergleich • Interface: java.util.Comparator class StringLengthComparator implements Comparator { public int compare(Object o1, Object o2) { String s1 = (String) o1; String s2 = (String) o2; return s1.length() - s2.length(); } } List<String> woerter = Arrays.asList(new String[] {"laenger", "lang", "besonders lang"}); Collections.sort(woerter, new StringLengthComparator()); // "lang", "laenger", "besonders lang" Christian Scheible Java für Computerlinguisten 29. Juli 2009 33 / 59 Algorithmen Suchen • java.util.Collections.binarySearch • Binäre Suche • Voraussetzung: Liste ist sortiert List<String> zahlen = Arrays.asList(new Integer[] {4, 8, 15, 16, 23, 42}); Collections.binarySearch(zahlen, 23); // 4 Christian Scheible Java für Computerlinguisten 29. Juli 2009 34 / 59 Algorithmen Füllen • java.util.Collections.fill(list, e) • Setzt alle Elemente in list auf den Wert e Kopieren • java.util.Collections.copy(quelle, ziel) • Kopiert alle Elemente von der Quell-Liste in die Ziel-Liste Tauschen • java.util.Collections.swap(list, i1, i2) • Vertauscht die Elemente an den Stellen i1 und i2 Christian Scheible Java für Computerlinguisten 29. Juli 2009 35 / 59 Algorithmen Umdrehen • java.util.Collections.reverse(list) • Dreht die Liste um Mischen • java.util.Collections.shuffle(list) • Mischt list zufällig Frequenz • java.util.Collections.frequency(list, element) • Anzahl der Vorkommen von element in list Christian Scheible Java für Computerlinguisten 29. Juli 2009 36 / 59 Nützliche Klassen • Mathematik • Zufall • Dateien • Datum & Zeit • Internet Christian Scheible Java für Computerlinguisten 29. Juli 2009 37 / 59 Mathematik Übersicht • java.lang.Math (automatisch importiert) • Sammlung statischer Methoden und Konstanten • Die meisten Methoden für alle Zahlentypen verwendbar int i = Math.max(5, 4); float f = Math.max(5.5, 6.5); Christian Scheible Java für Computerlinguisten 29. Juli 2009 38 / 59 Mathematik abs(x) sin(x) cos(x) tan(x) log(x) pow(x, y) sqrt(a) max(x, y) min(x, y) random() Betrag Sinus Cosinus Tangens loge x xy √ a Maximum von x und y Minimum von x und y Zufallszahl 0 ≤ z < 1 PI E π ≈ 3.14... e ≈ 2.7182... Christian Scheible Java für Computerlinguisten 29. Juli 2009 39 / 59 Zufall Übersicht • java.util.Random • Pseudozufallszahlen • Wird in Math.random() benutzt Random generator = new Random(); Christian Scheible Java für Computerlinguisten 29. Juli 2009 40 / 59 Zufall Seed Seed ist Basis für Generierung neuer Zahlen: Random generator = new Random(9768687); Typen int z1 = generator.nextInt(); // 0 <= z1 < Integer.MAX_VALUE int z2 = generator.nextInt(10); // 0 <= z1 < 10 double z3 = generator.nextDouble(); Gauß-Verteilung Verteilung mit Erwartungswert 0, Standardabweichung 1: double g = generator.nextGaussian(); Christian Scheible Java für Computerlinguisten 29. Juli 2009 41 / 59 Dateiverarbeitung Übersicht • IO-Streams: java.io • Stream: • Folge von Daten • Sequenzieller Zugriff: • Ein Byte nach dem anderen • Ein Word nach dem anderen • Eine Zeile nach der anderen Christian Scheible Java für Computerlinguisten 29. Juli 2009 42 / 59 Dateiverarbeitung Testdatei schloss.txt Es war spät abends, als K. ankam. Das Dorf lag in tiefem Schnee. Vom Schloßberg war nichts zu sehen, Nebel und Finsternis umgaben ihn, auch nicht der schwächste Lichtschein deutete das große Schloß an. Lange stand K. auf der Holzbrücke, die von der Landstraße zum Dorf führte, und blickte in die scheinbare Leere empor. Christian Scheible Java für Computerlinguisten 29. Juli 2009 43 / 59 Dateiverarbeitung Byte-Stream einlesen • java.io.FileInputStream • Liefert den Inhalt der Datei byteweise • IOException behandeln! FileInputStream input = new FileInputStream("schloss.txt"); int b; while ((b = input.read()) != -1) { System.out.print((char) b); //Umwandlung in ein Zeichen } Problem: Es war sp~ At abends, als ... Christian Scheible Java für Computerlinguisten 29. Juli 2009 44 / 59 Dateiverarbeitung Character-Stream einlesen • java.io.FileReader • Liefert den Inhalt der Datei zeichenweise • IOException behandeln! FileReader in = new FileReader("schloss.txt"); int b; while ((b = in.read()) != -1) { System.out.print((char) b); } Ausgabe: Es war spät abends, als ... Christian Scheible Java für Computerlinguisten 29. Juli 2009 45 / 59 Dateiverarbeitung Character-Stream ausgeben • java.io.FileWriter • Schreibt zeichenweise in eine Datei IOException behandeln! FileWriter output = new FileWriter("ausgabe.txt"); String text = "Dieser Text kommt in die Datei." for (char c:text.toCharArray()) { output.write(c); } output.close(); Wichtig: Am Ende immer .close() aufrufen. Sonst können Daten verloren gehen. Christian Scheible Java für Computerlinguisten 29. Juli 2009 46 / 59 Dateiverarbeitung Zeilenweises Einlesen • Geht auch mit java.io.FileReader • Zusätzlich benötigt: java.io.BufferedReader BufferedReader input = new BufferedReader(new FileReader("schloss.txt")); String s; while ((s = input.readLine()) != null) { System.out.print(s.trim()); // Zeilenumbruch entfernen } Christian Scheible Java für Computerlinguisten 29. Juli 2009 47 / 59 Dateiverarbeitung Character BufferedReader FileReader schloss.txt Strings Streams können kombiniert werden. Christian Scheible Java für Computerlinguisten 29. Juli 2009 48 / 59 Dateiverarbeitung Zeilenweises Ausgeben • java.io.FileWriter • java.io.BufferedWriter BufferedWriter output = new BufferedWriter(new FileWriter("ausgabe.txt")); String z1 = "Zeile 1\n"; String z2 = "Zeile 2\n"; output.write(z1); output.write(z2); output.close() Christian Scheible Java für Computerlinguisten 29. Juli 2009 49 / 59 Dateiverarbeitung Scanner • java.util.Scanner • Liefert einzelne Wörter Scanner myScanner = new Scanner(new BufferedReader(new FileReader("schloss.txt"))); while (myScanner.hasNext()) System.out.println(myScanner.next()); myScanner.close(); Es war spät ... Christian Scheible Java für Computerlinguisten 29. Juli 2009 50 / 59 Dateiverarbeitung Puffer • BufferedReader und BufferedWriter verwenden Puffer zur Zwischenspeicherung • Festplattenzugriffe erfolgen nicht genau bei Aufruf von read() oder write() • Wir können die Puffer auch weglassen → Programm könnte langsamer werden Scanner new Scanner new bufferedScanner = Scanner(new BufferedReader(new FileReader("schloss.txt"))); unbufferedScanner = Scanner(new FileReader("schloss.txt")); Christian Scheible Java für Computerlinguisten 29. Juli 2009 51 / 59 Dateiverarbeitung Object Stream • java.io.ObjectInputStream • java.io.ObjectOutputStream • Schreibt Objekte in Dateien → z.B. Pickle in Python ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream("ausgabe.txt")); Date datum = new Date(); output.writeObject(datum); ObjectInputStream input = new ObjectInputStream(new FileInputStream("ausgabe.txt")); Date datum_in = (Date) input.readObject(); Christian Scheible Java für Computerlinguisten 29. Juli 2009 52 / 59 Usereingaben import java.io.*; class ReadLine{ public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.print("Dein Name: "); String userName = br.readLine(); System.out.println("Hallo, " + userName); } } InputStreamReader Konvertiert Byte-Streams vom System (z.B. stdin) zu char-Streams Christian Scheible Java für Computerlinguisten 29. Juli 2009 53 / 59 Netzwerk URL • java.net.URL • Zugriff auf Webseiten URL: http | {z } Protokoll Christian Scheible :// www.ims.uni-stuttgart.de/ | {z } Server Java für Computerlinguisten | scheibcn/ {z } Lokaler Pfad 29. Juli 2009 54 / 59 Netzwerk URL • java.net.URL • Zugriff auf Webseiten • Bei falschem Aufbau: MalformedURLException URL imsHomepage = new URL("http://www.ims.uni-stuttgart.de/"); // Relativer Pfad fuer // http://www.ims.uni-stuttgart.de/institut/anschrift.html.en URL imsAnfahrt = new URL(imsHomepage, "institut/anschrift.html.en"); URL imsAnfahrt2 = new URL("http://www.ims.uni-stuttgart.de/", "institut/anschrift.html.en"); Christian Scheible Java für Computerlinguisten 29. Juli 2009 55 / 59 Netzwerk URL URL kann einen Stream erzeugen URL imsHomepage = new URL("http://www.ims.uni-stuttgart.de/"); BufferedReader in = new BufferedReader( new InputStreamReader(imsHomepage.openStream())); String inputLine; while ((inputLine = in.readLine()) != null) System.out.println(inputLine); in.close(); Christian Scheible Java für Computerlinguisten 29. Juli 2009 56 / 59 Netzwerk Mehr • Apache HttpClient: Mehr Möglichkeiten für http-Zugriffe • Tomcat Webserver • TCP/UDP-Verbindungen Christian Scheible Java für Computerlinguisten 29. Juli 2009 57 / 59 Mehr? XML-Verarbeitung • Parser verfügbar als • DOM • Push • Pull • Verfügbar in java.xml Datenbanken • MySQL • PostgreSQL • SQLite • Oracle • Microsoft SQL • Microsoft Access Christian Scheible Java für Computerlinguisten 29. Juli 2009 58 / 59 Literatur Eclipse Cheat Sheet. http://weblogs.goshaky.com/weblogs/lars/resource/eclipse.pdf. Sun: JDK 6 Documentation. http://java.sun.com/javase/6/docs/. Sun: The Java Tutorials. http://java.sun.com/docs/books/tutorial/. C. Ullenboom. Java ist auch eine Insel. Galileo Press, 2003. http://openbook.galileocomputing.de/javainsel8/. Christian Scheible Java für Computerlinguisten 29. Juli 2009 59 / 59