Java替换文本文件中的行

新手上路,请多包涵

如何替换文本文件中的一行文本?

我有一个字符串,例如:

 Do the dishes0

我想更新它:

 Do the dishes1

(反之亦然)

我该如何做到这一点?

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

}

顺便说一句,我只想替换已读取的行。不是整个文件。

原文由 Eveno 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 725
2 个回答

在底部,我有一个通用的解决方案来替换文件中的行。但首先,这里是手头具体问题的答案。辅助功能:

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

然后调用它:

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


原始文本文件内容:

洗碗0

喂狗0

打扫我的房间1

输出:

洗碗0

喂狗0

打扫我的房间1


洗碗1

喂狗0

打扫我的房间1

新文本文件内容:

洗碗1

喂狗0

打扫我的房间1


作为说明,如果文本文件是:

洗碗1

喂狗0

打扫我的房间1

并且您使用了方法 replaceSelected("Do the dishes", "1"); ,它不会更改文件。


由于这个问题非常具体,我将在这里为未来的读者添加一个更通用的解决方案(基于标题)。

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

原文由 Michael Yaworski 发布,翻译遵循 CC BY-SA 4.0 许可协议

从 Java 7 开始,这非常简单直观。

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

基本上,您将整个文件读入 List ,编辑列表,最后将列表写回文件。

FILE_PATH 代表文件的 Path

原文由 Tuupertunut 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题