user6399403
user6399403

Reputation:

Write to a specific line in a txt document java

I know that there are already some posts about this problem but I don't understand them. My problem is that I want to find a line in a txt document with a name and I then want to change the next line to the content of a string.

This is what I tried:

public void saveDocument(String name) {

    String documentToSave = textArea1.getText();

    File file = new File("documents.txt");

    Scanner scanner;

    BufferedWriter bw;

    try {

        scanner = new Scanner(file);

        bw = new BufferedWriter(new FileWriter(file));

        while(scanner.hasNextLine()) {

            if(scanner.nextLine().equals(name)) {

                if(scanner.hasNextLine()) bw.write(scanner.nextLine() + "\n");
                bw.write(documentToSave + "\n");
                if(scanner.hasNextLine()) scanner.nextLine();

            }

            if(scanner.hasNextLine()) bw.write(scanner.nextLine() + "\n");

        }

        bw.flush();
        bw.close();

    } catch (IOException e) {

        e.printStackTrace();

    }

}

Upvotes: 0

Views: 1120

Answers (3)

Niklas Rosencrantz
Niklas Rosencrantz

Reputation: 26681

This program will replace the line after a given line. It needs some more work from us, for example if we can define expected i/o and usage. Now it reads from a file and reeplaces a line, but maybe you want to use the line number instead of the line contents to mark which line to replace.

import java.io.*;
public class FileLineReplace {
 public static void replaceSelected(String replaceWith, String type) {
  try {
   String input2 = "";
   boolean replace = false;

   String input = "";

   try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))) {
    for (String line;
     (line = br.readLine()) != null;) {
     // process the line.


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


     if (replace) {

      line = "*** REPLACED ***";
      replace = false;
     }

     if (line.indexOf("replaceNextLine") > -1) {

      replace = true;
     }


     input2 = input2 += (line + "\n");

    }
    // line is not visible here.
   }






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

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

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

 public static void main(String[] args) {
  replaceSelected("1 adam 20 M", "foobar");
 }
} 

If you run the code, it will replace next line after a line which is "replaceNextLine":

$ java FileLineReplace 
asd
zxc
xcv
replaceNextLine
wer
qwe
----------------------------------
asd
zxc
xcv
replaceNextLine
*** REPLACED ***
qwe

My test file is (was)

asd
zxc
xcv
replaceNextLine
wer
qwe

After I run the program, the file looks like this and the line after the specified line is replaced.

asd
zxc
xcv
replaceNextLine
*** REPLACED ***
qwe

Upvotes: 0

Eritrean
Eritrean

Reputation: 16508

May be you try it this way: read your file and keep each line in a list of strings and if you find the name you are looking for replace the next line you read. And then write the strings from that list back to your file. Example:

public class NewClass {
   public static void main(String[] args) {
      List<String> list = new ArrayList<String>();
      list = readFile("uzochi");
      writeToFile(list);
   }

public static  List<String> readFile(String name){
    List<String> list = new ArrayList<String>();
    try {
        FileReader reader = new FileReader("C:\\users\\uzochi\\desktop\\txt.txt");
        BufferedReader bufferedReader = new BufferedReader(reader);

        String line;
        boolean nameFound = false;

        while ((line = bufferedReader.readLine()) != null) {
            if(line.equalsIgnoreCase(name)){
                nameFound = true;
                System.out.println("searched name: "+line);
            }
                if(nameFound){                        
                    list.add(line);

                    line = bufferedReader.readLine();
                    System.out.println("line to replace: " + line);
                    line = "another string";
                    System.out.println("replaced line: "+line);
                    list.add(line);
                    nameFound = false;
                }
                else{
                    list.add(line);
                }
        }
        reader.close();

    } catch (IOException e) {
        e.printStackTrace();
    }
    return list;
}

public static void writeToFile(List<String> list){
    try {
            FileWriter writer = new FileWriter("C:\\users\\uzochi\\desktop\\txt.txt", false);
            BufferedWriter bufferedWriter = new BufferedWriter(writer);
            for(String s: list){
                bufferedWriter.write(s);
                bufferedWriter.newLine();
            } 

            bufferedWriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

txt.txt

hallo
hello
hola
uzochi
world
java
print

Upvotes: 1

OneCricketeer
OneCricketeer

Reputation: 192023

This code should read the entire file and replace the line with the name.

while(scanner.hasNextLine()) {
    String line = scanner.nextLine();

    if(line.equals(name)) {
        bw.write(documentToSave + "\n");
   } else {
        bw.write(line + "\n");
  } 
}  

Upvotes: 0

Related Questions