Prog. 1 Prog. 1 Wiederholung Türme von Hanoi (rekursiv) • Was passiert beim Aufruf von hanoi(3,1,2,3)? Algorithmus hanoi(3,1,2,3) – Trivialer Fall: Nur eine Scheibe (n=1) – Problemzerlegung: Mehrere Scheiben (n>1) • Bewege Scheibe von Quelle nach Ziel 1. Bewege Turm aus den n-1 obersten Scheiben zum Arbeitsbereich hanoi(2,1,3,2) 2. Bewege n-te Scheibe zum Ziel 4.! Bewege Scheibe ! von 1 nach 3 hanoi(2,2,1,3) 3. Bewege Turm aus n-1 obersten Scheiben vom Arbeitsbereich zum Ziel • 2.! Bewege Scheibe ! von 1 nach 2 Umsetzung in Java static void hanoi(int n, int src, int work, int dest ) { if(n>1) hanoi(n-1, src, dest, work); System.out.println("Bewege Scheibe von “+src+" nach "+dest); if(n>1) hanoi(n-1, work, src, dest); } 16.12.2008 FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke 1 Prog. 1 hanoi(1,1,2,3) hanoi(1,3,1,2) hanoi(1,2,3,1) hanoi(1,1,2,3) 1. Bewege Scheibe ! von 1 nach 3 3.! Bewege Scheibe ! von 3 nach 2 5.! Bewege Scheibe ! von 2 nach 1 7.! Bewege Scheibe ! von 1 nach 3 16.12.2008 FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke 2 Prog. 1 Türme von Hanoi (iterativ) • 6.! Bewege Scheibe ! von 2 nach 3 Türme von Hanoi (iterativ II) Iterativer Algorithmus von Bunemann und Levy (1980) – 1 6 11 16.12.2008 • Wiederhole solange, bis der gesamte Stapel auf der Zielstange ist Variation des Algorithmus von Bunemann und Levy – Wiederhole solange, bis der gesamte Stapel auf der Zielstange ist 1. Setzte die kleinste Scheibe auf die Stange rechts von ihr (bzw. die erste Stange) 1. Setzte die kleinste Scheibe zwei Scheiben nach rechts (modulo 3) 2. Setzte die zweitkleinste Scheibe auf die einzig mögliche Stange 2. Setzte die zweitkleinste Scheibe auf die einzig mögliche Stange 2 7 12 3 8 13 4 9 14 FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke 5 1 2 3 4 5 6 7 8 10 15 3 16.12.2008 FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke 4 Prog. 1 Prog. 1 Türme von Hanoi (iterativ in Java) Weiteres Beispiel für Rekursion (Quick Sort) • static void hanoiIterative(int n) { int [][] bars = new int[3][n+1]; int [] last = {n, 0, 0}; // src, work, dest bar // start configuration int pS=0, pos1, pos2, step = 2; • // smallest disc on source for (int i=0; i<n+1; ++i) bars[0][i] = n+1-i; // (n+1 avoid tests) bars[1][0] = n+1; bars[2][0] = n+1; // init work & dest while(bars[2][n]!=1) { System.out.printf("Smallest disc from %d to %d\n", pS, (pS+step)%3); bars[pS][last[pS]--] = 0; pS = (pS+step)%3; Der Quicksort-Algorithmus ist eines der schnellsten und zugleich einfachsten Sortierverfahren Der Algorithmus ist vom Typ: „Teile und Herrsche“: – Eingabe: Eine unsortiertes Array a[0],...,a[n-1] mit n Elementen – Herrsche: 1. 2. 3. // smallest disc to the right bars[pS][++last[pS]] = 1; pos2 = (bars[(pS+1)%3][last[(pS+1)%3]]>bars[(pS+2)%3][last[(pS+2)%3]]) ? (pS+2)%3 : (pS+1)%3; pos1 = 2*(pS+pos2) % 3; Wähle ein (beliebiges) Element x aus dem Feld a Setze i=0 und j =n-1 Wiederhole solange i<=j • Suche von links das erste Element a[i] mit x<=a[i] • • // disc to only possible place – if (bars[pos1][last[pos1]] != bars[pos2][last[pos2]]) { System.out.printf("-------> Disc from %d to %d\n", pos2, pos1); bars[pos1][++last[pos1]] = bars[pos2][last[pos2]]; Suche von rechts das erste Element a[j] mit a[j]<=x Falls i<j vertausche a[i] und a[j] und setze i = i+1 und j = j-1 Teile: 1. Behandle rekursiv die beiden Teilfolgen a[0],...,a[j] und a[i],...,a[n-1] 2. Die Rekursion endet, wenn eine Teilfolge die Länge 1 hat bars[pos2][last[pos2]--] = 0; – } Ausgabe: Das sortierte Array } FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke 16.12.2008 5 Prog. 1 Aufwand: Beispiel – Ungünstigster Fall • Das ein Teilstück besteht immer nur aus einem Element und das Andere aus den restlichen Elementen Für die Praxis schnellstes Verfahren x j 47 15 18 1 15 3 15 15 18 1 47 i 1 j 18 i j 15 x j i x 3 15 1 18 15 3 i,x 3 2. Rekursion: 15 i i 1. Rekursion: • In jeder Schicht müssen n Elemente behandelt werden • Anzahl Operationen: O(n·log2(n)) • Bei einem Feld mit 1000 Einträgen sind dies etwa 10.000 Operationen i 3 3 – Günstiger Fall (im Durchschnitt): • Alle im Verlauf der Rekursion auftretenden Teilstücke sind in gleich lang • Dann ist die Rekusionstiefe log2(n) Quick Sort (in Java) j ! • Dann ist die Rekursionstiefe n-1 • Anzahl Operationen: O(n2) • Bei einem Feld mit 1000 Einträgen sind dies 1.000.000 Operationen • 6 Prog. 1 Aufwand und Beispiel • FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke 16.12.2008 i 1 j j 15 i i 15 j 15 j j 18 47 47 i j 1 47 15 i,x j 18 47 i j i, j 1 3 18 j i j int x = a[(left+right)/2]; ! int i = left, j = right; ! int tmp; ! while(i <= j) { ! while(a[i] < x) i++; ! while(a[j] > x) j--; ! if(i <= j) { ! tmp=a[i]; a[i]=a[j]; a[j]=tmp; // swap a[i] and a[j] ! ! i++; ! ! FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke j--; ! } } 47 ! i if(left < j) quickSort(a, left, j); ! ! 16.12.2008 static void quickSort(int a[], int left, int right) { ! 7 16.12.2008 if(i < right) quickSort(a, i, right); } FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke 8 Prog. 1 Prog. 1 (Datei-)Eingabe bzw. Ausgabe • In der Praxis werden Daten häufig nicht von der Tastatur sondern aus Dateien oder Datenbanken gelesen • Ebenso werden Daten häufig nicht auf dem Bildschirm ausgegeben sondern in Dateien oder Datenbanken geschrieben • Der Umgang mit Daten/Dateien erfolgt in Java mittels Streams • Die Klasse Scanner Die Klasse Scanner verarbeitet Eingaben (von Tastatur und aus Datei) – Muss vor dem Benutzen importiert werden ! import java.util.Scanner; – Anschließend muss ein Objekt der Klasse Scanner kreiert werden ! Programmieren 2 • Scanner keyboard = new Scanner(System.in); • System.in beschreibt den Standard-Eingabestrom des Systems – Methoden wie next() bzw. nextInt() oder nextDouble() lesen ein Wort bzw. einen Wert vom Typ int oder double ein Seit Java 1.5 gibt es die Klassen Scanner und Formatter mit denen sich (Datei-)Ein- und Ausgaben kompfortabel(er) realisieren lassen • Vollständige API-Dokumentation unter http://java.sun.com/j2se/1.5.0/docs/api/java/util/Scanner.html FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke 16.12.2008 Prog. 1 9 Prog. 1 Die Klasse Scanner (Beispiel) import java.util.Scanner; 16.12.2008 • Scanner verfügbar machen public class ScannerDemo { public static void main(String[] args) { Scanner keyboard = new Scanner(System.in); int row = keyboard.nextInt(); 10 Einige Methoden von Scanner Methoden zur Einlesen von primitiven Datentypen – nextBoolean(), nextByte(), nextDouble(), nextFloat(), nextInt(), nextLong(), nextShort() Eingabe(Objekt) erzeugen System.out.print("Bitte geben Sie zwei Zahlen ein: "); int col = keyboard.nextInt(); FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke • Ganze Zahlen (getrennt durch Whitespaces) einlesen Methode zum Einlesen der nächsten Zeichen bis zum ersten Trennzeichen – next() for (int i = 0; i < col; i++) { – Liefert einen String – Default-Trenner sind Whitespaces for (int j = 0; j < row; j++) System.out.print("*"); System.out.println(); } } } Beispieldialog A: Beispieldialog B: Bitte geben Sie zwei Zahlen ein: 2 3 *** *** Bitte geben Sie zwei Zahlen ein: 2 3 *** *** • – nextLine() – Zeilenumbruchzeichen ‘\n‘ wird gelesen und entfernt; ist nicht im String enthalten – Enthält einen Zeile nichts ausser dem Zeilenumbruchzeichen, wird ein leerer String zurückgegeben • Trennung durch Whitespaces, z.B. Blank(s), Tab(s), Zeilenumbruch 16.12.2008 FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke Methode zum Einlesen einer Zeile 11 16.12.2008 FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke 12 Prog. 1 • Prog. 1 Scanner und andere Input-Trenner Lokalisierung Die Symbole, die die Eingabe trennen, können geändert werden • – useDelimiter() – Darstellung von Kommazahlen ist z.B. regional unterschiedlich import java.util.Scanner; public class DelimiterDemo { public static void main(String[] args) { Scanner keyboardA = new Scanner(System.in); Scanner keyboardB = new Scanner(System.in); keyboardB.useDelimiter("#"); System.out.println("Geben Sie Textzeile eins ein: "); String stringA1 = keyboardA.next(); String stringA2 = keyboardA.next(); System.out.println("Text 1.1: "+stringA1); System.out.println("Text 1.2: "+stringA2); System.out.println("Geben Sie Textzeile zwei ein: "); String stringB1 = keyboardB.next(); String stringB2 = keyboardB.next(); Beispiel: System.out.println("Text 2.1: "+stringB1); System.out.println("Text 2.2: "+stringB2); Geben Sie Textzeile eins ein: a b#c# } Text 1.1: a } Text 1.2: b#c# import java.util.Scanner; import java.util.Locale; public class LocaleDemo { public static void main(String[] args) {! System.out.println("Current Locale: "); System.out.println(Locale.getDefault().getCountry()); Geben Sie Textzeile zwei ein: a b#c# Text 2.1: a b Text 2.2: c FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke 16.12.2008 Prog. 1 • 13 Mit Hilfe Klasse Locale kann ein Java Programm an regionale Besonderheiten angepasst werden } } 16.12.2008 Ausgabe: System.out.println(Locale.getDefault().getDisplayCountry()); Current Locale: DE System.out.println(Locale.getDefault().getLanguage()); Deutschland System.out.println(Locale.getDefault().getDisplayLanguage()); de Deutsch System.out.println(Locale.getDefault().getDisplayName());! Deutsch (Deutschland) Locale[] available = Locale.getAvailableLocales(); English Arabic Locale.setDefault(Locale.ENGLISH); . System.out.println(Locale.getDefault().getDisplayName()); . . for (Locale l: available) Norwegian System.out.println(l.getDisplayName()); . . . English FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke 14 Prog. 1 Scanner und Lokalisierung Pfadangaben Wie die Trennsymbole können beim Scanner auch andere (lokale) Eigenschaften (z.B. Darstellung von Dezimalzahlen) geändert werden • import java.util.Scanner; Pfadangaben zu Dateien können relativ oder absolut erfolgen • Beispiele relativer Pfadangaben – Unix ! ../name.txt – Relative Pfadangabe public class ScannerDecDemo { public static void main(String[] args) { Korrekte Eingabe ist: – Windows ! ..\name.txt • Die Angaben beziehen sich auf das aktuelle Verzeichnis, in dem die Anwendung aufgerufen wird 1,2 Scanner keyboard = new Scanner(System.in);! System.out.print("Bitte Zahl eingeben: "); double dNumber = keyboard.nextDouble(); System.out.println(dNumber); } } import java.util.*; – Absolute Pfadangabe Bitte geben Sie eines Zahl ein: 1.2 • Die Angaben beziehen sich auf das Wurzelverzeichnis des Dateisystems Exception in thread "main" java.util.InputMismatchException at java.util.Scanner.throwFor(Scanner.java:819) at java.util.Scanner.next(Scanner.java:1431) at java.util.Scanner.nextDouble(Scanner.java:2335) at ScannerDecimalDemo.main(ScannerDecimalDemo.java:9) public class ScannerDecDemo2 { keyboard.useLocale(Locale.ENGLISH);! Beispiele absoluter Pfadangaben – Unix ! /usr/irgendjemand/name.txt – Windows ! z:\java\daten\name.txt public static void main(String[] args) { Scanner keyboard = new Scanner(System.in); • Lokalisierung des Scanners System.out.print("Bitte Zahl eingeben: "); double dNumber = keyboard.nextDouble(); System.out.println(dNumber); } } 16.12.2008 Bitte geben Sie eines Zahl ein: 1.2 1.2 FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke 15 16.12.2008 FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke 16 Prog. 1 Die Klasse Properties • Über das Konzept der Properties kann in Java auf System-Eigenschaften zugegriffen werden • Jede Eigenschaft besitzt einen eindeutigen Namen, unter dem auf sie zugegriffen werden kann • • String[] s = {“java.version“, “file.separator“, public static String getProperty(String key, String default) • 16.12.2008 • println(System.getProperty(s[i])); } Wie 1., jedoch Rückgabe von default anstatt null, falls keine Eigenschaft key Programm-Ausgabe 1.5.0_06 .../JavaVM.framework/Versions/1.5.0/Home Mac OS X 10.4.8 / : FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke Die Klasse File (aus java.io) Objekte der Klasse File können foglendermassen erzeugt werden – public File(String pathname) • Konstruiert File-Objekte zum Dateioder Verzeichnisnamen – public File(String parent, String child) • Getrennte Übergabe von Verzeichnisund Datei-Namen – public File(File parent, String child) • Wie 2. jedoch Übergabe von FileObjekt anstatt Verzeichisnamen import java.util.*; public class PrintProperties { public static void main(String[] a) { Properties sProps = System.getProperties(); Enumeration propNs = sProps.propertyNames(); while(propNs.hasMoreElements()){ String propN = (String) propNs.nextElement(); System.out.println(propN + “=“ + System.getProperty(propN)); } } } Details: Programmieren II 17 16.12.2008 Prog. 1 FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke • boolean isDirectory() • boolean isFile() • boolean canRead() • boolean canWrite() – File f1 = new File(“TestDatei.txt“); – /* Unter DOS muss der Backslash – doppelt angegeben werden, da er gleichzeitig Escape-Zeichen für Strings ist. */ – File f2 = new File(“c:\\documents\\docu.doc“); • • Liefert Datei-/Verzeichnis-Namen Liefert ein String-Array mit den } Namen der Dateien/Verzeichnisse im, durch f bezeichneten, Verzeichnis } boolean exists() – Liefert true, wenn f existiert long length() – 16.12.2008 import java.io.*; public class VerzeichnisInfo { public static void main(String[] args) { File fod = new File("."); Out.println("Name : "+fod.getName()); Out.println("Pfad : "+fod.getPath()); Out.println(“Pfad voll : "+fod.getAbsolutePath()); Out.println("Schreiben : "+fod.canWrite()); Out.println("Lesen : "+fod.canRead()); Out.println("File : "+fod.isFile()); Liefert true, wenn in f geschrieben werden kann String[] list() File(“/usr/testusr“); 19 Liefert true, wenn f lesbar ist • – File f5 = new Liefert true, wenn f File ist String getName() File(“.“,“Beispiel.java“); File f4 = new Liefert true, wenn f Verzeichnis ist • – File f3 = new 18 Methoden der Klasse File f ist ein File-Objekt: /* Beispiele für gültige KonstruktorAufrufe */ import java.io.*; FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke // Für Properties und Enumerator Nebenstehendes Beispiel liefert alle verfügbaren SystemProperties File(f4,“FileExample.java“); 16.12.2008 /* Auflisten aller verfügbaren SystemProperties*/ – sowohl system-abhängige als auch system-unabhängige Die Klasse File – stellt eine Abstraktion einer Datei bzw. eines Verzeichnisses dar – behandelt nicht den Inhalt einer Datei, sondern abstrahiert Name und Zugriffspfad • • } } Die Methode getProperties liefert das Properties-Objekt mit den System-Properties Die Methode propertyNames erzeugt einen Enumerator mit dem – durch Aufruf von getProperty der zugehörige Wert ermittelt werden kann for(int i=0; i<s.length; ++i) { System.out. Liefert Eigenschaften mit Name key Die Methode getProperties – alle Schlüsselwerte durchlaufen werden können “path.separator“, “line.separator“}; Zugriff auf einzelne Properties – • “java.home“, “os.name“, “os.version“, Zugriff auf Systemeigenschaften in Java über die Klasse Properties (abgeleitete von Hashtable) • • // Zugriff auf System-Properties public class PrintProperty { public static void main(String[] a){ 1. public static String getProperty(String key) Prog. 1 Prog. 1 Liefert die Anzahl Bytes in f if(fod.isDirectory()) { Out.println("Directory : "+fod.isDirectory()); String flist[] = fod.list(); for(int i=0; i<flist.length; ++i) Out.println("-- "+flist[i]); } ProgrammAusgabe: Name : . Pfad : . Pfad voll : .../workspace/FileTest/. Schreiben : true Lesen : true File : false Directory : true -- .classpath -- .project -- VerzeichnisInfo.class -- VerzeichnisInfo.java FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke 20 Prog. 1 Prog. 1 Einlesen aus einer Datei • • Schreiben in eine Datei • Die Klasse Scanner kann auch zum Einlesen von Daten aus einer Datei verwendet werden Beispiel Einlesen der Datei “datei.dat“ mit den Werten 47 11 0 8 15 import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; public class FileScannerDemo { public static void main(String[] args) throws FileNotFoundException { String filename = "datei.dat"; File file = new File(filename); Scanner sc= new Scanner(file); while (sc.hasNextInt()) { int zahl = sc.nextInt(); System.out.println(zahl); } sc.close(); } } 16.12.2008 • import java.io.File; import java.io.FileNotFoundException; import java.util.Formatter; Es kann sein, dass die Datei nicht existiert! (Details über Exceptions in Programmieren II) public class FileFormatterDemo { public static void main(String[] args) throws FileNotFoundException { String filename = "datei.dat"; File file = new File(filename); Formatter f = new Formatter(file); f.format("%d %d %d %d %d\n",47,11,0,8,15); f.close(); } } Solange noch Daten vorhanden sind Schließe die Datei FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke 21 Prog. 1 16.12.2008 Es kann sein, dass die Datei nicht erstellt werden kann! (Details über Exceptions in Programmieren II) Schreibe Daten formatiert in die Datei Schließe die Datei FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke 22 Prog. 1 Dateioperationen (Beispiel 1) • Um Daten in eine Datei zu schreiben kann die Klassen Formatter verwendet werden Beispiel Die Werte 47 11 0 8 15 in die Datei “datei.dat“ schreiben Dateioperationen (Beispiel 2) Schreiben Sie ein Programm Read, das eine Datei zeilenweise einliest und auf dem Bildschirm ausgibt. Der Name der Datei soll als Komandozeilen-Parameter übergeben werden import java.io.File; import java.io.FileNotFoundException; import java.util.*; public class Copy { public static void main(String[] args) throws FileNotFoundException{ if (args.length < 2) { System.out.println("usage: java Copy inFile outFile"); System.exit(-1); } Scanner input = new Scanner(new File(args[0])); Formatter output = new Formatter(new File(args[1])); while(input.hasNextLine()) { String line = input.nextLine(); output.format(line); } input.close(); output.close(); } } class Read { public static void main(String[] args) throws FileNotFoundException { if (args.length == 0) { System.out.println(“usage: java Read filename"); System.exit(-1); } Scanner sc = new Scanner(new File(args[0])); while(sc.hasNextLine()) { String line = sc.nextLine(); System.out.println(line); } sc.close(); } FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke Schreiben Sie ein Programm Write, das eine Datei zeilenweise einliest und in eine andere Datei ausgibt. Die Namen der Dateien soll als Komandozeilen-Parameter übergeben werden ! import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; 16.12.2008 • 23 16.12.2008 FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke 24 Prog. 1 Prog. 1 Dateioperationen (Beispiel 3) • Beliebte Fehler (Öffnen nicht existierender Dateien) • Schreiben Sie ein Programm Add, das alle Zahlen in einer Datei aufaddieren Wird eine nicht existierende Datei geöffnet, wird eine FileNotFoundException ausgelöst – Mittels try ... catch kann dies abgefangen werden import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; public class Add { public static void main(String[] args) throws FileNotFoundException{ if (args.length == 0) { System.out.println("usage: java Add filename"); System.exit(-1); } Versuch eine Datei zu öffnen public class FileNotFoundDemo { und einen Scanner zu public static void main(String[] args) { verwenden String filename = "test.dat";! try { Scanner sc = new Scanner(new File(filename)); Scanner sc = new Scanner(new File(args[0])); double sum=0; while(sc.hasNextDouble()) sum += sc.nextDouble(); sc.close(); // do anything! ! ! Wenn Datei nicht vorhanden sc.close(); dann gib Meldung aus // do anything else } catch (FileNotFoundException e) { System.out.println("File "+filename+ " does not exist"); } System.out.println(“Summe: “+sum); } } } } 16.12.2008 FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke 25 Prog. 1 Beliebte Fehler (Überschreiben existierender Dateien) • • Wird eine existierende Datei geöffnet, dann wird die alte Datei - ohne vorherige Warnung - zuerst gelöscht Versehentliches Überschreiben einer Datei kann mittels file.exists() verhindert werden import java.io.File; import java.io.FileNotFoundException; import java.util.Formatter; public class NoOverideFileDemo { public static void main(String[] args) { String filename = "test.dat"; File file = new File(filename); if (file.exists()) { System.out.println("File "+filename+" already exists"); } else { try { Formatter f = new Formatter(file); f.format("%d %d %d %d %d\n",47,11,0,8,15); f.close(); } catch (FileNotFoundException e) { System.out.println("File "+filename+ " does not exist"); } } } } 16.12.2008 FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke 27 16.12.2008 FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke 26