web-dev-qa-db-fra.com

Java - Comment puis-je écrire ma liste de tableaux dans un fichier et lire (charger) ce fichier dans la liste de tableaux d'origine?

J'écris un programme en Java qui affiche une gamme de clubs parascolaires (par exemple Football, Hockey - saisis par l'utilisateur). Les clubs sont ajoutés dans les ArrayList suivants:

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

Par la méthode suivante:

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

'Club' est une classe avec un constructeur - nom:

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..
}

Mon programme fonctionne - il me permet d'ajouter un nouvel objet Club dans ma liste d'array, je peux voir la liste d'array et je peux supprimer tout ce que je veux, etc.

Cependant, je veux maintenant enregistrer cette arrayList (clubs) dans un fichier, puis je veux pouvoir charger le fichier plus tard et la même arraylist est là encore.

J'ai deux méthodes pour cela (voir ci-dessous), et j'ai essayé de le faire fonctionner mais je n'ai pas eu de chance, toute aide ou conseil serait apprécié.

Méthode de sauvegarde (fileName est choisi par l'utilisateur)

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

Méthode de chargement (le code actuel ne s'exécutera pas - le fichier est une chaîne mais doit être 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);
}

J'utilise également une interface graphique pour exécuter l'application, et pour le moment, je peux cliquer sur mon bouton Enregistrer qui me permet ensuite de taper un nom et un emplacement et de l'enregistrer. Le fichier apparaît et peut être ouvert dans le Bloc-notes mais s'affiche comme quelque chose comme Club @ c5d8jdj (pour chaque club de ma liste)

21
user2300264

Comme exercice, je suggérerais de faire ce qui suit:

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

Cela écrira le nom de chaque club sur une nouvelle ligne dans votre fichier.

Soccer
Chess
Football
Volleyball
...

Je vous laisse le chargement. Indice: Vous avez écrit une ligne à la fois, vous pouvez ensuite lire une ligne à la fois.

Chaque classe de Java étend la classe Object. En tant que tel, vous pouvez remplacer ses méthodes. Dans ce cas, vous devriez être intéressé par la méthode toString(). Dans votre classe Club, vous pouvez la remplacer pour imprimer un message sur la classe dans le format que vous souhaitez.

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

Vous pouvez ensuite changer le code ci-dessus en:

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();
}
9

Vous devez utiliser le mécanisme de sérialisation intégré de Java. Pour l'utiliser, vous devez procéder comme suit:

  1. Déclarez la classe Club comme implémentant Serializable:

    public class Club implements Serializable {
        ...
    }
    

    Cela indique à la machine virtuelle Java que la classe peut être sérialisée en un flux. Vous n'avez à implémenter aucune méthode, car il s'agit d'une interface de marqueur.

  2. Pour écrire votre liste dans un fichier, procédez comme suit:

    FileOutputStream fos = new FileOutputStream("t.tmp");
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    oos.writeObject(clubs);
    oos.close();
    
  3. Pour lire la liste à partir d'un fichier, procédez comme suit:

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

Dans Java 8, vous pouvez utiliser la méthode Files.write () avec deux arguments: Path et List<String>, quelque chose comme ça:

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);
}
6
Evgeny F

Cela pourrait fonctionner pour vous

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

Pour relire, vous pouvez avoir

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

En outre, vous ajoutez une logique équivaut logiquement à utiliser un ensemble au lieu d'une liste. Les listes peuvent avoir des doublons et les ensembles ne peuvent pas. Vous devriez envisager d'utiliser un ensemble. Après tout, pouvez-vous vraiment avoir 2 clubs d'échecs dans la même école?

0