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 (для каждого Клуба в моем списке)
Ответы
Ответ 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 шахматных клуба в одной школе?