2012-10-31 106 views
1

我正在嘗試從文件中讀取信息並從該信息中創建對象。文件中的每行約6行是不同的單位,這意味着第一組行與對象A相關,下一行設置爲對象B,依此類推。從Java中讀取文件時從中斷的位置拾取

我可以從文件中讀取並創建我的對象 - 第一組。我的問題是,我不知道如何讓讀者從創建下一個對象時遺留下來的位置拿起...

(注意:創建文件的read()方法是part創建新對象,而不是在main()或類似的東西中)。下面是代碼的相關位:

司機:

public class CSD{ 

    public static void main (String[] argv){ 
     Vector V=new Vector(10); 
     CoS jon=new CoS(); 
     jon.display(); 
    }//end main 
} 

它調用的CoS,它的構造是:

public CoS(){ 
    try{ 
     String fileName=getFileName(); 
     FileReader freader=new FileReader(fileName); 
     BufferedReader inputFile=new BufferedReader(freader); 
     this.read(inputFile); 
     setDegree(major); 
     setStatus(credits); 
    } catch(FileNotFoundException ex){ 
    }//end catch 
} 

這就要求既read()和的getFileName():

public void read(BufferedReader inputFile){ 
    try{ 
     int n; 
     super.read(inputFile); 
     String str=inputFile.readLine(); 
     if (str!=null){ 
      n=Integer.parseInt(str); 
      setCredits(n); 
      str=inputFile.readLine(); 
      setMajor(str); 
     }//end if 
    }catch(IOException ex){} 
}//end method 

public String getFileName() { 
    Scanner scan = new Scanner(System.in); 
    String filename; 
    System.out.print("Enter the file name and path ==> "); 
    filename = scan.nextLine(); 
    System.out.println(""); 
    return filename; 
} 

在此先感謝,夥計們!

+2

爲什麼不傳遞起始行號給每個構造函數呢?否則,只做一個文件讀取並立即創建所有對象,而不是將這些值傳遞給構造函數會更好。 – Joel

+0

同意。否則,看看這裏:http://stackoverflow.com/questions/4305094/java-reading-strings-from-a-random-access-file-with-buffered-input –

+0

喬爾,我如何讓讀者從#我會通過它?這是一個好主意,我該如何實現它? –

回答

3

爲什麼不使用ObjectInputStream和ObjectOutputStream?或者任何一種真正的序列化?

的javadoc:http://docs.oracle.com/javase/6/docs/api/java/io/ObjectOutputStream.html

示例代碼:http://www.javadb.com/writing-objects-to-file-with-objectoutputstream

基本上,因爲你寫你的對象到一個文件,要照顧他們所在的行,我會建議其他幾個系列化備擇方案。

一個是Object * Stream - 你在一個File上創建一個ObjectStream,然後通過它創建對象。之後當你閱讀時,你會按照與他們相反的順序閱讀這些對象,並且他們會在你寫下它們時回來。

另一種是實現Serializable。請記住瞬態關鍵字?在您不想保存到文件的字段上使用它。

然後是原始的「手工」方法,您只保存要保存的內容,稍後通過將這些初始化值傳遞給它們的構造函數來重建對象。有點像人們建議你將文件行作爲參數給ctor :)

編輯: 用Object *寫作猜想Streams需要你實現Serializable或Externalizable。

但是如果示例代碼不夠清楚,請問:)

+1

能否請你解釋一下這些東西?我不太熟悉閱讀方法,我會開始在谷歌搜索這些條款,但如果你能解釋/給出一個小例子,這將是非常有用的... –