2015-04-14 5 views
0

EDITED Так что я пытаюсь сохранить в объектах .ser типа типа Product (с указанием имени, количества, цены), как следует: каждый раз, когда я добавляю новый продукт, я добавляю его в файл. Затем, каждый раз, когда я запускаю окно, я хочу, чтобы прочитать эти продукты я ранее сохраненные, в виде TreeSet, вызвав следующий метод в конструкторе окна:Java Serializable EOF

public void updateCurrentProducts() 
{ 
     Product p=null; 
     System.out.println("Updating the tree of products."); 
     try 
      { 
      FileInputStream fileIn = new FileInputStream("products.ser"); 
      ObjectInputStream in = new ObjectInputStream(fileIn); 
      int c; 
      // if((c=in.read()) != -1) 
      { 
       // System.out.println("Not eof yet."); 
       while ((p = (Product) in.readObject()) != null) 
       { 
        addProduct(p); 
        System.out.println("Just found "+p.name+"."); 
       } 
      } 
      in.close(); 
      fileIn.close(); 
      }catch(IOException ix) 
      { 
      ix.printStackTrace(); 
      return; 
      } catch (ClassNotFoundException e) 
     { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

Это как добавить продукты:

public void addProduct(Product p) 
    { 
     System.out.println("Succesfully added new peoduct."); 

     FileOutputStream fileOut; 
     try 
     { 
      fileOut = new FileOutputStream("products.ser"); 
      ObjectOutputStream out = new ObjectOutputStream(fileOut); 
      out.writeObject(p); 
      System.out.println("Just saved "+p.name); 
      productTree.add(p); 
      out.close(); 
      fileOut.close(); 
      System.out.printf("Serialized data is saved in products.ser"); 
     } 
     catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

Однако я получаю java.io.EOFException, и я не уверен, почему, поскольку у меня есть условие не получать доступ к элементу, кроме ((p = (Product) in.readObject()) != null). Я не уверен, как избежать EOF. Я пробовал с read() чек, но это просто устранило бы проблему, а не помогло бы мне сохранить мои изменения. Кроме того, я заметил, что сохраняется только последний элемент, который я отправляю. Любые предложения?

EDIT После осуществления этого предложения моя ошибка переключилась на java.io.StreamCorruptedException: invalid type code: AC.

Я читал это https://stackoverflow.com/a/2395269/4180889, но для меня непонятно, что мне делать, если я хочу сохранить контент.

ответ

2

Я заметил, что сохранен только последний элемент, который я отправляю.

Потому что операции записи выполняются в режиме усечения.

fileOut = new FileOutputStream("products.ser"); 

Используйте true флаг для режима дописывания:

fileOut = new FileOutputStream("products.ser", true); 

См more

+0

я вижу логику, однако она должна быть более серьезной проблемой, так как теперь он не даже сохранить этот последний элемент. Или он не читает правильно какие-либо элементы. –

+0

_So для меня совершенно ясно, что вы снова открываете Stream и добавляете все больше объектов проверки. Это недопустимо. Вы должны написать все объекты проверки в 'одном сеансе' ._ Я в замешательстве. –

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