2013-12-09 66 views
0

我有一些基本類,存儲數據:序列化對象到一個文件

class Item implements java.io.Serializable { 
    String this.data = ""; 
    public void saveData(String data) { 
     this.data = data; 
    } 
    public String getData() { 
     return this.data; 
    } 
} 

而在其他類,這是爲了項目實例保存到一個文件中的函數:

private static void saveItemToFile(File folder, Item item) throws IOException{ 
    FileOutputStream fos = new FileOutputStream(
      folder.getAbsolutePath() + item.getData() + ".obj"); 
    ObjectOutputStream oos = new ObjectOutputStream(fos); 
    oos.writeObject(item); 
    oos.close(); 
} 

測試代碼:

Item itm = new Item(); 
itm.saveData("String data here"); 
File folder = new File(System.getProperty("user.home") + "/.CDDB"); 
saveItemToFile(folder, itm); 

但這種代碼是行不通的。沒有發生任何錯誤或異常,但它不會在指定的文件夾中創建文件。我的錯誤是什麼?

+0

爲了更好地幫助越早,張貼[SSCCE(http://sscce.org/)。 –

+2

String this.data =「」; ?? –

+0

請顯示最後一部分的完整代碼;你必須在某處處理'IOException',但我沒有看到它,並且我懷疑你正在吞嚥正在拋出的異常(可能'文件夾'不存在)。另外,在'saveItemToFile'調用之前調試並檢查'folder'的值,並檢查傳遞給'new FileOutputStream'的值。 – chrylis

回答

2

你的目標路徑是通過添加文件名的目錄路徑,而不路徑分隔符建:

folder.getAbsolutePath() + item.getName() + ".obj" 

所以,你應該有一個文件名爲[USER_HOME]/.CDDB[item name].obj

更好地利用File對象,而不是直接:

private static void saveItemToFile(File folder, Item item) throws IOException { 
    File file = new File(folder, item.getName() + ".obj"); 
    try (ObjectOutputStream oos = 
      new ObjectOutputStream(new FileOutputStream(file))) { 
     oos.writeObject(item); 
    } 
} 
0

此代碼完美作品,可能是您尋找生成文件的錯誤文件夾。唯一的一點是它附帶.CDDB以及文件名。如果您無法找到user.home文件夾,請在下面的行中添加以打印對象隔離對象的位置。

System.out.println("--- output path "+System.getProperty("user.home")); 

否則創建File對象與參數System.getProperty("user.home") + "/.CDDB",並傳遞給OutputStream的

0

我編了一個跑你的程序,這是我觀察到:

的文件用的名稱創建.CDDBString data here.obj

我想你打算使用名爲String data here.obj的文件,但是在saveItemToFile中,您將文件夾和文件名連接在一起以獲取文件名,沒有路徑分隔符。

這應該做的伎倆:

private static void saveItemToFile(File folder, Item item) throws IOException{ 
    File out = new File(folder, item.getData() + ".obj"); 
    FileOutputStream fos = new FileOutputStream(out); 
    ObjectOutputStream oos = new ObjectOutputStream(fos); 
    oos.writeObject(item); 
    oos.close(); 
}