Frage

Mein Programm ist Angenommen, eine Sammlung von Fotos in einem Fotoalbum zu halten. Es beginnt mit einem Ordner mit Fotos zu lesen und fügt sie in meinem Photoalbum. Er druckt dann ein Menü, das der Benutzer alle die Fotos auflisten kann, fügen Sie ein Foto, ein Foto, speichern und beenden Sie das Programm. Gerade jetzt, wenn ich mein Programm ausführen wird es die 100 Fotos zum Photoalbum hinzuzufügen, aber wenn ich das Programm beenden, ohne zu speichern, löscht er die Datei, die ich von selbst lese, wenn ich nicht ein Foto oder etwas getan, um das Fotoalbum hinzugefügt und ich bin mir nicht sicher, warum.

Hier ist meine Methode zum Drucken in eine Datei:

private static void saveFile(PrintWriter writer) {
 String result;
  ArrayList<Photo> temp = album.getPhotoAlbum();
  for (int i = 0; i < temp.size(); i++){
   result = temp.get(i).toString() + "\n";
   writer.println(result);
  }
  writer.close();
 }

Und wo der Printwriter instanziiert:

File file = new File(args[0] + File.separator + "album.dat");

try {
   PrintWriter fout =  
new PrintWriter(new FileWriter(file));
   fileWriter = fout;
  } catch (IOException e){
   System.out.println("ReadFromFile: Folder " + args[0]
                          + " is not found.");
   System.exit(0);
  }

Und wo es in meiner runMenu Methode aufgerufen wird:

private static void runMainMenu(Scanner scan) {
  String input;
  do {
   showMainMenu();
  input = scan.nextLine().toLowerCase();
  switch (input.charAt(0)) {
  case 'p':
   System.out.println(album.toString());
   break;
  case 'a': 
  album.addPhoto(readPhoto(scan, t));
   break;
  case 'f':
  findMenu(scan);
   break;
  case 's':
   saveFile(fileWriter);
   System.exit(0);
   break;
  case 'q':
   break;
  default:
   System.out.println("Invalid entry: " + 
     input.charAt(0));
   break;
  }
  } while (!input.equalsIgnoreCase("q"));
 }
War es hilfreich?

Lösung

Wahrscheinlich schließen Sie nicht den Strom, nachdem sie geöffnet haben. Sie sollten es auf jeden Fall tun (und nicht nur, wenn Sie es tatsächlich ändern), wenn es geöffnet wurde ..

Deshalb finally Blöcke nützlich sind, in Java zu sehen hier für gute Praktiken über java-Streams ..

Andere Tipps

Wenn Sie die Datei öffnen, indem Sie ein File-Objekt in den Druck vorbei Writer Sie lassen im Wesentlichen der Printwriter bestimmen, wie die Datei geöffnet wird (wahrscheinlich erstellen), die die vorhandene Datei und readies ein löscht neues für einen Schreib.

Weil Sie nie speichern (in der Nähe der Stream), gepuffert alle Daten in dem Printwriter wird nicht in die Datei ausgegeben werden.

Sie benötigen eine Datei Ansatz Refactoring, wenn Sie die File.Open (...) Funktion können Sie eine Append-Sitzung angeben.

FileStream outStream = File.Open(myFileName, FileMode.Append);
PrintWriter pw = new PrintWriter(outStream);

Auf diese Weise Ihre Datei durch Öffnen, um es einfach gelöscht werde nicht, und Sie können an das Ende anhängen.

Alternativ können Sie die Datei erzwingen gelöscht werden, wenn Sie es durch Öffnen es mit FileMode.Create

sein wollen

P. S. Sie sollten über die mit Block lernen, es ist sehr nützlich.

Vergewissern Sie sich, dass Sie Ihre Streams schließen. Prüfen Sie auch, dass Sie nicht die ursprüngliche Datei überschreiben. Aren B einig C # -Code gab, aber die Java-äquivalent wäre:

PrintWriter printWriter = new PrintWriter( new FileWriter("path/to/album.dat", true));
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top