2014-12-24 2 views
-1
public class Inventory implements Serializable { 
    ArrayList<Product> productlist; 
    File file; 

    public Inventory(){ 
     productlist = new ArrayList<Product>(); 
     file = new File("build/classes/inventory/inv.ser"); 

     if(!file.exists()){ 
      try { 
       file.getParentFile().mkdirs(); 
       file.createNewFile(); 

      } catch (IOException ex) { 
       Logger.getLogger(Inventory.class.getName()).log(Level.SEVERE, null, ex); 
      }   
     } 

     if(file.length() !=0){ 
      loadFile(file); 
     } 
    } 

    public void addProduct(Product product){ 
     productlist.add(product); 
     saveFile(this.file); 
    } 

    public void saveFile(File file){     
     try{  
     FileOutputStream fos = new FileOutputStream(file); 
      ObjectOutputStream out = new ObjectOutputStream(fos); 
      out.writeObject(productlist); 
      out.close(); 
      fos.close(); 
     } catch(FileNotFoundException ex){System.out.println("FileNotFoundException");} 
      catch(IOException ex){System.out.println("InputException");}     
    } 

    public void loadFile(File file){ 
      try{ 

      FileInputStream fis = new FileInputStream(file); 
       ObjectInputStream in = new ObjectInputStream(fis); 
       productlist=(ArrayList<Product>)in.readObject(); 
       in.close(); 
       fis.close(); 
      } catch(FileNotFoundException ex){ System.out.println("FileNotFoundException"); } 
       catch(IOException ex){System.out.println("OutputException");} 
       catch(ClassNotFoundException ex){System.out.println("ClassNotFoundException");} 

    } 
} 

writeObject()writeObject() перезаписать содержимое существующего файла или добавить объекты в существующий файл?Запись ArrayList объектов в файл

И неплохо ли сериализовать ArrayList объектов, как то, что я сделал внутри метода saveFile?

+0

Что вы на самом деле пытаетесь достичь? –

+0

@kevinlee Не делайте свой вопрос бессмысленным, удаляя детали, которые были подробно прокомментированы. – EJP

ответ

3

writeObject() перезаписать содержимое существующего файла или добавить объекты в существующий файл?

Ни то, ни другое. Он записывает объект в базовый поток . Базовый поток - это поток последовательного байта, к которому можно добавить только. В этом случае базовый поток подкрепляется базовым файлом, который имеет или не имеет уже был перезаписан, в зависимости от того, как вы построили FileOutputStream. Это не имеет никакого отношения к writeObject(). В любом случае вы не можете успешно добавить в файл сериализованных объектов, не предпринимая специальных мер.

И неплохо ли сериализовать ArrayList объектов, как то, что я сделал внутри метода saveFile?

По сравнению с чем?

N.B.

  1. Когда вы получаете исключение, распечатайте его. Не просто сообщение вашего собственного проекта.

  2. Создание файла, чтобы вы могли проверить его на нулевую длину, не имеет смысла.

  3. Каталог build/classes/inventory не будет присутствовать во время выполнения, как только вы перестанете использовать IDE. Это не место для размещения файла.

+0

есть другой вопрос. Как написать путь, чтобы FileOutputStream мог получить доступ к файлу, даже если я не использую IDE? –

+0

@kevinlee Я уже ответил на ваш вопрос и его повторение в вашем первом комментарии. Повторите свой второй комментарий, я бы использовал текущий каталог. – EJP

+0

Просто хочу подтвердить свой ответ. ObjectOutputStream.writeObject() будет перезаписывать существующий объект внутри файла правильно? –