Java - Как я могу написать файл ArrayList в файл и прочитать (загрузить) этот файл в исходный ArrayList? - программирование
Подтвердить что ты не робот

Java - Как я могу написать файл ArrayList в файл и прочитать (загрузить) этот файл в исходный ArrayList?

Я пишу программу на Java, которая отображает ряд афтершоульных клубов (E.G. Football, Hockey - введенный пользователем). Клубы добавляются в следующий ArrayList:

private ArrayList<Club> clubs = new ArrayList<Club>();

По следующему методу:

public void addClub(String clubName) {
    Club club = findClub(clubName);
    if (club == null)
        clubs.add(new Club(clubName));
}

'Club' - это класс с конструктором - name:

public class Club {

    private String name;

    public Club(String name) {
        this.name = name;
    }

    //There are more methods in my program but don't affect my query..
}

Моя программа работает - она ​​позволяет мне добавить новый клубный объект в мой arraylist, я могу просмотреть arraylist, и я могу удалить все, что хочу, и т.д.

Тем не менее, теперь я хочу сохранить этот массивList (клубы) в файл, а затем я хочу, чтобы иметь возможность загружать файл позже, и тот же arraylist там снова.

У меня есть два метода для этого (см. ниже) и пытались заставить его работать, но havent hashluck, любая помощь или совет будут оценены.

Сохранить метод (имя_файла выбрано пользователем)

public void save(String fileName) throws FileNotFoundException {
    String tmp = clubs.toString();
    PrintWriter pw = new PrintWriter(new FileOutputStream(fileName));
    pw.write(tmp);
    pw.close();
}

Метод загрузки (текущий код не запускается - файл является строкой, но должен быть Club?

public void load(String fileName) throws FileNotFoundException {
    FileInputStream fileIn = new FileInputStream(fileName);
    Scanner scan = new Scanner(fileIn);
    String loadedClubs = scan.next();
    clubs.add(loadedClubs);
}

Я также использую GUI для запуска приложения, и на данный момент я могу нажать кнопку "Сохранить", чтобы затем ввести имя и местоположение и сохранить его. Файл появляется и может быть открыт в "Блокноте", но отображается как что-то вроде Club @c5d8jdj (для каждого Клуба в моем списке)

4b9b3361

Ответ 1

В качестве упражнения я бы предложил сделать следующее:

public void save(String fileName) throws FileNotFoundException {
    PrintWriter pw = new PrintWriter(new FileOutputStream(fileName));
    for (Club club : clubs)
        pw.println(club.getName());
    pw.close();
}

Это будет записывать имя каждого клуба в новой строке в вашем файле.

Soccer
Chess
Football
Volleyball
...

Я оставлю загрузку вам. Совет: вы написали по одной строке за раз, вы можете читать по одной строке за раз.

Каждый класс в Java расширяет класс Object. Таким образом, вы можете переопределить его методы. В этом случае вы должны быть заинтересованы в методе toString(). В классе Club вы можете переопределить его для печати некоторого сообщения о классе в любом формате, который вы хотите.

public String toString() {
    return "Club:" + name;
}

Затем вы можете изменить приведенный выше код на:

public void save(String fileName) throws FileNotFoundException {
    PrintWriter pw = new PrintWriter(new FileOutputStream(fileName));
    for (Club club : clubs)
         pw.println(club); // call toString() on club, like club.toString()
    pw.close();
}

Ответ 2

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

  • Объявить класс Club как реализацию Serializable:

    public class Club implements Serializable {
        ...
    }
    

    Это сообщает JVM, что класс может быть сериализован для потока. Вам не нужно реализовывать какой-либо метод, так как это интерфейс маркера.

  • Чтобы записать свой список в файл, выполните следующие действия:

    FileOutputStream fos = new FileOutputStream("t.tmp");
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    oos.writeObject(clubs);
    oos.close();
    
  • Чтобы прочитать список из файла, сделайте следующее:

    FileInputStream fis = new FileInputStream("t.tmp");
    ObjectInputStream ois = new ObjectInputStream(fis);
    List<Club> clubs = (List<Club>) ois.readObject();
    ois.close();
    

Ответ 3

Это может сработать для вас

public void save(String fileName) throws FileNotFoundException {
FileOutputStream fout= new FileOutputStream (fileName);
ObjectOutputStream oos = new ObjectOutputStream(fout);
oos.writeObject(clubs);
fout.close();
}

Для чтения вы можете иметь

public void read(String fileName) throws FileNotFoundException {
FileInputStream fin= new FileInputStream (fileName);
ObjectInputStream ois = new ObjectInputStream(fin);
clubs= (ArrayList<Clubs>)ois.readObject();
fin.close();
}

Ответ 4

В Java 8 вы можете использовать Files.write() метод с двумя аргументами: Path и List<String>, что-то вроде этого:

List<String> clubNames = clubs.stream()
    .map(Club::getName)
    .collect(Collectors.toList())

try {
    Files.write(Paths.get(fileName), clubNames);
} catch (IOException e) {
    log.error("Unable to write out names", e);
}

Ответ 5

ObjectOutputStream.writeObject(clubs)
ObjectInputStream.readObject();

Кроме того, логика "добавить" логически эквивалентна использованию набора вместо списка. В списках могут быть дубликаты, а Sets - нет. Вы должны рассмотреть возможность использования набора. В конце концов, у вас действительно есть 2 шахматных клуба в одной школе?