// Musterlösung Uebung 8 Aufgabe 2 // Dies ist eine Kombination aus "DateiLesen.java" und // "DateiSchreiben.java" aus der Vorlesung import java.io.*; public class FileCopy { public static void main(String[] args) { if(args.length != 2) { System.err.println("Bitte Programm aufrufen mit:"); System.err.println("java FileCopy Originaldatei Zieldatei"); System.exit(-1); } // Ein "LesbareDatei"-Objekt. FileReader original = null; String original_name = args[0]; // Erstes Argument = Originaldatei // Ein "SchreibbareDatei"-Objekt. FileWriter kopie = null; String kopie_name = args[1]; // Zweites Argument = Kopie // Da das Öffnen einer Datei schiefgehen kann (z.B. wenn // die Datei nicht existiert, oder nicht lesbar // (geschützt) ist), verwenden wir hier try ... catch. try { // Hole ein neues "LesbareDatei"-Objekt, und // verknüpfe es mit der Datei "input.txt". original = new FileReader(original_name); System.out.println("Datei " + original_name + " zum Lesen geöffnet."); } catch (FileNotFoundException e) { System.out.println("Die Datei gibt's nicht!"); System.exit(-1); } catch (IOException e) { System.out.println("Die Datei ist evtl. nicht lesbar."); System.exit(-1); } try { // Hole ein neues "SchreibbareDatei"-Objekt, und // verknüpfe es mit der Datei "output.txt". kopie = new FileWriter(kopie_name); System.out.println("Datei " + kopie_name + " zum Schreiben geöffnet."); } catch (FileNotFoundException e) { System.out.println("Die Datei gibt's nicht!"); // Hier müsste eigentlich noch die Eingabedatei geschlossen werden. System.exit(-1); } catch (IOException e) { System.out.println("Die Datei ist evtl. nicht schreibbar."); // Hier müsste eigentlich noch die Eingabedatei geschlossen werden. System.exit(-1); } // Lese-/Schreibvorgänge können ebenfalls Exceptions // auslösen. try { int zeichen; int zaehler = 0; // Zusatz / Optik // read() liefert, wenn kein Zeichen mehr // gelesen werden kann, den int-Wert -1 zurück. // -> while-Schleife soll so lange laufen, bis // bis eine -1 gelesen wurde. while (true){ zeichen = original.read(); // Dateiende oder Fehler? -> Schleife verlassen if(zeichen < 0) break; kopie.write(zeichen); zaehler++; System.out.print("\r" + zaehler + " Zeichen kopiert."); } System.out.println(""); // Zeilenumbruch } catch (IOException e) { System.out.println("Kopierfehler!"); // Hier verlassen wir das Programm NICHT mit // System.exit(-1); , da die beiden Dateien // geschlossen werden sollen. } // Dateien schließen. Auch hier können Exceptions // auftreten, die abgefangen werden müssen. try { original.close(); System.out.println("Datei " + original_name + " geschlossen."); } catch (IOException e) { System.out.println("Fehler beim Schließen der Datei " + original_name + ": " + e.toString()); } try { kopie.close(); System.out.println("Datei " + kopie_name + " geschlossen."); } catch (IOException e) { System.out.println("Fehler beim Schließen der Datei " + kopie_name + ": " + e.toString()); } System.out.println("Datei " + original_name + " wurde in Datei " + kopie_name + " kopiert."); } }