Как читать, обновлять, вставлять, удалять объекты в текстовый файл в Java - PullRequest
1 голос
/ 19 июня 2019

Я создаю интерфейс командной строки, представляющий систему поддержки. Мне нужно использовать файлы .txt в качестве внешней базы данных. Каждое здание бухгалтерского учета должно быть сопоставлено со списком всех книг, хранящихся в этом месте. Я хочу иметь возможность сохранять каждый строительный объект бухгалтерского учета, который сопоставлен со всеми его книгами, в текстовом файле и иметь возможность читать, обновлять, вставлять, удалять один и тот же текстовый файл даже после того, как мое приложение прекратило работу и запустилось еще раз.

public static ArrayList<Object> readObjects(){
    ArrayList<Object> al = new ArrayList<Object>();
    boolean cont = true;
        try {
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream("outputFile"));
            while(cont){
                  Object obj=null;
                try {
                    obj = ois.readObject();
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
                  if(obj != null)
                     al.add(obj);
                  else
                     cont = false;
               }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

return al;

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

Возможно даже обновить параметры объектных объектов / удалить целые объекты, которые уже сохранены в текстовом файле, или мне придется восстановить объекты из текстового файла, удалить все из указанного текстового файла, сделать все необходимые обновления, чтобы делать с ранее извлеченными объектами, а затем записывать объекты (и / или новые объекты) обратно в текстовый файл? Спасибо всем!

Ответы [ 2 ]

2 голосов
/ 19 июня 2019

Есть несколько способов сделать это:

  1. Загрузка файла в память в начале каждой операции, затем сохранение в конце

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

    • Преимущество заключается в том, что он не читает часто (один раз за прогон), но сталкивается с проблемой, если приложение внезапно закрывается.
  3. Сохранитькаждый объект книги в файле с ключом (идентификатор книги? имя?) в качестве имени файла.

    • Минусы: идентификатор должен быть уникальным, не может искать другие атрибуты без открытия (в худшем случае) всех файлов.Много файлов в файловой системе.
    • Плюсы: Быстрый доступ к определенной книге.Прост в обслуживании (просто открывайте нужный файл при каждой операции).Не нужно читать никаких бесполезных данных.

Несколько вариантов для рассмотрения.

0 голосов
/ 20 июня 2019

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

  1. Вы говорите txt файл, но используете сериализатор объектов, который будет записывать двоичный файл.Не главная проблема, но немного запутанная.Если вам нужно, чтобы это был текст, вам нужен сериализатор, который сериализует ваши объекты в текстовом формате (например, CSV, JSON, XML).Однако это, вероятно, несовместимо с приведенным ниже пунктом.
  2. Если наборы данных велики, то эффективное решение, чтобы избежать перезаписи всех данных для сохранения (если в одном файле), требует использования записей фиксированного размера, такчто они могут быть перезаписаны на месте через RandomAccessFile.Удаление записей затем выполняется путем пометки их как удаленных (без фактического удаления их из файла) и выполнения операций сжатия, которые в конечном итоге удаляют их при записи данных в новый файл, когда это необходимо / инициируется.
  3. В противном случаеобновите файл, вам нужно снова написать весь файл с новым состоянием.Учитывая, что это приложение командной строки, каждый запуск команды, которая приводит к обновлению, будет означать повторную запись измененных файлов.Это, вероятно, проще реализовать, чем использовать RandomAccessFile, но это может быть проблемой производительности для больших наборов данных (от 100 МБ до ГБ и т. Д.).
  4. Если перезаписать все файлы с последним состоянием, следуетв идеале записать в новый временный файл и атомарно переместить его, чтобы заменить старый файл.В противном случае следует заблокировать файл, который пишется.Это предотвращает повреждение БД в случае возникновения ошибки (если новая запись завершается ошибкой, где старый файл все еще существует) и предотвращает проблемы, связанные с параллелизмом.

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

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