javareplacelinejcheckbox

Java Replace Line In Text File


How do I replace a line of text found within a text file?

I have a string such as:

Do the dishes0

And I want to update it with:

Do the dishes1

(and vise versa)

How do I accomplish this?

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

}

By the way, I want to replace ONLY the line that was read. NOT the entire file.


Solution

  • At the bottom, I have a general solution to replace lines in a file. But first, here is the answer to the specific question at hand. Helper function:

    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"));
            StringBuffer inputBuffer = new StringBuffer();
            String line;
    
            while ((line = file.readLine()) != null) {
                inputBuffer.append(line);
                inputBuffer.append('\n');
            }
            file.close();
            String inputStr = inputBuffer.toString();
    
            System.out.println(inputStr); // display the original file for debugging
    
            // logic to replace lines in the string (could use regex here to be generic)
            if (type.equals("0")) {
                inputStr = inputStr.replace(replaceWith + "1", replaceWith + "0"); 
            } else if (type.equals("1")) {
                inputStr = inputStr.replace(replaceWith + "0", replaceWith + "1");
            }
    
            // display the new file for debugging
            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.");
        }
    }
    

    Then call it:

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

    Original Text File Content:

    Do the dishes0
    Feed the dog0
    Cleaned my room1

    Output:

    Do the dishes0
    Feed the dog0
    Cleaned my room1
    ----------------------------------
    Do the dishes1
    Feed the dog0
    Cleaned my room1

    New text file content:

    Do the dishes1
    Feed the dog0
    Cleaned my room1


    And as a note, if the text file was:

    Do the dishes1
    Feed the dog0
    Cleaned my room1

    and you used the method replaceSelected("Do the dishes", "1");, it would just not change the file.


    Since this question is pretty specific, I'll add a more general solution here for future readers (based on the title).

    // read file one line at a time
    // replace line as you read the file and store updated lines in StringBuffer
    // overwrite the file with the new lines
    public static void replaceLines() {
        try {
            // input the (modified) file content to the StringBuffer "input"
            BufferedReader file = new BufferedReader(new FileReader("notes.txt"));
            StringBuffer inputBuffer = new StringBuffer();
            String line;
    
            while ((line = file.readLine()) != null) {
                line = ... // replace the line here
                inputBuffer.append(line);
                inputBuffer.append('\n');
            }
            file.close();
    
            // write the new string with the replaced line OVER the same file
            FileOutputStream fileOut = new FileOutputStream("notes.txt");
            fileOut.write(inputBuffer.toString().getBytes());
            fileOut.close();
    
        } catch (Exception e) {
            System.out.println("Problem reading file.");
        }
    }