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"));
}
# 1 楼答案
确保关闭流。 还要检查您没有覆盖原始文件。 ArenB给出了一些C#代码,但Java等效代码是:
# 2 楼答案
当您通过将文件对象传递到PrintWriter来打开文件时,实际上是让PrintWriter控制文件的打开方式(很可能是创建),从而删除现有文件并准备写入新文件
由于从不保存(关闭流),PrintWriter中缓冲的任何数据都不会输出到文件
如果你使用文件,你需要重构你的文件方法。打开(…)函数可以指定追加会话
这样一来,你的文件就不会仅仅通过打开就被清除,你还可以附加到文件的末尾
或者,您可以通过使用FileMode打开文件,在需要时强制清除该文件。创造
另外,你应该学习使用块,它非常有用
# 3 楼答案
可能您在打开流之后并没有关闭它。如果它已经打开,你应该在任何情况下(不仅仅是在你实际修改它的时候)都这样做
这就是为什么
finally
块在java中很有用,看看here关于使用java流的良好实践