2014-01-26 41 views
0

任何人都可以幫助我發現錯誤嗎?我試圖通過序列化從文件people.txt(包括200行如'Christel; MacKay; 4「2'; 38')中的某些信息(最小/最大/平均年齡)傳遞到另一個文件 第一類,在這裏我處理這些人的一些信息:在java中正確序列化對象

import java.io.Serializable; 

    @SuppressWarnings("serial") 
    public class Person implements Serializable 
    { 
     private String firstname; 
     private String lastname; 
     private int age; 

    public Person (String PersonFN, String PersonLN, int PersonA) 
    { 
     firstname = PersonFN; 
     lastname = PersonLN; 
     age = PersonA; 
    } 

    public String toString() 
    { 
      return "Name: "+firstname+" "+lastname+" Age: "+age; 

    } 

    public int getAge() 
    { 
     return age; 
    } 

    } 

而另外一個,它完成所有的工作:

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.FileReader; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.util.*; 



public class Collection 
{ 
    int min; 
    int max; 
    int total; 

    private static ArrayList<Person> people; 

    public Collection() 
    { 
     people = new ArrayList<Person>(); 
     min = 100; 
     max = 1; 
     total = 0; 
    } 

    BufferedReader fr = null; 
    BufferedWriter fw = null; 

    public void readFromFile() throws IOException 
    { 
     fr = new BufferedReader (new FileReader("people.txt")); 
     String line = null; 
     StringTokenizer st; 
     while (fr.ready()) 
     { 
      line = fr.readLine(); 
      st = new StringTokenizer(line);   
      String name = st.nextToken(";"); 
      String surname = st.nextToken(";").toUpperCase(); 
      String height = st.nextToken(";"); 
      int age = Integer.parseInt(st.nextToken(";").trim()); 
      Person p = new Person (name, surname, age); 
      p.toString(); 
      people.add(p); 

      //for the 2nd part 
      if(age < min) 
       min = age; 
      if (age > max) 
       max = age; 
      total = total + age; 

     } 

    } 

    public int minAge() 
    { 
     int minA = 100; 
     for (int i = 0; i < people.size(); i++) 
     { 
      Person p = people.get(i); 
      int age = p.getAge(); 
      if (age < minA) 
      { 
       minA = age; 

      } 
     } 
     System.out.print(minA+"; "); 
     return minA; 
    } 

    public int maxAge() 
    { 
     int maxA = 1; 
     for (int i = 0; i < people.size(); i++) 
     { 
      Person p = people.get(i); 
      int age = p.getAge(); 
      if (age > maxA) 
      { 
       maxA = age; 

      } 
     } 
     System.out.print(maxA+"; "); 
     return maxA; 
    } 

    public float avgAge() 
    { 
     int sum = 0; 
     for (int i = 0; i < people.size(); i++) 
     { 
      Person p = people.get(i); 
      int age = p.getAge(); 
      sum = sum + age; 
     } 
     float avgA = sum/people.size(); 
     System.out.print(avgA); 
     return avgA; 


    } 

    public int fastMinAge() 
    { 
     //System.out.print("Minimum age: " + min); 
     return min; 

    } 

    public int fastMaxAge() 
    { 
     return max; 
    } 

    public float fastAvgAge() 
    { 
     return total/people.size(); 
    } 


    public void writeToFile(String filename) throws IOException 
    { 

     StringBuffer val = new StringBuffer ("Minimum age: "); 
     val.append(fastMinAge()); 
     val.append("\n Maximum age: "); 
     val.append(fastMaxAge()); 
     val.append("\n Average age: "); 
     val.append(fastAvgAge()); 

     BufferedWriter out = new BufferedWriter(new FileWriter(filename)); 
     String outText = val.toString(); 
     out.write(outText); 
     out.close(); 
    } 


    public static void main(String[] args) throws IOException, ClassNotFoundException 
    { 
     Collection c = new Collection(); 
     c.readFromFile(); 

     for(Person d: people) 
     { 
      System.out.println(d); 

     } 
     c.minAge(); 
     c.maxAge(); 
     c.avgAge(); 
     c.fastMinAge(); 
     c.fastMaxAge(); 
     c.fastAvgAge(); 
     c.writeToFile("RESULTS.txt"); 

     String filename = "people.txt"; 
     //FileOutputStream fos = new FileOutputStream(filename); 
     ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(filename)); 
     os.writeObject(c); 
     os.close(); 

     String filename1 = "results1.txt"; 
     FileInputStream fis = new FileInputStream(filename1); 
     ObjectInputStream ois = new ObjectInputStream(fis); 
     Collection p = (Collection) ois.readObject(); 
     ois.close(); 

    } 

} 

當我運行的代碼,它會創建RESULTS.TXT文件並在那裏添加了正確的信息,我確定這段代碼有一些問題:

String filename = "people.txt"; 
      //FileOutputStream fos = new FileOutputStream(filename); 
      ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(filename)); 
      os.writeObject(c); 
      os.close(); 

      String filename1 = "results1.txt"; 
      FileInputStream fis = new FileInputStream(filename1); 
      ObjectInputStream ois = new ObjectInputStream(fis); 
      Collection p = (Collection) ois.readObject(); 
      ois.close(); 

順便說一下,我的people.txt文件變成了「¬ķ{sr java.io.NotSerializableException(Vxē†5 xrjava.io.ObjectStreamExceptiondĆäk¨9ūxr java.io.IOExceptionl sde%š« xrjava.lang.ExceptionŠż>; xrjava.lang.ThrowableÕĘ5'9wøĖL causet Ljava/lang/Throwable; L detailMessaget Ljava/lang/String; [ stackTracet [Ljava/lang/StackTraceElement; L suppressedExceptionst Ljava/util /名單; XPQ〜牛逼SD3lab1.Collectionur [Ljava.lang.StackTraceElement; F * < < Z「9 XP SR java.lang.StackTraceElementa埃& 6Z ......我 lineNumberL declaringClassq〜1 fileNameq〜1 methodNameq〜XP t java.io.ObjectOutputStreampt writeObject0sq〜 ˙ Q〜PT writeObjectsq〜 ©Q〜 噸Collection.javat mainsr & java.util.Collections中$UnmodifiableListü%1微克大號listq〜XR,java.util.Collections中$ UnmodifiableCollectionB€E 1÷大號克拉Ljava/util的/收集; xPSR寄存器java.util.ArrayListxŅ™EA我sizexp w^XQ〜X」,而我得到的控制檯上這些錯誤:任何幫助

Exception in thread "main" java.io.NotSerializableException: SD3lab1.Collection 
    at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
    at java.io.ObjectOutputStream.writeObject(Unknown Source) 
    at SD3lab1.Collection.main(Collection.java:169) 

千恩萬謝

+0

'Collection c = new Collection();'???你爲什麼要實施收藏?這是一個界面,你有很多可以使用的實現! – alfasin

+0

@OleksiyMartynov,c來自「Collection c = new Collection();」,我之前使用過,我絕對不確定如何做序列化的事情。它是否在正確的課堂上? – user2962334

回答

3

您需要標記CollectionSerializable

public class Collection implements Serializable { 

此外BufferedReaderBufferedWriter是不可序列所以需要另外使用如Collection勢必會引起混亂類名稱被標記爲transient

private transient BufferedReader fr; 
private transient BufferedWriter fw; 

。考慮重命名這個類。

+0

現在我得到「Exception in thread」main「java.io.FileNotFoundException:results1.txt(系統找不到指定的文件) \t at java.io.FileInputStream.open(Native Method) \t at java.io. FileInputStream。(Unknown Source) \t at java.io.FileInputStream。(Unknown Source)「,並且人員文件如上次更改,甚至不創建」results1.txt「文件。 – user2962334

+0

文件'results1.txt'永遠不會被這個程序寫入。你的意思是'RESULTS.txt'? – Reimeus

+0

是不是寫在這裏? String filename1 =「results1。txt「; FileInputStream fis = new FileInputStream(filename1); – user2962334