Pregunta

Mi programa se supone que debe mantener una colección de fotos en un Álbum Digital. Se inicia mediante la lectura de una carpeta de fotos y los añade a mi ÁlbumDigital. A continuación, se imprime un menú que permite al usuario una lista de todas las fotos, añada una foto, se encontró una foto, guardar y salir del programa. En este momento si funciono mi programa que se sumará a los 100 fotos a la ÁlbumDigital, pero si sale del programa sin guardar, borra el archivo que estoy leyendo desde incluso si no he añadido una foto o cualquier cosa hecha a la ÁlbumDigital y no estoy seguro de por qué.

Esta es mi método para imprimir en un archivo:

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();
 }

Y donde el PrintStream se instancia:

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);
  }

Y donde se le llama en mi método runMenu:

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"));
 }
¿Fue útil?

Solución

Probablemente no estás cerrando la corriente después de haber abierto. Debe hacerlo en cualquier caso (y no sólo cuando realmente modificarlo) si se ha abierto ..

Es por eso que los bloques finally son útiles en java, miren aquí de buenas prácticas sobre el uso de java arroyos ..

Otros consejos

Cuando se abre el archivo pasando un objeto en el archivo de impresión Writer básicamente estás dejando que el PrintStream gobiernan cómo se abre el archivo (lo más probable Crear) que borra el archivo existente y se prepara una nuevo para una escritura.

Debido a que nunca Guardar (cerca de la corriente), los datos almacenados en el PrintStream no se emitirá en el fichero.

Es necesario refactorizar su acercamiento archivo, si se utiliza la función File.Open (...) se puede especificar una sesión de datos anexados.

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

De esta manera el archivo no será aclaró simplemente por la apertura a la misma, y ??es posible añadir al final.

Como alternativa se puede forzar el archivo que desee quitar cuando quiera que sea abriéndolo con FileMode.Create

P.S. usted debe aprender acerca de la usando bloque, que es muy útil.

Asegúrese de que está cerrando sus corrientes. Compruebe también que no va a sobrescribir el archivo original. Aren B dio algo de código C #, Java, pero el equivalente sería:

PrintWriter printWriter = new PrintWriter( new FileWriter("path/to/album.dat", true));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top