Modul 404
Kompetenz: Vorgabe interpretieren, objektbasiert mit einer Programmiersprache implementieren, dokumentieren und testen.
Objektbasiert programmieren nach Vorgabe
Ueli Hagger
Modul 404
Kompetenz: Vorgabe interpretieren, objektbasiert mit einer Programmiersprache implementieren, dokumentieren und testen.
Dateien, File 1
1.
Programmierung Grundlagen – mit Beispielen in Java Kapitel 12.10
2.
Java 9 – Grundlagen Programmierung
Kapitel 14: Ausnahmebehandlung mit Exceptions
3.
Java 2 JDK 5 / JDK 6 - Grundlagen Programmierung Kapitel 15: Mit Dateien arbeiten
Kapitel 16: Mit Streams arbeiten
4.
(Java 7 - Fortgeschrittene Programmierung)
Dateien
Programmierung Grundlagen
Kapitel 12.10: Mit Daten in Dateien arbeiten Java 9 – Grundlagen Programmierung Kapitel 14: Ausnahmebehandlung mit Exceptions Java 2 JDK 5 / JDK 6 - Grundlagen Programmierung Kapitel 15: Mit Dateien arbeiten
Kapitel 16: Mit Streams arbeiten 1. Klasse File
2. Ein- und Ausgabeströme 3. Daten in Datei schreiben 4. Daten aus Datei lesen 5. Klasse FileWriter 6. Klasse FileReader 3
Erstellen sie folgendes GUI
Welche Elemente verwenden sie?
1. JLabel 2. JTextField 3. JButton 4. JLabel 5. JLabel 6. JList 7. JList 8. JButton
1 2
3 4
8
7 6
5
GUI
Einzelarbeit
Erstellen sie das GUI mit Eclipse. Verwenden sie dazu die vorher definierten Komponenten.
Es muss noch kein zusätzlicher Code programmiert werden.
5
Grobbeschreibung
In den JList sollen nach drücken des Buttons "Inhalte anzeigen"
links: alle Verzeichniseintragungen des Verzeichnisses, welches in Feld Verzeichnis eingetragen wurde anzeigt.
rechts: alle Dateien des Verzeichnisses, welches in Feld Verzeichnis eingetragen wurde anzeigt.
Zum Testen erstellen sie einen Verzeichnis mit Unterverzeichnissen und Dateien, z.B.
Endprodukt
7
Analyse
Beschreibung
Im Verzeichniseingabefeld muss als erstes das darzustellende Verzeichnis, d.h. der Pfad eingetragen werden.
Danach wird durch Drücken des Buttons "Inhalte anzeigen" das ausgewählte Verzeichnis durchsucht und der Inhalt aufgeteilt in Verzeichnisse und Dateien dargestellt.
Mit dem Button "Ende" soll das Programm beendet werden.
Das GUI haben wir bereits erstellt.
Demzufolge müssen wir uns als nächstes mit den Algorithmen beschäftigen. Wir wissen, dass dieser in den beiden "event handler" der Buttons programmiert wird.
Algorithmus "Inhalte einfügen"
Beschreibung
Beschreiben sie möglichst genau wie und was das Programm in der korrekten Abfolge machen soll.
Dabei sollen auch mögliche Fehler getestet und abgefangen werden.
Ablauf
1. Algorithmus soll in Worten beschreiben. * 2. Daraus Struktogramm erstellen. *
3. Umsetzung in Java, codieren **
4. testen **
* Gruppenarbeit, ** Einzelarbeit 9
Algorithmus "Inhalte einfügen"
Wie sie oben sehen sind die Eintragungen 1. untereinander dargestellt
2. Unterscheidbar, Verzeichnis bzw. Datei 3. mit einem Namen versehen
Klasse File
Ein Objekt der Klasse File kann für den Namen einer Datei als auch für Namen von Verzeichnissen stehen, z.B.
File name = new File("C:\test");
// der Pfad muss bestehen String[] inhalt = name.list();
String Array/Feld
Die einzelnen Inhalte haben alle Informationen eines Eintrages, wie Name/Typ/Grösse usw.
[0] [1] [2] [3] [4]
01_Programme 02_Powerpoint Microsoft Excel… Microsoft Project… Microsoft Word…
11
Klasse File
Ein Objekt der Klasse File kann für den Namen einer Datei als auch für Namen von Verzeichnissen stehen, z.B.
File name = new File("C:\test");
// der Pfad muss bestehen String[] inhalt = name.list();
String Array/Feld
Die einzelnen Inhalte haben alle Informationen eines Eintrages, wie Name/Typ/Grösse usw.
[0] [1] [2] [3] [4]
01_Programme 02_Powerpoint Microsoft Excel… Microsoft Project… Microsoft Word…
Einige Methoden der Klasse File
Konstruktoren Beschreibung
File(String pfad) pathist ein Datei- oder Verzeichnisname File(String dir, String name) dirist ein Verzeichnisname;
nameist ein Datei- oder Verzeichnisname File(File dir, String name) dirist ein Verzeichnis von Typ File;
nameist ein Datei- oder Verzeichnisname 13
Einige Methoden der Klasse File
Methoden Beschreibung
boolean exist() Liefert true, wenn die Datei im Dateisystem existiert.
boolean delete() Löscht die Datei, bzw. das Verzeichnis und liefert truezurück falls der Löschvorgang erfolgreich war.
boolean canRead() prüft auf Leserechte.
boolean canWrite() prüft auf Schreibrechte.
String getName() Liefert den Dateinamen ohne Pfad zurück.
String getPath() Liefert den Pfadanteil zurück.
boolean isDirectory() Liefert true, falls es sich um ein Verzeichnis handelt, sonst false.
boolean isFile() Liefert true, falls es sich um eine Datei handelt, sonst false.
String[] list() liefert Sting-Array mit allen Eintragungen zurück.
Algorithmus "Inhalte einfügen"
Beschreibung 15
Codeausschnitt
private File verzeichnis;
private DefaultListModel<String> verzeichnisse, dateien;
verzeichnisse = new DefaultListModel<String>();
JList<String> list_verzeichnisse = new JList<String>(verzeichnisse);
list_verzeichnisse.setBounds(32, 252, 231, 141);
contentPane.add(list_verzeichnisse);
dateien = new DefaultListModel<String>();
JList<String> list_dateien = new JList<String>(dateien);
list_dateien.setBounds(310, 252, 292, 141);
contentPane.add(list_dateien);
17
Code für Button "Inhalte anzeigen"
btnInhaltAnzeigen.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {
verzeichnisse.clear();
dateien.clear();
if (tfVerzeichnis.getText().isEmpty())
JOptionPane.showMessageDialog(null, "Verzeichnisname fehlt!");
else {
verzeichnis = new File(tfVerzeichnis.getText());
if (verzeichnis.exists() && verzeichnis.isDirectory()) { String[] inhalt = verzeichnis.list();
for (String eintrag : inhalt) {
File f = new File(verzeichnis, eintrag);
if (f.isDirectory())
verzeichnisse.addElement(eintrag);
else dateien.addElement(eintrag);
} // for
} // verzeichnis.exists() && verzeichnis.isDirectory()
else JOptionPane.showMessageDialog(null,"Verzeichnis existiert nicht!");
} // else Verzeichnis nicht leer } // actionPerformed
}); // addActionListener
Codeausschnitt: Button Ende
btnEnde.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
int result = JOptionPane.showConfirmDialog(null,"Wollen sie das
Programm wirklich beenden", "Programm beenden", JOptionPane.YES_NO_OPTION);
switch (result) {
case JOptionPane.YES_OPTION:
System.exit(0);
case JOptionPane.NO_OPTION:
} // Switch
} // actionPerformed }); // addActionListener 19
Ein- und Ausgabe in Datei
Zeichenorientierte Datenströme
21
String pfad = "C:"+File.separator+"test"+File.separator;
String dateiname = "adress.txt";
FileWriter fw = new FileWriter(pfad+dateiname,true); // true für anhängen BufferedWriter datei_ausgabe = new BufferedWriter(fw);
datei_ausgabe.write("Hallo");
datei_ausgabe.newLine();
datei_ausgabe.flush(); // nur Buffer in File schreiben datei_ausgabe.close(); // schreiben und schliessen
Daten schreiben (Writer)
String pfad = "C:"+File.separator+"test"+File.separator;
String dateiname = "adress.txt";
FileReader fr = new FileReader(pfad+dateiname);
BufferedReader datei_eingabe = new BufferedReader(fr);
String zeile = datei_eingabe.readLine();
while (zeile != null)
{ // bis letzte Zeile im File System.out.println(zeile);
zeile = datei_eingabe.readLine();
} // bis keine Zeile mehr in File datei_eingabe.close();
Daten lesen (Reader)
23
Aufgabe
1. Erstellen sie das nebenstehendes GUI.
- 2 JTextfield - 2 JButton
- 1 JList mit DefaultListModel
2. Speichern sie die Eingaben (Vorname und Nachname) in das File ab. Button "speichern"
Kontrollieren sie den Inhalt mit dem Editor.
3. Lesen sie die Daten aus dem File ein und geben sie die Informationen Zeilenweise aus.
-> siehe Button "Daten aus …"
Pfad und Dateiname seinen statisch c:\test\adress.txt
Pfad und Dateinamen festlegen
// Klasse
public class Speichern1 extends JFrame { private JPanel contentPane;
// File.separator ist bei WIN "\" bei Linux "/"
private String pfad = "C:"+File.separator+"test"+File.separator;
private String dateiname = "adress.txt";
… 25
Auszug aus Konstruktor
public Speichern1() throws IOException {
setTitle("Datei schreiben und lesen (Hagger)");
// muss hier definiert werden, da datei_ausgabe in mehreren // Methoden verwendet wird
FileWriter fw = new FileWriter(pfad+dateiname,true);
BufferedWriter datei_ausgabe = new BufferedWriter(fw);
…
Ausgabefenster (JList rechts)
btnAusgabe.setBounds(133, 38, 146, 94);
contentPane.add(btnAusgabe);
DefaultListModel<String> daten = new DefaultListModel();
JList list = new JList(daten);
list.setBounds(289, 38, 124, 212);
contentPane.add(list);
27
addWindowListener beim Drücken von X
//Abschalten des Standard-Verhaltens für das Schließen des Fensters setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
//Neues Verhalten für das Schliessen des Fensters addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) { try {
datei_ausgabe.close(); // Datei schliessen } catch (IOException e1) {
e1.printStackTrace();
}
System.exit(0); // Programm verlassen } // windowClosing
}); // addWindowListener
btnSpeichern (schreiben in Datei)
btnSpeichern.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) {
try {
datei_ausgabe.write(txtVorname.getText());
datei_ausgabe.write(";");
datei_ausgabe.write(txtNachname.getText());
datei_ausgabe.newLine();
datei_ausgabe.flush(); // Buffer in File schreiben } catch (IOException e) {
e.printStackTrace();
} // try .. catch } // actionPerformed
}); // btnSpeichern.addActionListener 29
btnAusgabe (lesen aus Datei)
btnAusgabe.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) {
try {
BufferedReader datei_eingabe = new BufferedReader(new FileReader(pfad+dateiname));
daten.clear(); // JList loeschen
String zeile = datei_eingabe.readLine(); // erste Zeile einlesen while (zeile != null) {
daten.addElement(zeile); // Zeileninhalt in JList
zeile = datei_eingabe.readLine(); // naechste Zeile einlesen } // while solange noch Zeilen
datei_eingabe.close(); // Datei schliessen } catch (IOException e) {
e.printStackTrace();
} // try .. catch } // actionPerformed }); // btnAusgabe.addActionListener
Zusammenfassung/Hausaufgaben
- Klasse File mit Konstruktor und Methoden - Daten schreiben
- Daten lesen
Hausaufgaben
- Übung aus Folie nochmals machen und Code verstehen - Übungen fertigstellen, nochmals lösen
31