Arbeitsblatt 7 – EAD II - Dateiarbeit Daten kann man, statt als Parameter oder über die Konsole, auch aus Dateien einlesen und in Dateien abspeichern. Dateien sind durch einen Dateinamen und den Pfad, unter dem sie auf dem Computer zu finden sind, gekennzeichnet. Verwenden Sie die die Klasse FileDialog für die Übergabe von Dateinamen und –pfad (siehe Handbuch http://www.dpunkt.de/java/Referenz/Das_Paket_java.awt/50.html ). “Die Klasse FileDialog implementiert einen Dialog, mit dem Dateien ausgewählt werden können. Der FileDialog kennt zwei Modi: LOAD, um Dateien zum Laden zu selektieren, und SAVE, um Dateien zu speichern. Es kann ein Filter für die anzuzeigenden Dateinamen gesetzt werden, so dass nur die Dateien angezeigt werden, deren Name auf den Filter passt. Der FileDialog ist grundsätzlich modal.” Beispiel (Ausschnitt): FileDialog dialog = new FileDialog(new Frame(), "Datei öffnen", FileDialog.LOAD); dialog.setVisible(true); if (dialog.getFile() == null) return; datei = new File(dialog.getDirectory(),dialog.getFile()); Hier wird zuerst die Variable “dialog” deklariert, dann der Dialog angezeigt. Es wird abgefragt, ob der Nutzer wirklich eine Datei ausgewählt hat, falls er “Abbrechen” geklickt hat, wird hier auch die Methode verlassen. Schließlich wird die Dateivariable entsprechend der ermittelten Parameter deklariert. Niun kann auf die Datei zugegriffen werden. Hier folgt das Beispiel aus der Übung zur Konsoleneingabe (einAus()), aber nun werden die über die Konsole eingegebenen Namen nicht auf die Konsole, sondern in eine Datei ausgegeben). public void inDateiSchreiben() { File datei; FileDialog dialog = new FileDialog(new Frame(), "Datei speichern", FileDialog.SAVE); dialog.setVisible(true); if (dialog.getFile() == null) return; datei = new File(dialog.getDirectory(),dialog.getFile()); String name; try { BufferedReader konsoleneingabe = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter dateiausgabe = new BufferedWriter(new FileWriter(datei)); System.out.println("Es sollen Namen eingegeben werden. Zum Beenden bitte ende eingeben."); name = konsoleneingabe.readLine(); while (name.compareTo("ende") != 0) { dateiausgabe.write(name); dateiausgabe.newLine(); System.out.println("Bitte Namen eingeben:"); name = konsoleneingabe.readLine(); } dateiausgabe.close(); } catch (Exception e) { System.out.println("Fehler beim Schreiben in die Datei."); } } Folgende Bibliotheken sind erforderlich: import java.io.*; import java.awt.*; Das Einlesen der Daten aus einer Datei erfolgt ebenso, nur muss beim Aufruf des FileDialogs beachtet werden, dass die Option “LOAD” anstelle von “SAVE” angegeben wird. FileDialog dialog = new FileDialog(new Frame(), "Datei öffnen", FileDialog.LOAD); Aufgabe 1 Erstellen Sie in der Klasse Liste aus der letzten Woche eine Methode public void toFile() die den Inhalt der Liste in eine Datei ausgibt. Der Inhalt jedes Elementes (außer next) soll in eine Zeile geschrieben werden. Sie können nur Strings schreiben und brauchen den Inhalt also als eine Zeichenkette. Dafür müssen Sie auf den Inhalt des Elementes zugreifen. Schreiben Sie dafür eine Zugriffsmethode für die Klasse Element, die den Inhalt als String zurückgibt, durch einen : getrennt. /** * Methode gibt den Inhalt des Elementes als String zurück * */ public String getInhalt() { String inhalt; inhalt = name + " : " + groesse; return inhalt; } Aufgabe 2 Schreiben Sie für die Klasse Liste eine Methode public void fromFile() die den Inhalt einer Datei in eine Liste einliest. Wir gehen davon aus, dass eine korrekt formatierte Datei ausgewählt wird. Erstellen Sie zuerst ein Struktogramm. Für die Umwandlung der eingelesenen Textzeile in ihre Bestandteile wird die Methode split() verwendet, die für Strings zur Verfügung steht. public String[] split(String regex) Splittet den String gemäß dem regulären Ausdruck regex auf und liefert die Teilstrings in einem String-Array zurück. Falls der Ausdruck nicht auf den String passt, wird ein Array mit genau einem Element zurückgegeben. Dieses Element ist der unveränderte String. z.B. liefert folgender Befehl den String bis zum ersten Doppelpunkt: name = zeile.split(":")[0]; Dann muss ein neues Element erzeugt und dieses in die Liste eingefügt werden.Rufen Sie dazu die vorhandenen Listenmethoden auf.