web-dev-qa-db-fra.com

Écriture de fichier - Ajout PrintStream

J'essaie d'ajouter des informations dans un fichier texte, mais le fichier ne montre que le dernier élément écrit.

Il existe de nombreux Engineer, mais il imprime dans le fichier uniquement le dernier élément lu.

Par exemple:

Engineer e = new Engineer(firstName,surName,weeklySal);
PrintStream writetoEngineer = new PrintStream(new File ("Engineer.txt"));

//This is not append. Only print. Overwrites the file on each item.
writetoEngineer.append(e.toString() + " "  + e.calculateMontly(weeklySal));
17
snnlankrdsm

Je ne vois pas où vous fermez le fichier. Je ne vous vois pas non plus lire quoi que ce soit.

Je suppose que vous souhaitez ajouter au fichier au lieu de le remplacer à chaque fois. Dans ce cas, vous devez utiliser l'option d'ajout de FileOutputStream car ce n'est pas le comportement par défaut.

PrintStream writetoEngineer = new PrintStream(
     new FileOutputStream("Engineer.txt", true)); 

BTW: e.toString() + " " est presque identique à e + " " Sauf qu'il ne lève pas d'exception si e est nul.

43
Peter Lawrey

Étant donné que l'extrait de code donné n'est pas un exemple compilable autonome (il est cependant simple), je peux juste deviner que le PrintStream est créé à l'intérieur de la boucle, pour chaque itération sur la collection Engineer. Cela entraînerait la troncature du fichier comme l'indique le constructeur javadoc de PrintStream:

Paramètres:

fichier - Le fichier à utiliser comme destination de ce flux d'impression. Si le fichier existe, il sera tronqué à zéro; sinon, un nouveau fichier sera créé. La sortie sera écrite dans le fichier et mise en mémoire tampon.

essayez cet exemple de code:

import Java.io.File;
import Java.io.FileNotFoundException;
import Java.io.PrintStream;
import Java.util.ArrayList;
import Java.util.List;


public class PrintEngineers {

    public static class Engineer {

        private final String firstName;
        private final String surName;
        private final int weeklySal;

        public Engineer(String firstName, String surName, int weeklySal) {
            super();
            this.firstName = firstName;
            this.surName = surName;
            this.weeklySal = weeklySal;
        }

        public int calculateMonthly() {
            return weeklySal * 4; // approximately
        }

        @Override
        public String toString() {
            return firstName + " " + surName;
        }
    }

    /**
     * @param args
     * @throws FileNotFoundException 
     */
    public static void main(String[] args) throws FileNotFoundException {

        Engineer e1 = new Engineer("first1", "sur1", 100);
        Engineer e2 = new Engineer("first2", "sur2", 200);
        Engineer e3 = new Engineer("first3", "sur3", 300);

        List<Engineer> engineers = new ArrayList<>(3);
        engineers.add(e1);
        engineers.add(e2);
        engineers.add(e3);

        // instanciate PrintStream here, before the loop starts
        PrintStream writetoEngineer = new PrintStream(new File("Engineer.txt"));
        for (Engineer engineer : engineers) {
            // new PrintStream(...) here truncates the file (see javadoc)               //This is not append.Only print.Refresh file on each item 
            writetoEngineer.append(engineer.toString()).append(' ')
                        .append("" + engineer.calculateMonthly()).append('\n'); 

        }
    }

}
3
yair