2011-11-24 58 views
1

我有一本Book類和一個擴展Book的Library Book類。我將信息存儲在隨機訪問文件中。我有一個writeToFile方法,它將Book對象寫入隨機訪問文件。我的LibraryBook類的方法writeToFile調用super.writeToFile,然後我希望它將特定於LibraryBook的字段寫入文件。什麼是正確的方法來做到這一點?看到代碼:使用超類和擴展類方法寫入隨機訪問文件

public void writeToFile(String fileName, long location) throws Exception { 
    try { 
     super.writeToFile(fileName, location); 
     RandomAccessFile invFile = new RandomAccessFile(fileName, "rw"); 

     // seek to correct record in file 
     invFile.seek(location); 
     // now write out the record 
     // write out the data in fixed length fields 
     // String fields must be truncated if too large 
     // or padded with blanks if too small 
         //write library book variables to file 
     invFile.writeLong(branchID); 
         //etc.... 

        invFile.close(); 
    } catch (FileNotFoundException notFound) { 
     throw new FileNotFoundException(); 
    } catch (IOException io) { 
     throw io; 
    } 
} 

我怎麼可以編寫它,以便LibraryBook將writeToFile方法可以調用:

public void writeToFile(String fileName, long location) throws Exception { 
    try { 
     RandomAccessFile invFile = new RandomAccessFile(fileName, "rw"); 
     // seek to correct record in file 
     invFile.seek(location); 
     // now write out the record 
     // write out the data in fixed length fields 
     // String fields must be truncated if too large 
     // or padded with blanks if too small 
         //write out all Book variable to file 
     invFile.writeLong(ISBN); 
     //etc.....   

    } catch (FileNotFoundException notFound) { 
     throw new FileNotFoundException(); 
    } catch (IOException io) { 
     throw io; 
    } 
} 

從延伸圖書的LibraryBook類方法:

從書類的方法超類方法並將LibraryBook保存到文件中?

+1

請把你的代碼示例縮短到所需的最低限度...(見http://sscce.org) –

+0

我縮短了代碼示例 – trs

回答

0

你在做什麼基本上是將記錄存儲到文件中;有許多機制可用於將結構化數據存儲到文件中。如果您有興趣爲此進行學習,那麼務必謹慎行事 - 但如果您只是想解決此問題,請考慮使用諸如SQLite3之類的東西爲您提供存儲空間。

如果您想繼續使用這種方法,您需要確定每個方法將使用多少大小,將文件的一部分分配給每個要更新的方法,並確保每個方法都精確地知道在哪裏在文件中是它的位置。

如果這只是一個C程序,我建議計算領域的每一個方法負責,#define這些尺寸和#define偏移添加到location的每一個。

但是,這並不感覺很「Java」 - 你應該能夠修改父母,孩子或完全添加新的類,而不知道其他類的細節。

因此,您可能希望將一個類負責將結構化數據寫入文件並查詢涉及其數據的每個類。讓每個班級返回他們想要編寫的byte的數組 - 並讓其中一個主班級執行全部的寫作。

通過整合一個類中的所有文件IO,稍後可以更輕鬆地更改爲另一種存儲格式,或者保持兩個或三個以前版本程序的兼容性,或提供多個數據庫後端以滿足部署時的不同需求。

0

使您的writeToFile()方法最終。

然後添加一個受保護的writeExtraData()方法,該方法在書籍的情況下什麼都不做,但被覆蓋以在LibraryBook類中寫入額外的字段。從writeToFile()方法的中間調用Book。您顯然需要實現一組對稱的讀取方法。

更好的是,停止重新發明輪子和編寫令人討厭的樣板代碼,並使用語言提供的內置ObjectOutputStreamObjectInputStream類來完成此類操作。然後你可以去readObject()