有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如果我不保存文件,为什么文件会被清除?

我的程序应该在相册中保存一组照片。它首先读取一个文件夹中的照片,并将它们添加到我的相册中。然后,它会打印一个菜单,允许用户列出所有照片、添加照片、查找照片、保存并退出程序。现在,如果我运行我的程序,它会将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) 个答案

  1. # 1 楼答案

    确保关闭流。 还要检查您没有覆盖原始文件。 ArenB给出了一些C#代码,但Java等效代码是:

    PrintWriter printWriter = new PrintWriter( new FileWriter("path/to/album.dat", true));
    
  2. # 2 楼答案

    当您通过将文件对象传递到PrintWriter来打开文件时,实际上是让PrintWriter控制文件的打开方式(很可能是创建),从而删除现有文件并准备写入新文件

    由于从不保存(关闭流),PrintWriter中缓冲的任何数据都不会输出到文件

    如果你使用文件,你需要重构你的文件方法。打开(…)函数可以指定追加会话

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

    这样一来,你的文件就不会仅仅通过打开就被清除,你还可以附加到文件的末尾

    或者,您可以通过使用FileMode打开文件,在需要时强制清除该文件。创造

    另外,你应该学习使用块,它非常有用

  3. # 3 楼答案

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

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