Сохранение и загрузка списка в файл - PullRequest
0 голосов
/ 11 июля 2019

В настоящее время я готовлюсь к экзамену и работаю над следующей задачей:

Как передать ArrayList в метод «save», который хранит данные списка, и другой метод «load», который передаетданные возвращаются?

class Person {
    private String firstname;
    private String lastname;
    private String sortname;

public Person(String firstname, String lastname) {
        this.firstname = firstname;
        this.lastname = lastname;
        updateSortname();

// метод получения и установки ..

В соответствии с задачей я должен использовать следующие методы:

public static List<Person> load(String filename) throws IOException {
        return ??;
}


public static Person load(DataInputStream in) throws IOException {
        return ??;
}


public static void save(String filename, List<Person> list) throws IOException {
}


public static void save(DataOutputStream out, Person person) throws IOException {
}


public static List<Person> unserialize(String filename) throws IOException, ClassNotFoundException {
        return ??;
}


public static void serialize(String filename, List<Person> persons) throws IOException {
}

Это основной метод, которыйдолжен выдать следующий результат:

[Вилли Вонка (WonkaWilly), Чарли Бакет (BucketCharlie), дедушка Джо (JoeGrandpa)]

[Вилли Вонка (WonkaWilly), Чарли Бакет (Бакет Чарли), дедушка Джо (ДжоГрандпа)]

[Вилли Вонка (WonkaWilly), Чарли Бакет (БакетЧарли), дедушка Джо (ДжоГрандпа)]

public class PersonTest {

public static void main(String[] args) throws IOException, ClassNotFoundException {
    List<Person> persons = new ArrayList<>();
    persons.add(new Person("Willy", "Wonka"));
    persons.add(new Person("Charlie", "Bucket"));
    persons.add(new Person("Grandpa", "Joe"));
    System.out.println(persons);

    Person.save("persons.sav", persons);
    persons = Person.load("persons.sav");
    System.out.println(persons);
    Person.serialize("persons.ser", persons);
    persons = Person.unserialize("persons.ser");
    System.out.println(persons);
}

} ​​

Это должно выглядеть примерно так.Но я не знаю, как мне это сделать для ArrayLists.

public static void save(String filename , Graph graph ) throws IOException{

try (ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream (new FileOutputStream (filename)))) {
out.writeObject (graph);
}
}

public static Graph load (String filename) throws IOException, ClassNotFoundException {

Graph graph = null;
try (ObjectInputStream in = new ObjectInputStream (new BufferedInputStream ( new FileInputStream (filename)))) {
graph = (Graph) in.readObject();
}
return graph;
}

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Поскольку вам нужно, чтобы вывод объекта Person был как, нам нужно переопределить toString() класса Person.

[Вилли Вонка (WonkaWilly), Чарли Бакет (BucketCharlie), дедушка Джо (JoeGrandpa)]

class Person {

//Respective Constructor, Getter & Setter methods


/* Returns the string representation of Person Class. 
 * The format of string is firstName lastName (lastNameFirstName)*/

  @Override
  public String toString() { 
    return String.format(firstName + " " + lastName + "("+ lastName + firstName + ")"); 
  } 
}

Существует множество подходов к записи объектов в файл. Вот с PrintWriter

Сохранить объекты в файл

public static void save(String filename, List<Person> list) throws IOException {
 PrintWriter pw = new PrintWriter(new FileOutputStream(fileName));
 for (Person person : list) {
    pw.println(person.toString());
   }
 pw.close();
}

Или использовать сериализацию

// Вы можете использовать механизм сериализации. Чтобы его использовать, нужно сделать следующее:

  1. Объявить класс Person как реализующий Serializable:

    public class Person implements Serializable {
        ...
      @Override
      public String toString() { 
         return String.format(firstName + " " + lastName + "("+ lastName + firstName + ")"); 
      } 
    }
    
  2. Написать свой список в файл:

    public static void save(String filename, List<Person> list) throws IOException {
     FileOutputStream fos = new FileOutputStream(filename);
     ObjectOutputStream oos = new ObjectOutputStream(fos);
     oos.writeObject(list);
     oos.close();
    }
    
  3. Чтение списка из файла:

    public static List<Person> load(String filename) throws IOException {
     FileInputStream fis = new FileInputStream(filename);
     ObjectInputStream ois = new ObjectInputStream(fis);
     List<Person> list = (List<Person>) ois.readObject();
     ois.close();
     return list;
    }
    
1 голос
/ 11 июля 2019

Вы можете попробовать что-то вроде этого:

public static void save(String filename , ArrayList<Person> persons) throws IOException{

    try (ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream (new FileOutputStream (filename)))) {
        for(int i = 0; i < persons.size; i++){
               out.writeObject(persons.get(i));
        }   
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...