2014-01-26 2 views
0

Может ли кто-нибудь помочь мне обнаружить ошибку? Я пытаюсь передать определенную информацию (min/max/avg) из файла 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 изменения файла в «¬ķ {стер java.io.NotSerializableException (Vx ē † 5 хт java.io.ObjectStreamExceptiondĆäk¨9ūß хт java.io.IOExceptionl € СДУ% š« xr java.lang.ExceptionŠż>; Ä xr java.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 * < < ż "9 хр стер java.lang.StackTraceElementa Å & 6Z ... Я lineNumberL declaringClassq ~ L ~ L fileNameq methodNameq ~ Xp t java.io.ObjectOutputStreampt writeObject0sq ~ ˙ ˙˙˙q ~ pt writeObjectsq ~ © q ~ t Collection.javat mainsrjava.util.Collections $ UnmodifiableListü% 1μģ L listq ~ xr, java.util.Collections $ UnmodifiableCollectionB € Ė^÷ L ct Ljava/util/Коллекция, xpsr java.util.ArrayListxŅ ™ eÃ Я sizexp ж хд ~ х», и я получаю эти ошибки на консоли:

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

Вы должны отметить Collection, как Serializable

public class Collection implements Serializable { 

Кроме BufferedReader и BufferedWriter не сериализации так должны быть помечены как transient

private transient BufferedReader fr; 
private transient BufferedWriter fw; 

Кроме того, используя имя класса, такие как Collection привязывается вызвать путаницу. Рассмотрим переименование класса.

+0

теперь я получаю «Exception в потоке„основной“java.io.FileNotFoundException: results1.txt (Система не может найти указанный файл) \t в java.io.FileInputStream.open (Native Method) \t в java.io. FileInputStream. (Неизвестный источник) \t at java.io.FileInputStream. (Неизвестный источник) ", и файл людей изменяется как в последний раз, и даже не создает файл" results1.txt ". – user2962334

+0

Файл 'results1.txt' никогда не записывается этой программой. Возможно, вы имели в виду 'RESULTS.txt'? – Reimeus

+0

не написано здесь? Строка filename1 = "results1.txt "; FileInputStream fis = new FileInputStream (filename1); – user2962334

Смежные вопросы