2016-04-26 9 views
4

У меня есть приложение Java, которое имеет 3 ArrayList объектов: items, customers и orders.Как автоматически писать и читать из файлов?

Мне интересно, как я могу записать эти объекты в файл при закрытии приложения, а затем как я прочитаю из файлов при запуске приложения?

Это код, который я получил, чтобы помочь мне:

//Write to file 
ObjectOutputStream outputStream; 
outputStream=new ObjectOutputStream(new FileOutputStream("customerFile",true)); 
outputStream.writeObject(customers); 
outputStream.close(); 

//Read from file 
Clients fileCust = null; 
ObjectInputStream inputStream; 
inputStream = new ObjectInputStream(new FileInputStream("customerFile")); 
fileCust = (Clients)inputStream.readObject(); 
inputStream.close(); 

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

+4

Возможный дубликат [? Java - Как я могу написать мой ArrayList в файл, и Ридом (нагрузки), что файл исходного ArrayList] (HTTP : //stackoverflow.com/questions/16111496/java-how-can-i-write-my-arraylist-to-a-file-and-read-load-that-file-to-the) – Darren

+1

У меня проблемы с пониманием ваш вопрос ... Что вы подразумеваете под «когда программа начинается и заканчивается». Если вы хотите выполнить некоторые операции загрузки и сохранения, почему бы вам просто не реализовать их в начале и в конце программы? – ParkerHalo

+0

@ParkerHalo О, так что все, что мне нужно сделать, это поставить код в начале программы? Я думал, что существует такой синтаксис, когда он запускается автоматически при запуске программы и для ее сохранения, как только я закрываю программу – shawnmurray1337

ответ

1

Вы должны использовать Java сериализации.

Java предоставляет механизм, называемый сериализацией объектов, где объект может быть представлен как последовательность байтов, которая включает в себя данные объекта, а также информацию о типе объекта и типах данных, хранящихся в объекте.

После того, как сериализованный объект был записан в файл, он может быть прочитан из файла и десериализован, то есть информация о типе и байты, которые представляют объект и его данные, могут использоваться для воссоздания объекта в памяти.

Here - это ссылка на официальную документацию Java с большим количеством примеров.

Теперь, чтобы сделать это автоматически, вы просто должны поставить эти типы инструкций в начале программы, чтобы прочитать файл

При выходе вы можете использовать Exemple ответа выше.

+0

EDITED. Ответ уместен. – Mxsky

2

Чтобы прочитать файл в начале программы, вы можете просто ввести код чтения в начале.

Но чтобы убедиться, что она сохраняется при выходе из вашей программы из везде, вы могли бы использовать shutdown hook:

Runtime.getRuntime().addShutdownHook(new Thread(() -> { 
    // Shutdown code here 
})); 

Что вы регистрируетесь в начале программы. Он вызывается, когда JVM отключается. К документу:

Виртуальная машина Java выключается в ответ на два вида событий:

  • программа завершается нормально, когда последние не-демон поток завершает работу или при выходе (эквивалентно, метод System.exit), или
  • Виртуальная машина завершается в ответ на прерывание пользователя, например, набирает^C или общесистемное событие, такое как выключение пользователя или выключение системы.

Теперь в начале вашей программы вы могли бы сделать что-то вроде этого:

public static void main(String... args) { 
    // getConfig() returns a configuration object read from a file 
    // Or a new object if no file was found. 
    Configuration config = getConfig(); 

    Runtime.getRuntime().addShutdownHook(new Thread(() -> { 
     ... 
     // Note that I'm not appending to, but overwriting the file 
     ObjectOutputStream outputStream = 
      new ObjectOutputStream(new FileOutputStream("myConfigFile")); 

     outputStream.writeObject(config); // write the config object. 
     ... 
    })); 

    // Rest of the program, using 'config' 
} 

Важно отметить, что, поскольку закрытие крюка выполняется в конце программа, он напишет возможное состояние объекта конфигурации. Поэтому учитываются изменения, внесенные в «config» во время программы.


Для объектов, чтобы иметь возможность быть написаны так, что они должны реализовать java.io.serializable и так делают все свои поля. За исключением полей, которые имеют квалификатор transient.

Объект конфигурации может выглядеть следующим образом:

public class Configuration implements java.io.Serializable { 

    // transient -> Will not be written or read. 
    // So it is always 'null' at the start of the program. 
    private transient Client lastClient = null; 

    // 'Client' must also implement java.io.serializable, 
    // for 'Configuration' to be serializable. 
    // Otherwise, an exception is thrown when writing the object. 
    private List<Client> clients = new ArrayList<Client>(); 

    // 'String' already implements java.io.serializable. 
    private String someString; 

    ... 
}