Johann Wolfgang Goethe-Universität Professur für Graphische Datenverarbeitung Fachbereich Informatik und Mathematik Prof. Dr. Detlef Krömker Ashraf Abu Baker [email protected] Java-Intensivkurs WS07/08 Folie 1 Dateien und Verzeichnisse Abstraktion von Dateien und Verzeichnissen: java.io.File() File-Objekt repräsentiert den Namen einer Datei bzw. eines Verzeichnisses Datei bzw. Verzeichnis muss physikalisch nicht existieren File: Zahlreiche Methoden zur Navigation des Dateisystem & Manipulation von Dateien und Verzeichnissen Java-Intensivkurs WS07/08 Folie 2 Dateien und Verzeichnisse Konstruktoren: File(String pathName), File(String dir, String subPath) File(File dir, String subPath) - Erzeugt ein Objekt, das eine abstrakte Repräsentation der Datei oder des Verzeichnisses kapselt - Das Instanziieren – bedeutet nicht, dass die Datei bzw. das Verzeichnis angelegt wird – setzt die Existenz der Datei bzw. des Verzeichnisses nicht voraus - File-Objekt = abstrakte Beschreibung einer Datei oder eines Verzeichnisses Java-Intensivkurs WS07/08 Folie 3 Dateien und Verzeichnisse //absoluter Pfad eines Ordners (Windows-Syntax) File f=new File("c:\\daten"); //absoluter Pfad einer Datei (Windows-Syntax) File f2=new File("c:\\daten\\Veranstaltung.java"); //relativer Pfad einer Datei (Windows-Syntax) File f3=new File("..\\daten\\Veranstaltung.java"); //relativer Pfad eines Ordners (Unix-Syntax) File f4=new File("../beispiele"); //relativer Pfad eines Ordners (Unix-Syntax) File f4=new File("../../Sutdent.java"); Java-Intensivkurs WS07/08 Folie 4 Dateien und Verzeichnisse public String getName(): public String getAbsolutPath(): public boolean exist(): public long lastModified() public boolean isFile() public boolean isDirectory(): Java-Intensivkurs WS07/08 Folie 5 Dateien und Verzeichnisse public boolean mkdir(): public boolean delete(): public boolean renameTo(File dest): public String [] list(): Java-Intensivkurs WS07/08 Folie 6 Dateien und Verzeichnisse private static File d = new File("./");// realtiver Pfad eines Ordners System.out.println("Die Datei "+f.getName()+" befindet sich im Ordner: "+ d.getAbsolutePath()); System.out.println(f.getName()); System.out.println(f.getPath()); System.out.println(f.getAbsolutePath()); System.out.println(f.getParent()); System.out.println(f.exists()); System.out.println(f.canWrite()); Java-Intensivkurs WS07/08 Folie 7 Dateien und Verzeichnisse System.out.println(f.canRead()); System.out.println(f.isFile()); System.out.println(f.isDirectory()); System.out.println(f.lastModified()); System.out.println(f.length()); System.out.println(d.getName()); System.out.println(d.getPath()); Java-Intensivkurs WS07/08 Folie 8 Dateien und Verzeichnisse System.out.println(d.getAbsolutePath()); System.out.println(d.getParent()); System.out.println(d.exists()); System.out.println(d.canWrite()); System.out.println(d.canRead()); System.out.println(d.isFile()); System.out.println(d.isDirectory()); System.out.println(d.lastModified()); System.out.println(d.length());}} Java-Intensivkurs WS07/08 Folie 9 Dateien und Verzeichnisse public class FileLister { public void listRec(File directory, int depth) { String[] list = directory.list(); for (String fileName : list) { for (int i = 0; i < depth; i++) System.out.print(" "); System.out.println(fileName); File child = new File(directory, fileName); if (child.isDirectory()) listRec(child, depth + 1); } } Java-Intensivkurs WS07/08 Folie 10 Dateien und Verzeichnisse // Das Programm erwartet den Namen eines existierenden Verzeichnisses public static void main(String[] args) { // Wenn das Programm nicht den Namen eines Verzeichnisses als Parameter übergeben bekommt, listet es den Inhalt des aktuellen Verzeichnisses String path = "./"; if (args.length > 0) path = args[0]; File f = new File(path); if (!f.isDirectory()) { System.out.println(path + " doesn't exist or not a dir."); System.exit(0);// Das Programm wird beendet } FileLister fl = new FileLister(); fl.listRec(new File(path), 0); }} Java-Intensivkurs WS07/08 Folie 11 Dateien und Verzeichnisse src Bankkonto.java InitializationDemo.java InitLocalVar.java io FileLister.java FileCopy.java modifier2 ForeignClassesInDifferentPackage.java Java-Intensivkurs WS07/08 Folie 12 Wahlfreier Zugriff auf Dateien (RandomAccessFile) java.io.RandomAccessFile Mechanismus zum wahlfreien Zugriff auf Dateien Datei: - Ein Array von Bytes, das an jeder beliebiger Stelle zugegriffen werden kann Wahlfreier Zugriff: - Lesen und Schreiben an jeder Position innerhalb der Datei Java-Intensivkurs WS07/08 Folie 13 RandomAccessFile Konstruktoren: RandomAccessFile(String file, String mode) RandomAccessFile(File file, String mode) - Mode: – „r“ : Datei nur zum Lesen öffnen – „rw“ : Datei nur zum Lesen und Schreiben öffnen – „rws“ – „rwd“ Ein RandomAccessFile-Objekt - verfügt über einen Positionierungszeiger Java-Intensivkurs WS07/08 Folie 14 RandomAccessFile Zeiger: Wird zur Navigation innerhalb der Datei verwendet Zeigt jedem Zeitpunkt auf eine Position innerhalb der Datei Methoden getFilePointer() - liefert die aktuelle Position des Zeigers void seek(long position) - bewegt den Zeiger zur angegeben Position Java-Intensivkurs WS07/08 Folie 15 RandomAccessFile skipBytes( int n ) : bewegt Zeiger relativ zur aktuellen Position, um n Bytes - n negativ? – keine Bytes werden übersprungen int read(): liefert den Byte, auf den der Zeiger gerade zeigt als int-Wert zurück int read(byte dest[]): versucht so viele Bytes zu lesen, so dass das Array gefüllt wird liefert die Anzahl der gelesenen Bytes bzw. -1, wenn der Zeiger auf das Ende der Datei zeigt Java-Intensivkurs WS07/08 Folie 16 RandomAccessFile Alle Methoden erhöhen die Zeigerposition um die Anzahl der gelesenen Bytes Zu jeder read-Methode existiert eine korrespondierende write-Methode Alle o.g. Methoden werfen eine IOException Java-Intensivkurs WS07/08 Folie 17 RandomAccessFile public final boolean readBoolean() public final void writeBoolean() public final int readInt() public final void writeInt(..) public public final char readChar() final void writeChar(..) public final long readLong() public final void writeLong(..) public final byte readByte() public final void writeByte(..) public final double readDouble() public final void writeDouble(..) public final float readFloat() public final void writeFloat(..) public final short readShort() public final void writeShort(..) public final String readUTF() public final void writeUTF(..) Java-Intensivkurs WS07/08 Folie 18 RandomAccessFile public void writeMySinature(String filename) { try { File file = new File(filename); RandomAccessFile randAccessFile = new RandomAccessFile(file, "rw"); // Seek to end of file randAccessFile.seek(file.length()); // Seek to end of file // Append to the end randAccessFile.writeBytes("\r\n/*Signed by: "+ System.getProperty("user.name") + " at "+ Calendar.getInstance().getTime().toString() + "*/"); randAccessFile.close(); } catch (IOException e) { System.out.println("Can't write "); }} Java-Intensivkurs WS07/08 Folie 19 RandomAccessFile public static void main(String[] args) { RandomAccessFileApplication randAccessFileApp = new RandomAccessFileApplication(); randAccessFileApp.writeMySinature("src/io/RandomAccessF ileApplication.java"); } Java-Intensivkurs WS07/08 Folie 20 Input- Output-Streams Streams (Ströme) Klassen, mit denen Dateien sequentiell gelesen und beschrieben werden Ein Stream sieht eine Datei als: - Geordnete Folge von Bytes bzw. Zeichen, auf die er nur sequenziell zugreifen kann Zwei Arten: Input-Streams (Eingabeströme) - Zum Lesen Output-Streams (Ausgabeströme) - Zum Schreiben Java-Intensivkurs WS07/08 Folie 21 Input- Output-Streams Low-Level Streams (ByteStreams): Lesen bzw. schreiben direkt in bzw. aus einer Datei Lesen bzw. Schreiben nur Bytes High-Level Streams (Charactrer-Streams) Verwenden andere Low-Level-Streams zum Lesen und Schreiben Können Zeichen und Daten primitiver Datentypen schreiben und lesen Reader und Writer Verwenden andere High-Level Streams zum Lesen und Schreiben Können Zeichen und Daten primitiver Datentypen schreiben und lesen Java-Intensivkurs WS07/08 Folie 22 Low-Level-Streams (ByteStreams) FileInputStream und FileOutputStream Konstruktoren: - FileInputStream(String pathname) - FileInputStream(File file) - FileOutputStream(String pathname) - FileOutputStream(File file) Java-Intensivkurs WS07/08 Folie 23 Low-Level-Streams (ByteStreams) try { //Quell-Datei (path muss evtl. angepasst werden) FileInputStream in = new FileInputStream("src/io/FileCopy.java"); //Ziel-Datei (path muss evtl. angepasst werden) FileOutputStream out = new FileOutputStream("src/io/CopyOfFileCopy.java"); int len; while ((len = in.read()) > 0) { out.write( len); } out.close(); in.close(); } catch (IOException e) { System.err.println(e.toString()); } Java-Intensivkurs WS07/08 Folie 24 High-Level Streams DataInputStream DataOutputSteam Java-Intensivkurs WS07/08 Folie 25 Reader & Writer FileReader // Das Programm liest eine CSV-Datei zeichenweise, ersetzt jedes Semikolon durch ein Leerzeichen und gibt das Zeichen aus. FileReader f; int i; try { f = new FileReader("src/io/Studenten.csv"); while ((i = f.read()) != -1) { char c=(char) i; if ( c==';') c=' '; System.out.print(c); } f.close(); } catch (IOException e) { System.out.println("Error while writing in the file"); } Java-Intensivkurs WS07/08 Folie 26 BufferedReader BufferedReader Filter zur Pufferung von Eingaben - Höhere Performance beim Lesen von externen Dateien readLine(): - Liest eine komplette Textzeile und gibt sie als String zurück Java-Intensivkurs WS07/08 Folie 27 BufferedReader //LineCounter.java int lines=0; try{ BufferedReader bufferedReader = new BufferedReader(new FileReader( file)); String line=""; while((line = bufferedReader.readLine()) != null) lines++; File f=new File(file); System.out.println("Die Datei "+f.getAbsolutePath()+" enthält "+lines+" Zeilen!"); } catch (IOException e) { System.out.println("Can't read File"); } return lines;} Java-Intensivkurs WS07/08 Folie 28 FileWriter FileWriter: //Das Programm erstellt eine CSV-Datei und fügt Studentendaten in sie ein try { String NEW_LINE="\r\n"; String firstLine = "Vorname;Nachname;Mat-Nr.;Semesteranzahl"+NEW_LINE; String student1 = "Markus1;Mustermann1;346572;5"+NEW_LINE; String student2 = "Markus2;Mustermann2;23452132;3"+NEW_LINE; String student3 = "Markus3;Mustermann3;2209365;4"+NEW_LINE; FileWriter f1; //Pfad muss evtl. angepasst werden f1 = new FileWriter("src/io/Studenten.csv"); f1.write(firstLine); f1.write(student1); f1.write(student2); f1.write(student3); f1.close(); } catch (IOException e) { System.out.println("Error while writing in the file"); }} Java-Intensivkurs WS07/08 Folie 29 BufferedWriter //Das Programm fügt 15 Zeilen in eine Datei mittels eine BufferedReaders ein. try { int LINES=15; FileWriter fw = new FileWriter(args[0]); BufferedWriter bw = new BufferedWriter(fw); for(int i = 0; i < LINES; i++) { bw.write("Line " + i + "\r\n"); } bw.close(); } catch(Exception e) { System.out.println("Exception: " + e); } Java-Intensivkurs WS07/08 Folie 30