我的程序假设在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"));
}
答案 0 :(得分:3)
打开它之后可能没有关闭流。如果它已被打开,你应该在任何情况下(不仅仅是当你真正修改它)时这样做。
这就是finally
块在java中有用的原因,看看here有关使用java流的好习惯。
答案 1 :(得分:0)
当您通过将File对象传递给Print Writer 来打开文件时,您实际上是让PrintWriter管理文件的打开方式(很可能是Create),它会删除现有文件并准备好新的写作。
因为您从不保存(关闭流),所以PrintWriter中缓冲的任何数据都不会输出到文件中。
如果使用File.Open(...)函数,则需要重构文件方法,可以指定追加会话。
FileStream outStream = File.Open(myFileName, FileMode.Append);
PrintWriter pw = new PrintWriter(outStream);
这样你的文件只要打开它就不会被清除,你可以追加到最后。
或者,您可以通过使用FileMode.Create打开文件来强制清除文件
P.S。你应该了解使用块,它非常有用。
答案 2 :(得分:0)
确保您关闭了溪流。 还要检查您是否覆盖了原始文件。 Aren B提供了一些C#代码,但Java等价物是:
PrintWriter printWriter = new PrintWriter( new FileWriter("path/to/album.dat", true));