web-dev-qa-db-fra.com

Comment ajouter une nouvelle ligne de texte à un fichier existant en Java?

Je voudrais ajouter une nouvelle ligne à un fichier existant sans effacer les informations actuelles de ce fichier. En bref, voici la méthodologie que j'utilise l'heure actuelle:

import Java.io.BufferedWriter;
import Java.io.FileWriter;
import Java.io.Writer;

Writer output;
output = new BufferedWriter(new FileWriter(my_file_name));  //clears file every time
output.append("New Line!");
output.close();

Le problème avec les lignes ci-dessus est simplement qu'ils effacent tout le contenu de mon fichier existant puis ajoutent le texte de la nouvelle ligne.

Je veux ajouter du texte à la fin du contenu d'un fichier sans rien effacer ni remplacer.

79
CompilingCyborg

vous devez ouvrir le fichier en mode annexe, ce qui peut être obtenu à l'aide du constructeur FileWriter(String fileName, boolean append).

output = new BufferedWriter(new FileWriter(my_file_name, true));

devrait faire l'affaire

117
Mario F

La solution avec FileWriter fonctionne, cependant vous n’avez pas la possibilité de spécifier le codage de sortie, auquel cas le codage par défaut pour la machine sera utilisé, et il ne s’agit généralement pas d’UFF-8!

Donc, au mieux, utilisez FileOutputStream:

    Writer writer = new BufferedWriter(new OutputStreamWriter(
        new FileOutputStream(file, true), "UTF-8"));
24
Danubian Sailor

Essayez: "\ r\n"

exemple de Java 7:

// append = true
try(PrintWriter output = new PrintWriter(new FileWriter("log.txt",true))) 
{
    output.printf("%s\r\n", "NEWLINE");
} 
catch (Exception e) {}
11
Stofkn

À partir de Java 7 :

Définissez un chemin et la chaîne contenant le séparateur de ligne au début:

_Path p = Paths.get("C:\\Users\\first.last\\test.txt");
String s = System.lineSeparator() + "New Line!";
_

et vous pouvez ensuite utiliser l'une des approches suivantes:

  1. Utilisation de Files.write (petits fichiers):

    _try {
        Files.write(p, s.getBytes(), StandardOpenOption.APPEND);
    } catch (IOException e) {
        System.err.println(e);
    }
    _
  2. Utilisation de Files.newBufferedWriter (fichiers texte):

    _try (BufferedWriter writer = Files.newBufferedWriter(p, StandardOpenOption.APPEND)) {
        writer.write(s);
    } catch (IOException ioe) {
        System.err.format("IOException: %s%n", ioe);
    }
    _
  3. Utilisation de Files.newOutputStream (interopérable avec _Java.io_ API):

    _try (OutputStream out = new BufferedOutputStream(Files.newOutputStream(p, StandardOpenOption.APPEND))) {
        out.write(s.getBytes());
    } catch (IOException e) {
        System.err.println(e);
    }
    _
  4. Utilisation de Files.newByteChannel (fichiers à accès aléatoire):

    _try (SeekableByteChannel sbc = Files.newByteChannel(p, StandardOpenOption.APPEND)) {
        sbc.write(ByteBuffer.wrap(s.getBytes()));
    } catch (IOException e) {
        System.err.println(e);
    }
    _
  5. Utilisation de FileChannel.open (fichiers à accès aléatoire):

    _try (FileChannel sbc = FileChannel.open(p, StandardOpenOption.APPEND)) {
        sbc.write(ByteBuffer.wrap(s.getBytes()));
    } catch (IOException e) {
        System.err.println(e);
    }
    _

Des détails sur ces méthodes sont disponibles dans le tutoriel d'Oracle .

11
ROMANIA_engineer

Si vous recherchez une méthode de copier/coller permettant de créer et d'écrire dans un fichier, en voici une que j'ai écrite et qui nécessite simplement une entrée String. Supprimez 'true' de PrintWriter si vous souhaitez écraser le fichier à chaque fois.

private static final String newLine = System.getProperty("line.separator");

private synchronized void writeToFile(String msg)  {
    String fileName = "c:\\TEMP\\runOutput.txt";
    PrintWriter printWriter = null;
    File file = new File(fileName);
    try {
        if (!file.exists()) file.createNewFile();
        printWriter = new PrintWriter(new FileOutputStream(fileName, true));
        printWriter.write(newLine + msg);
    } catch (IOException ioex) {
        ioex.printStackTrace();
    } finally {
        if (printWriter != null) {
            printWriter.flush();
            printWriter.close();
        }
    }
}
4
MattC

Sur la ligne 2, changez new FileWriter(my_file_name) en new FileWriter(my_file_name, true) pour que vous ajoutiez au fichier plutôt que de l'écraser.

File f = new File("/path/of/the/file");
        try {
            BufferedWriter bw = new BufferedWriter(new FileWriter(f, true));
            bw.append(line);
            bw.close();
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
3
Tim Niblett

Vous pouvez utiliser le constructeur FileWriter(String fileName, boolean append) si vous souhaitez ajouter des données au fichier.

Changez votre code pour ceci:

output = new BufferedWriter(new FileWriter(my_file_name, true));

De FileWriter javadoc:

Construit un objet FileWriter à partir d'un nom de fichier. Si le deuxième argument est true, les octets seront alors écrits à la fin du fichier plutôt qu'au début.

2
Buhake Sindi