2010-04-19 75 views
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")); 
} 

回答

3

在打開它後,您可能沒有關閉流。你應該這樣做在任何情況下(不只是當你真正修改),如果它已經打開..

這就是爲什麼finally塊是在Java中是有用的,看看here有關使用Java流良好做法..

0

當您通過將文件對象傳入Print Writer打開文件時,您基本上讓PrintWriter控制文件如何打開(很可能是Create),該文件刪除現有文件併爲寫入準備一個新文件。

因爲您從不保存(關閉流),因此PrintWriter中緩衝的任何數據都不會輸出到文件中。

您需要重構您的文件方法,如果您使用File.Open(...)函數,則可以指定追加會話。

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

這樣你的文件就不會被打開就清除,你可以追加到最後。

或者,你可以用FileMode.Create

附註:打開它,強制文件被清除,當你希望它是你應該使用塊瞭解,這非常有用。

+0

是不是*用於C#? OP是Java。 – GalacticCowboy 2010-04-19 17:24:35

0

確保您正在關閉您的流。 另請檢查您是否覆蓋原始文件。 Aren B給出了一些C#代碼,但Java等價物將是:

PrintWriter printWriter = new PrintWriter(new FileWriter("path/to/album.dat", true)); 
相關問題