Search code examples
javabufferedreaderfilewriter

FileWriter / BufferedReader Java word finder


I have this code set up and I am trying to write a program that looks through a file and finds a specific hidden secret word then replaces the word with "found!" then re-prints the text file in the console. I know how to use reader and writer but I am unsure how i can use them in unison to do this. Code is as follows:

Reader Class:

package Main;

import java.io.*;

public class Read {

private static String line;
FileReader in;
File file;

public Read() {
    line = "";
}
public void readFile() throws IOException {
    file = new File("C:examplePathName\\ReadWriteExp.txt");
    in = new FileReader(file);
    BufferedReader br = new BufferedReader(in);
    while((line = br.readLine()) != null) {
        System.out.println(line);
    }
    in.close();
}


public String getLine() {
    return line;
}

public File getFile() {
    return file;
}

}

Writer(change) class:

package Main;

import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class Change {

public static void main(String[] args) throws IOException{
    Read r = new Read();

    String line = r.getLine();
    FileWriter fw = new FileWriter(r.getFile());
    while(line != null) {
        if(line.equals("example")) {
            fw.write("found!");

        }
        System.out.println(line);
    }

}

}

Am i on the right path or should i combine both of these into one class. Also is this the proper way of writing to a specific line in a text file?


Solution

  • If the file is a reasonable size, you can read it into memory, change what you need and write it back out again:

    public static void replaceOccurrences(String match, String replacement, Path path) throws IOException {
        Files.write(path, Files.lines(path).map(l -> {
            if(l.contains(match)) {
                return l.replace(match, replacement);
            } else {
                return l;
            }
        }).collect(Collectors.toList()));
    }
    

    Alternatively, if you know that the search term occurs only once and you just need to find the position of the occurrence, use the following:

    try(BufferedReader reader = Files.newBufferedReader(path)) {
        int lineIndex = 0;
        String line;
        while(!(line = reader.readLine()).contains(match)) {
            lineIndex++;
        }
        System.out.println(lineIndex); // line which contains match, 0-indexed
        System.out.println(line.indexOf(match)); // starting position of match in line, 0-indexed
    }