web-dev-qa-db-fra.com

Modifier le contenu d'un fichier avec Java

Je veux supprimer un contenu de fichier en utilisant le programme Java comme ci-dessous. Est-ce la méthode d'écriture à remplacer dans le même fichier ou doit-elle être copiée dans un autre fichier? 

Mais sa suppression de tout le contenu du fichier.

class FileReplace
{
    ArrayList<String> lines = new ArrayList<String>();
    String line = null;
    public void  doIt()
    {
        try
        {
            File f1 = new File("d:/new folder/t1.htm");
            FileReader fr = new FileReader(f1);
            BufferedReader br = new BufferedReader(fr);
            while (line = br.readLine() != null)
            {
                if (line.contains("Java"))
                    line = line.replace("Java", " ");
                lines.add(line);
            }
            FileWriter fw = new FileWriter(f1);
            BufferedWriter out = new BufferedWriter(fw);
            out.write(lines.toString());
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
    }
    public statc void main(String args[])
    {
        FileReplace fr = new FileReplace();
        fr.doIt();
    }
}
6
Adesh singh

Je commencerais par fermer le lecteur et l'écrivain:

public class FileReplace {
    List<String> lines = new ArrayList<String>();
    String line = null;

    public void  doIt() {
        try {
            File f1 = new File("d:/new folder/t1.htm");
            FileReader fr = new FileReader(f1);
            BufferedReader br = new BufferedReader(fr);
            while ((line = br.readLine()) != null) {
                if (line.contains("Java"))
                    line = line.replace("Java", " ");
                lines.add(line);
            }
            fr.close();
            br.close();

            FileWriter fw = new FileWriter(f1);
            BufferedWriter out = new BufferedWriter(fw);
            for(String s : lines)
                 out.write(s);
            out.flush();
            out.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public static void main(String args[]) {
        FileReplace fr = new FileReplace();
        fr.doIt();
    }
}
12
Mateusz

La réponse acceptée est géniale. Cependant, il existe un moyen plus simple de remplacer le contenu d'un fichier à l'aide de la bibliothèque commons-io d'Apache (commons-io-2.4.jar - vous pouvez utiliser n'importe quelle version récente).

private void update() throws IOException{
        File file = new File("myPath/myFile.txt");
        String fileContext = FileUtils.readFileToString(file);
        fileContext = fileContext.replaceAll("_PLACEHOLDER_", "VALUE-TO-BE-REPLACED");
        FileUtils.write(file, fileContext);
 }

Remarque: Thrown IOException doit être capturé et traité par l'application en conséquence.

9
Sandeep Salian

Lire + écrire simultanément sur le même fichier n’est pas correct.

EDIT: reformuler et être plus correct et plus spécifique - lire et écrire dans le même fichier, dans le même fil, sans fermer correctement le lecteur (et laisser filer le scripteur) n’est pas acceptable.

3
acostache

Assurez-vous de:

  • close n'importe quel flux lorsque vous n'en avez plus besoin
  • En particulier avant le rouvrir pour écrire.
  • truncate le fichier, pour vous assurer qu'il est réduit si vous écrivez moins que ce qu'il était.
  • puis écrire la sortie
  • écrire des lignes individuelles, ne comptez pas sur toString.
  • flush et close lorsque vous avez fini d'écrire!

Si vous utilisez buffered IO, vous devez toujours vous assurer que le tampon est vidé à la fin, sinon vous risquez de perdre des données!

2
Anony-Mousse

Je peux voir trois problèmes.

D'abord, vous écrivez dans out qui, je suppose, est System.out et non un flux de sortie dans le fichier.

Deuxièmement, si vous écrivez dans un flux de sortie dans le fichier, vous devez le fermer.

Troisièmement, la méthode toString() sur une ArrayList ne va pas écrire le fichier comme prévu. Faites une boucle sur la liste et écrivez chaque String une à la fois. Demandez-vous également si vous devez écrire des caractères de nouvelle ligne.

0
Qwerky

La réponse acceptée est légèrement fausse. Voici le bon code.

    public class FileReplace {
List<String> lines = new ArrayList<String>();
String line = null;

public void  doIt() {
    try {
        File f1 = new File("d:/new folder/t1.htm");
        FileReader fr = new FileReader(f1);
        BufferedReader br = new BufferedReader(fr);
        while ((line = br.readLine()) != null) {
            if (line.contains("Java"))
                line = line.replace("Java", " ");
            lines.add(line);
        }
        fr.close();
        br.close();

        FileWriter fw = new FileWriter(f1);
        BufferedWriter out = new BufferedWriter(fw);
        for(String s : lines)
             out.write(s);
        out.flush();
                } 
        out.close();
   catch (Exception ex) {
        ex.printStackTrace();
    }
}
0
Ravi K M