Как использовать данные в полях ArrayList и integer после завершения выполнения программы? - PullRequest
0 голосов
/ 26 декабря 2018

Я пытаюсь создать приложение с графическим интерфейсом для управления продажами билетов.Например, каждый раз, когда билет продается, я должен обновлять информацию об этом билете в моем ArrayList билетов, и он должен сохраняться после закрытия программы.В настоящее время у меня определен класс данных, который выглядит следующим образом:

public class Database {
    static ArrayList<Ticket> soldTickets;
    static int valueOfAllSoldTickets;

    public Database() {
        soldTickets = new ArrayList<Ticket>();
        valueOfAllSoldTickets = 0;
    }
}

На самом деле я не хочу создавать экземпляр объекта Database несколько раз, это должно произойти только один раз для хранения данных, которыеПользователь графического интерфейса будет работать с.Я просто хочу, чтобы это была какая-то структура, которую я могу использовать, чтобы на жестком диске хранилась куча различной информации (например, больше ints и lists), которую я представляю как большее количество полей в таком классе.Но как мне записать свои изменения в это поле int на жесткий диск и получить доступ к нему с помощью метода, подобного getTotalSales()?Этот метод будет в моем классе Database.

Как только я доберусь до точки, где у меня есть основной метод, где все работает, я также не хочу создавать новый ArrayList заявок каждый раз, когда язапустить программу.Это заставляет меня задаться вопросом, как мне создать экземпляр ArrayList заявок всего один раз, и чтобы это не повторилось, а затем использовать этот уже созданный список, чтобы добавлять и удалять его, как мне нужно.Этот список также должен храниться на жестком диске компьютера, на котором он запущен.Если я подхожу к этому неправильно, я был бы признателен, если бы кто-то мог сказать мне альтернативный способ сделать это.Благодаря.

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Если вы можете использовать FasterXML/jackson

private static final String TICKET_NAME = "ticker.json";
private static final ObjectMapper mapper = new ObjectMapper();

public static void main(String[] args) throws Exception {
    // 1 start,init the list of ticket
    File file = new File(TICKET_NAME);
    TypeReference<List<Ticket>> reference = new TypeReference<List<Ticket>>() {
    };
    List<Ticket> tickets = mapper.readValue(file, reference);
    file.delete();

    // 2 stop store the tickets into file
    File newFile = new File(TICKET_NAME);
    mapper.writeValue(newFile, tickets);
}
0 голосов
/ 26 декабря 2018

Вы можете записать свой ArrayList на диск в виде файла, если класс Ticket реализует интерфейс Serializable.Вот пример кода для записи в файл и считывания его из файла

Writing



ArrayList<Ticket> tickets = new ArrayList<>();

        tickets.add(new Ticket(...));
        tickets.add(new Ticket(...));

        try
        {
            FileOutputStream fos = new FileOutputStream("TicketsData.obj");
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(tickets);
            oos.close();
            fos.close();
        }
        catch (IOException ioe)
        {
            ioe.printStackTrace();
        }

Reading



try
        {
            FileInputStream fis = new FileInputStream("TicketsData.obj");
            ObjectInputStream ois = new ObjectInputStream(fis);

            tickets = (ArrayList) ois.readObject();

            ois.close();
            fis.close();
        }
        catch (IOException ioe)
        {
            ioe.printStackTrace();
        }

Обновление - 2: логика для оптимизации вызовов записи на диск.

Если класс тикетов громоздкий & ArrayList будет иметь большечем 1000 элементов

-> Класс тикета будет иметь свой собственный writeToDisk, который сохранит текущий объект как ticket_xxx.obj в папке с тикетами.

-> Предположим, что если ticket_id равен 1234, он сначала проверитticket_1234.obj уже существует в папке заявок.Если он существует, он проверит дату последнего обновления файла, а столбец даты последнего обновления Obj будет перезаписан только при наличии новой версии.

-> Будет класс утилит TicketSaveHelper writeToDisk & readFromDisk.writeToDisk возьмет ArrayList и вызовет writeToDisk для отдельных билетов.readFromDisk будет читать все файлы .obj из каталога и возвращать ArrayList.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...