2012-05-27 2 views
2

в моем проекте java У меня есть несколько классов/java-файлов, но находится в классе меню, в котором хранятся все списки используемого материала. В терминах данных я храню 6 списков (2 списка массивов и 4 хэш-карты), которые 1 определены в классе меню, а другие - в разных классах. Так что мне нужно создать savestate и loadstate, когда я закрою программу для восстановления предыдущего состояния. Все списки реализованы с помощью SerializableJava Сохранение и загрузка состояния программы

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

Вот функция, которую я имею, работает (нет предупреждений/ошибок) и компилирует, но не создает файл «datafiles».

Любые идеи?

private void MenuSave(){ 
    String wd = System.getProperty("user.dir"); 

    JFileChooser fc = new JFileChooser(wd); 
    int rc = fc.showDialog(null, "Select Data File Location to Save"); 

    if (rc == JFileChooser.APPROVE_OPTION) 
    { 
    File file = fc.getSelectedFile(); 
    String filename = file.getAbsolutePath(); 

    savestate(lf, lc, lv, lcl,filename);} 
    } 


public void savestate(Cars la, Bikes l2, Motos l3, Planes l4, People n1, Food n2, String filename){ 

    int i; 
    File out = new File(filename); 

    ObjectOutputStream output = null; 

    try{ 
     output = new ObjectOutputStream(new FileOutputStream(filename)); 
     for(Car c : la.getCars().values()){ 
      output.writeObject(c); 
     } 
     for(Bike b : l2.getBikes().values()){ 
      output.writeObject(b); 
     } 
     for(Moto m : l3.getMotos().values()){ 
      output.writeObject(m); 
     } 
     for(i=0;i<n1.size();i++) 
     {output.writeObject(n1.get(i))); 
     } 
     for(i=0;i<n2.size();i++) 
     {output.writeObject(n2.get(i))); 
     } 


    }catch (FileNotFoundException ex) { 
     ex.printStackTrace(); 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } finally { 
     try { 
      if (output != null) { 
       output.flush(); 
       output.close(); 
      } 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 
} 
+2

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

+1

Почему бы не использовать 'java.util.Preferences'? – trashgod

+0

@trashgod «Предпочтения» могут быть лучшим вариантом, хотя мы пока не знаем достаточно, чтобы точно определить. Смотрите мой комментарий к mKorbel ниже. –

ответ

0

Так как я думал, что мне просто нужно сохранить списки отдельно, без этого для. 1-Выберите, где сохранить файл, затем сохраните там Классы. 2-Чтобы прочитать, просто проанализируйте ввод и сохраните замену текущих Классов. ...

String wd = System.getProperty("user.dir"); 
    this.setAlwaysOnTop(false); 
    JFileChooser fc = new JFileChooser(wd); 

    fc.setDialogType((int)JFileChooser.SAVE_DIALOG); 


    int rc = fc.showDialog(null, "Select Data File"); 
    this.setAlwaysOnTop(true); 

    if (rc == JFileChooser.APPROVE_OPTION) 
    { 
    File file = fc.getSelectedFile(); 

    ObjectOutputStream output = null; 

    try{ 
    output = new ObjectOutputStream(new FileOutputStream(file)); 
    output.writeObject(list1); 
    output.writeObject(list2); 
    output.writeObject(list3); 
    .... 


    output.close(); 

    }catch (IOException x){ 
    .... 
    }catch(NullPointerException n){ 
    ....  
    }} 

читать это то же самое:

String wd = System.getProperty("user.dir"); 
    this.setAlwaysOnTop(false); 
    JFileChooser fc = new JFileChooser(wd); 
    fc.setDialogType((int)JFileChooser.OPEN_DIALOG); 
    int rc = fc.showDialog(null, "Select Data File to Load"); 
    this.setAlwaysOnTop(true); 

    if (rc == JFileChooser.APPROVE_OPTION) 
    { 
    File file = fc.getSelectedFile(); 
    String filename = file.getAbsolutePath(); 


    ObjectInputStream input = null; 
    try{ 
    input = new ObjectInputStream(new FileInputStream(file)); 
    this.list1=(ListType1)input.readObject(); 
    this.list2=(ListType2input.readObject(); 
    .... 
    }catch (IOException x){ 
     ... 

    }catch(ClassNotFoundException x){ 
     ... 
    } 
    } 
3

не создает файл "файлы данных".

Я готов поспорить, что это так, просто не там, где вы ожидаете его найти. Не «отбрасывайте файлы, где бы они ни падали», помещайте их на место, которое читается/записывается, логично и воспроизводимо.

String filename = "datafiles"; 
File out = new File(System.getProperty("user.home"), filename); 
// ... 
    output = new ObjectOutputStream(new FileOutputStream(out)); 

Тогда смотрите в пользовательском доме для datafiles (почему не у него есть нет файла типа/расширения?) Файл.

  1. File constructor that accepts 2 String (parent & name) parameters использует правильный File разделитель для ОС.
  2. user.home - system property, который указывает на стабильный, воспроизводимый путь, который имеет доступ для чтения/записи.
+0

Предпочтения, упомянутые @trashgod – mKorbel

+0

@mKorbel Я думал, что «Предпочтения» были чисто для значений типов «String» или «simple» типов «Long' /' Float », а не общих значений« Object », как подразумевается« ObjectOutputStream ». OTOH, возможно, OP может хранить атрибуты каждого объекта в качестве базовых типов. Требуется больше ввода из OP-определений для классов. –

+0

согласился (и одобрен) с вашим комментарием, просмотром из моего состояния – mKorbel