2016-11-22 5 views
0

Я в основном создаю приложение журнала, где каждая отдельная запись журнала должна сохраняться, и я хотел бы сохранить все записи в одном файле.Сериализовать несколько записей в один и тот же файл

Я видел множество учебников по сериализации одного объекта, поэтому я придумал это решение, (который не работает), но даже если мне удастся его исправить, оно похоже на неряшливое решение.

(Здесь я пытаюсь сериализации ArrayList, и каждый раз, когда я сохранить запись, я де-сериализации список и добавить новую запись в список, прежде чем сериализации снова)

Чтобы уточнить, мой вопрос is: s это хороший способ сохранить объекты в один и тот же файл, несколько раз?

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

public class Serializer 
{ 

    //Calls readFile and adds the returned entries to an ArrayList 
    //Add the target object to the list and write to the file 
    public static void writeToFile(Object target) 
    { 
     ArrayList entries = new ArrayList(); 

     entries = readFile(); 
     entries.add(target); 


     String filename = "entries.bin"; 

     FileOutputStream fileOut = null; 
     ObjectOutputStream objOut = null; 

     try 
     { 
      fileOut = new FileOutputStream(filename); 
      objOut = new ObjectOutputStream(fileOut); 
      objOut.writeObject(entries); 
      objOut.close(); 
     } 
     catch(IOException ex) 
     { 
      ex.printStackTrace(); 
     } 
    } 

    //Reads the file and returns all entries in a list 
    public static ArrayList readFile() 
    { 
     ArrayList persistedEntries = new ArrayList<>(); 
     String filename = "entries.bin"; 

     FileInputStream fileIn = null; 
     ObjectInputStream objIn= null; 
     try 
     { 
      fileIn = new FileInputStream(filename); 
      objIn = new ObjectInputStream(fileIn); 
      persistedEntries = (ArrayList) objIn.readObject(); 
      objIn.close(); 
     } 
     catch(IOException ex) 
     { 
      ex.printStackTrace(); 
     } 
     catch(ClassNotFoundException ex) 
     { 
      ex.printStackTrace(); 
     } 

     return persistedEntries; 
    } 
} 
+0

Это может помочь, если вы также упомянуть, каким образом он «не работает» - это бросить исключение? Который из? – Hulk

+0

Я действительно не уверен, что не работает, потому что я получаю исключение из диапазона вне диапазона, и если я понял, что ArrayLists не может произойти. Но я только пытался запустить программу, а не сам метод. Но, как вы можете видеть, мой вопрос заключается не в том, что код не работает, мне просто интересно узнать, хороша ли «идея», или если я полностью что-то пропустил и должен возглавить в другой направление. :) –

+0

Глядя на свой код, я замечаю, что вы всегда 'читаете' перед' записью 'файла. Необходимо проверить пустой файл 'entries.bin', чтобы узнать, что такое возвращаемый объект ArrayList? – jrbeverly

ответ

0

Это хороший способ сохранить объекты в том же файле, в несколько раз?

Я бы сказал, что нет. Это связано с тем, что ваш метод writeToFile или более точно appendToFile может ввести странное поведение в кромках (например, entries.bin с неожиданным объектом). Я бы поспорил для этого:

Используйте writeToFile(ArrayList<Object> target), чтобы перезаписать файл указанным массивом. Затем добавьте метод , который обрабатывает процесс чтения с entries.bin с диска, добавляя target, затем записывая массив на диск. Это имеет то преимущество, что разделение любой логики связано с «слиянием» нового объекта target с файлом на диске и фактической логикой записи в файл entries.bin.

Если бы я только учился, я бы пошел с выше. Потенциал resource


Добавление отформатированного версии:

public class Serializer 
{ 
    private String filename; 

    // pass in "entries.bin" 
    public Serializer(String filename) { 
     this.filename = filename; 
    } 

    public void append(Object target) { 
     // readfile will return at least empty arraylist 
     ArrayList entries = readFile(); 
     entries.add(target); 
     serialize(entries); 
    } 

    public void serialize(ArrayList entries) 
    { 
     FileOutputStream fileOut = null; 
     ObjectOutputStream objOut = null; 
     try 
     { 
      fileOut = new FileOutputStream(filename); 
      objOut = new ObjectOutputStream(fileOut); 
      objOut.writeObject(entries); 
      objOut.close(); 
     } 
     catch(IOException ex) 
     { 
      ex.printStackTrace(); 
     } 
    } 

    //Reads the file and returns all entries in a list 
    public ArrayList deserialize() 
    { 
     ArrayList persistedEntries = new ArrayList<>(); 

     FileInputStream fileIn = null; 
     ObjectInputStream objIn = null; 
     try 
     { 
      fileIn = new FileInputStream(filename); 
      objIn = new ObjectInputStream(fileIn); 

      Object result = objIn.readObject(); 
      if (!(result instanceof ArrayList)) { 
       // read object is not an arraylist 
      } 

      persistedEntries = (ArrayList) objIn.readObject(); 
      objIn.close(); 
     } 
     catch(IOException ex) 
     { 
      ex.printStackTrace(); 
     } 
     catch(ClassNotFoundException ex) 
     { 
      ex.printStackTrace(); 
     } 

     return persistedEntries; 
    } 
} 
+0

Почему? Второй метод полностью эквивалентен добавлению в список и вызову первого метода. Две строки кода. – EJP

+0

По второму методу вы имеете в виду 'appendToFile'? Как я сказал выше, речь идет о разделении логики и хороших правил кодирования. С кодом, который он в настоящее время работает с 'writeToFile', он выполняет следующие обязанности: построение в памяти данных, чтение данных из источника, синхронизация исходных данных с данными памяти, запись данных в источник. Наряду со всеми возможными ошибками и краевыми случаями, связанными с этим. Для него более разумно разделить каждую ответственность на отдельный метод. – jrbeverly

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