0

我的程序假设在 PhotoAlbum 中维护一组照片。它首先读取一个照片文件夹并将它们添加到我的 PhotoAlbum。然后它会打印一个菜单,允许用户列出所有照片、添加照片、查找照片、保存和退出程序。现在,如果我运行我的程序,它会将 100 张照片添加到 PhotoAlbum,但如果我退出程序而不保存,它会清除我正在读取的文件,即使我没有添加照片或对 PhotoAlbum 进行任何操作,并且我不确定为什么。

这是我打印到文件的方法:

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

3 回答 3

3

可能您在打开流后没有关闭它。如果它已经打开,你应该在任何情况下(不仅仅是当你实际修改它时)这样做。

这就是为什么finally块在 java 中很有用的原因,看看这里关于使用 java 流的良好实践..

于 2010-04-19T16:21:53.230 回答
0

确保您正在关闭您的流。还要检查您是否没有覆盖原始文件。Aren B 提供了一些 C# 代码,但 Java 等价物是:

PrintWriter printWriter = new PrintWriter( new FileWriter("path/to/album.dat", true));
于 2010-04-19T17:17:44.990 回答
0

当您通过将 File 对象传递给 Print Writer来打开文件时,您实际上是在让 PrintWriter 控制文件的打开方式(很可能是 Create),这会删​​除现有文件并准备好新文件以进行写入。

因为您从不保存(关闭流),所以 PrintWriter 中缓冲的任何数据都不会输出到文件中。

您需要重构文件方法,如果您使用 File.Open(...) 函数,您可以指定附加会话。

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

这样你的文件不会被打开就被清除,你可以追加到最后。

或者,您可以通过使用 FileMode.Create 打开文件来强制清除文件

PS你应该了解using块,它非常有用。

于 2010-04-19T16:29:05.420 回答