Java Remplace 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 à:

Do the dishes1

(et vice versa)

Comment puis-je accomplir ceci?

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) {

}

au fait, je ne veux remplacer que la ligne qui a été lue. PAS la totalité du fichier.

24
demandé sur Eveno 2013-11-18 08:15:39

6 réponses

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");   
}

Faire le dishes0

Nourrir les dog0

Nettoyé mon room1

Sortie:

Faire le dishes0

Nourrir les dog0

Nettoyé mon room1

----------------------------------

Faire le dishes1

Nourrir le dog0

Nettoyé mon room1

Nouveau fichier texte contenu:

Faire le dishes1

Nourrir les dog0

Nettoyé mon room1


et sous forme de note, si le fichier texte était:

Faire le dishes1

Nourrir les dog0

Nettoyé mon room1

replaceSelected("Do the dishes", "1");, il serait juste de ne pas modifier le fichier.

27
répondu Michael Yaworski 2017-03-31 13:14:27

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 à un List, édite la liste et réécrit la liste au fichier.

FILE_PATH représente Path du fichier.

25
répondu Tuupertunut 2016-06-03 22:02:23

Si le remplacement est de longueur différente:

  1. lire le fichier jusqu'à ce que vous trouviez la chaîne que vous voulez remplacer.
  2. lire en mémoire la partie après texte que vous souhaitez remplacer, tout ça.
  3. Tronquer le fichier au début de la partie que vous souhaitez remplacer.
  4. remplacement D'écriture.
  5. Écriture reste du fichier à partir de l'étape 2.

Si le remplacement est de même longueur:

  1. Lire le fichier jusqu'à ce que vous trouver la chaîne que vous souhaitez remplacer.
  2. définir la position du fichier au début de la partie que vous voulez remplacer.
  3. remplacement de L'écriture, réécriture d'une partie du fichier.

C'est le meilleur que vous pouvez obtenir, avec des contraintes de votre question. Cependant, au moins l'exemple en question Est en train de remplacer une chaîne de même longueur, donc la seconde méthode devrait fonctionner.

attention aussi: les chaînes Java sont du texte Unicode, tandis que les fichiers texte sont des octets avec un certain encodage. Si l'encodage est UTF8, et votre texte n'est pas Latin1 (ou ASCII 7 bits), vous devez vérifier la longueur du tableau des octets encodés, pas la longueur de la chaîne Java.

1
répondu hyde 2013-11-18 05:58:39

j'allais répondre à cette question. Puis je l'ai vu marqués comme un double de cette question, après que j'ai écrit le code, donc je vais poster ma solution ici.

en gardant à l'esprit que vous devez réécrire le fichier texte. D'abord, je lis tout le fichier, et je le stocke dans une chaîne. Puis-je stocker chaque ligne comme un indice d'un tableau de chaînes, ex ligne = array index 0. J'ai ensuite modifier l'index correspondant à la ligne que vous souhaitez modifier. Une fois cela fait, je concaténate tous les des chaînes dans le tableau en une chaîne unique. Puis j'écris la nouvelle chaîne dans le fichier, qui écrit sur l'ancien contenu. Ne vous inquiétez pas de perdre votre ancien contenu comme il a été écrit à nouveau avec l'édition. ci-dessous 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;
}

}
1
répondu holycatcrusher 2016-10-16 22:02:15

Eh bien, vous devez obtenir un fichier avec JFileChooser et ensuite lire à travers les lignes du fichier en utilisant un scanner et la fonction hasNext ()

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

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

0
répondu Corjava 2013-11-18 04:23:14

juste comment remplacer les cordes :) comme je le fais le premier arg sera filename le deuxième target string le troisième sera la chaîne à remplacer au lieu 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
répondu amar 2017-10-25 15:32:17