web-dev-qa-db-fra.com

Java Remplacer la ligne dans le fichier texte

Comment remplacer une ligne de texte trouvée dans un fichier texte?

J'ai une chaîne telle que:

Do the dishes0

Et je veux le mettre à jour avec:

Do the dishes1

(et vice versa)

Comment puis-je accomplir cela?

ActionListener al = new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    JCheckBox checkbox = (JCheckBox) e.getSource();
                    if (checkbox.isSelected()) {
                        System.out.println("Selected");
                        String s = checkbox.getText();
                        replaceSelected(s, "1");
                    } else {
                        System.out.println("Deselected");
                        String s = checkbox.getText();
                        replaceSelected(s, "0");
                    }
                }
            };

public static void replaceSelected(String replaceWith, String type) {

}

En passant, je veux remplacer SEULEMENT la ligne qui a été lue. PAS le fichier entier.

25
Eveno

Testé et fonctionne

public static void replaceSelected(String replaceWith, String type) {
    try {
        // input the file content to the StringBuffer "input"
        BufferedReader file = new BufferedReader(new FileReader("notes.txt"));
        String line;
        StringBuffer inputBuffer = new StringBuffer();

        while ((line = file.readLine()) != null) {
            inputBuffer.append(line);
            inputBuffer.append('\n');
        }
        String inputStr = inputBuffer.toString();

        file.close();

        System.out.println(inputStr); // check that it's inputted right

        // this if structure determines whether or not to replace "0" or "1"
        if (Integer.parseInt(type) == 0) {
            inputStr = inputStr.replace(replaceWith + "1", replaceWith + "0"); 
        }
        else if (Integer.parseInt(type) == 1) {
            inputStr = inputStr.replace(replaceWith + "0", replaceWith + "1");
        } 

        // check if the new input is right
        System.out.println("----------------------------------\n"  + inputStr);

        // write the new String with the replaced line OVER the same file
        FileOutputStream fileOut = new FileOutputStream("notes.txt");
        fileOut.write(inputStr.getBytes());
        fileOut.close();

    } catch (Exception e) {
        System.out.println("Problem reading file.");
    }
}

public static void main(String[] args) {
    replaceSelected("Do the dishes", "1");   
}

Contenu du fichier texte original:

Faites la vaisselle0
Nourrir le chien0
Nettoyé ma chambre1

Sortie:

Faire la vaisselle0 
Nourrir le chien0 
Nettoyé ma chambre1 
----------------------------------
Faire la vaisselle1
Nourrir le chien0
Nettoyé ma chambre1

Nouveau contenu du fichier texte:

Faire la vaisselle1
Nourrir le chien0
Nettoyé ma chambre1


Et comme note, si le fichier texte était:

Faire la vaisselle1
Nourrir le chien0
Nettoyé ma chambre1

et vous avez utilisé la méthode replaceSelected("Do the dishes", "1");, Cela ne changerait tout simplement pas le fichier.

31
Michael Yaworski

Depuis Java 7, c'est très facile et intuitif à faire.

List<String> fileContent = new ArrayList<>(Files.readAllLines(FILE_PATH, StandardCharsets.UTF_8));

for (int i = 0; i < fileContent.size(); i++) {
    if (fileContent.get(i).equals("old line")) {
        fileContent.set(i, "new line");
        break;
    }
}

Files.write(FILE_PATH, fileContent, StandardCharsets.UTF_8);

En gros, vous lisez le fichier entier dans une List, éditez la liste et écrivez enfin la liste dans le fichier.

FILE_PATH représente la Path du fichier.

25
Tuupertunut

J'allais répondre à cette question. Ensuite, je l'ai vu devenir un doublon de cette question, après avoir écrit le code, alors je vais poster ma solution ici.

Gardez à l'esprit que vous devez réécrire le fichier texte. D'abord, j'ai lu le fichier entier et je l'ai stocké dans une chaîne. Ensuite, je stocke chaque ligne en tant qu'index d'un tableau de chaînes, ex line one = = index de tableau 0. J'édite ensuite l'index correspondant à la ligne que vous souhaitez éditer. Une fois que cela est fait, je concatène toutes les chaînes du tableau en une seule chaîne. Ensuite, j'écris la nouvelle chaîne dans le fichier, qui écrase l'ancien contenu. Ne craignez plus de perdre votre ancien contenu, car il a été réécrit avec l'édition. ci-dessous est le code que j'ai utilisé.

public class App {

public static void main(String[] args) {

    String file = "file.txt";
    String newLineContent = "Hello my name is bob";
    int lineToBeEdited = 3;

    ChangeLineInFile changeFile = new ChangeLineInFile();
    changeFile.changeALineInATextFile(file, newLineContent, lineToBeEdited);



}

}

Et la classe.

import Java.io.BufferedWriter;
import Java.io.File;
import Java.io.FileNotFoundException;
import Java.io.FileOutputStream;
import Java.io.FileReader;
import Java.io.IOException;
import Java.io.OutputStreamWriter;
import Java.io.UnsupportedEncodingException;
import Java.io.Writer;

public class ChangeLineInFile {

public void changeALineInATextFile(String fileName, String newLine, int lineNumber) {
        String content = new String();
        String editedContent = new String();
        content = readFile(fileName);
        editedContent = editLineInContent(content, newLine, lineNumber);
        writeToFile(fileName, editedContent);

    }

private static int numberOfLinesInFile(String content) {
    int numberOfLines = 0;
    int index = 0;
    int lastIndex = 0;

    lastIndex = content.length() - 1;

    while (true) {

        if (content.charAt(index) == '\n') {
            numberOfLines++;

        }

        if (index == lastIndex) {
            numberOfLines = numberOfLines + 1;
            break;
        }
        index++;

    }

    return numberOfLines;
}

private static String[] turnFileIntoArrayOfStrings(String content, int lines) {
    String[] array = new String[lines];
    int index = 0;
    int tempInt = 0;
    int startIndext = 0;
    int lastIndex = content.length() - 1;

    while (true) {

        if (content.charAt(index) == '\n') {
            tempInt++;

            String temp2 = new String();
            for (int i = 0; i < index - startIndext; i++) {
                temp2 += content.charAt(startIndext + i);
            }
            startIndext = index;
            array[tempInt - 1] = temp2;

        }

        if (index == lastIndex) {

            tempInt++;

            String temp2 = new String();
            for (int i = 0; i < index - startIndext + 1; i++) {
                temp2 += content.charAt(startIndext + i);
            }
            array[tempInt - 1] = temp2;

            break;
        }
        index++;

    }

    return array;
}

private static String editLineInContent(String content, String newLine, int line) {

    int lineNumber = 0;
    lineNumber = numberOfLinesInFile(content);

    String[] lines = new String[lineNumber];
    lines = turnFileIntoArrayOfStrings(content, lineNumber);

    if (line != 1) {
        lines[line - 1] = "\n" + newLine;
    } else {
        lines[line - 1] = newLine;
    }
    content = new String();

    for (int i = 0; i < lineNumber; i++) {
        content += lines[i];
    }

    return content;
}

private static void writeToFile(String file, String content) {

    try (Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "utf-8"))) {
        writer.write(content);
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

private static String readFile(String filename) {
    String content = null;
    File file = new File(filename);
    FileReader reader = null;
    try {
        reader = new FileReader(file);
        char[] chars = new char[(int) file.length()];
        reader.read(chars);
        content = new String(chars);
        reader.close();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (reader != null) {
            try {
                reader.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    return content;
}

}
2
holycatcrusher

Si le remplacement est de longueur différente:

  1. Lisez le fichier jusqu'à ce que vous trouviez la chaîne que vous souhaitez remplacer.
  2. Lire en mémoire la partie après le texte que vous voulez remplacer, le tout.
  3. Tronquez le fichier au début de la partie à remplacer.
  4. Ecrire remplacement.
  5. Écrivez le reste du fichier de l'étape 2.

Si le remplacement est de même longueur:

  1. Lisez le fichier jusqu'à ce que vous trouviez la chaîne que vous souhaitez remplacer.
  2. Définissez la position du fichier au début de la pièce à remplacer.
  3. Ecrire remplacement, écrasant la partie du fichier.

C'est le meilleur que vous puissiez obtenir, avec les contraintes de votre question. Cependant, au moins l’exemple en question remplace une chaîne de même longueur. La deuxième méthode devrait donc fonctionner.

Sachez également que les chaînes Java sont du texte Unicode, tandis que les fichiers texte sont des octets codés. Si le codage est UTF8 et que votre texte n'est pas Latin1 (ou un ASCII 7 bits brut), vous devez vérifier la longueur du tableau d'octets codés et non la longueur de la chaîne Java.

1
hyde

Vous devez obtenir un fichier avec JFileChooser puis lire les lignes du fichier à l’aide d’un scanner et de la fonction hasNext ().

http://docs.Oracle.com/javase/7/docs/api/javax/swing/JFileChooser.html

une fois que vous avez fait cela, vous pouvez enregistrer la ligne dans une variable et manipuler le contenu.

0
Corjava

comment remplacer les chaînes :) comme je le fais premier argument sera le nom de fichier deuxième chaîne cible troisième la chaîne à remplacer à la place de targe

public class ReplaceString{
      public static void main(String[] args)throws Exception {
        if(args.length<3)System.exit(0);
        String targetStr = args[1];
        String altStr = args[2];
        Java.io.File file = new Java.io.File(args[0]);
        Java.util.Scanner scanner = new Java.util.Scanner(file);
        StringBuilder buffer = new StringBuilder();
        while(scanner.hasNext()){
          buffer.append(scanner.nextLine().replaceAll(targetStr, altStr));
          if(scanner.hasNext())buffer.append("\n");
        }
        scanner.close();
        Java.io.PrintWriter printer = new Java.io.PrintWriter(file);
        printer.print(buffer);
        printer.close();
      }
    }
0
amar