Foliensatz6 - Graphische Datenverarbeitung - Goethe

Werbung
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
Herunterladen