Почему мой файл очищается, если я не сохраняю его? - PullRequest
0 голосов
/ 19 апреля 2010

Предполагается, что моя программа поддерживает коллекцию фотографий в фотоальбоме. Он начинается с чтения папки с фотографиями и добавляет их в мой фотоальбом. Затем он печатает меню, которое позволяет пользователю перечислить все фотографии, добавить фотографию, найти фотографию, сохранить и выйти из программы. Прямо сейчас, если я запускаю свою программу, она добавит 100 фотографий в фотоальбом, но если я выйду из программы без сохранения, она очистит файл, с которого я читаю, даже если я не добавила фотографию или ничего не сделала в фотоальбом и Я не уверен почему.

Вот мой метод печати в файл:

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

И где создается экземпляр PrintWriter:

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

И где это вызывается в моем методе 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"));
 }

Ответы [ 3 ]

3 голосов
/ 19 апреля 2010

Возможно, вы не закрываете поток после его открытия. Вы должны сделать это в любом случае (не только когда вы фактически изменяете его), если он был открыт ..

Вот почему finally блоки полезны в java, посмотрите здесь , чтобы узнать, как использовать потоки Java

0 голосов
/ 19 апреля 2010

Убедитесь, что вы закрываете свои потоки. Также убедитесь, что вы не перезаписываете оригинальный файл. Арен Б дал немного кода на C #, но Java-эквивалент был бы:

PrintWriter printWriter = new PrintWriter( new FileWriter("path/to/album.dat", true));
0 голосов
/ 19 апреля 2010

Когда вы открываете файл, передавая объект File в Print Writer , вы, по сути, позволяете PrintWriter определять способ открытия файла (наиболее вероятно, Create), который удаляет существующий файл и готовит новый один для записи.

Поскольку вы никогда не сохраняете (закрываете поток), любые данные, буферизованные в PrintWriter, не выводятся в файл.

Вам необходимо изменить подход к файлу, если вы используете функцию File.Open (...), вы можете указать сеанс добавления.

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

Таким образом, ваш файл не будет очищен простым открытием, и вы можете добавить в конец.

В качестве альтернативы вы можете принудительно очистить файл, если хотите, открыв его с помощью FileMode.Create

P.S. Вы должны узнать о , используя блок, это очень полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...