You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java中用另一文件内容替换目标文件指定XML标签

问题需求

我有两个文件,需要将第一个文件中的指定内容替换为第二个文件的内容:

第一个文件(File1.txt)内容:

<Test>
<Test>56596</Test>
<PMt>851</PMt>
</H>
<Test>5659556</Test>
<H>
<Test>56556</Test>
<PMt>781</PMt>
</H>
<Test>5659556</Test>
</Test>

第二个文件(File2.txt)内容:

<PMt>1</PMt>
<PMt>2</PMt>
<PMt>3</PMt>

期望输出结果:

<Test>
<Test>56596</Test>
<PMt>1</PMt>
</H>
<Test>5659556</Test>
<H>
<Test>56556</Test>
<PMt>2</PMt>
</H>
<Test>5659556</Test>
<PMt>3</PMt>
</Test>
问题所在

我尝试了以下Java代码,但执行后输出文件和原文件内容一致,没有实现预期替换效果:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class ReplaceText {
    public static void main(String[] args) {
        String inputFile = "C:\\Files\\File1.txt";
        //String outputFile = "C:\\Files\\output.txt";
        List<String> searchList = new ArrayList<>();
        searchList.add("<PMt>(.+?)</PMt>");
        searchList.add("<PMt>(.+?)</PMt>");
        List<String> replaceList = new ArrayList<>();
        boolean[] replaced = new boolean[searchList.size()];

        // Read text to replace with from another file
        try (BufferedReader br = new BufferedReader(new FileReader("C:\\Files\\File2.txt"))) {
            String line;
            while ((line = br.readLine()) != null) {
                replaceList.add(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        // Read input file and replace text
        try (BufferedReader br = new BufferedReader(new FileReader(inputFile));
             FileWriter fw = new FileWriter(inputFile)) {
            String line;
            while ((line = br.readLine()) != null) {
                for (int i = 0; i < searchList.size(); i++) {
                    if (!replaced[i]) {
                        String search = searchList.get(i);
                        int index = line.indexOf(search);
                        if (index != -1) {
                            line = line.substring(0, index) + replaceList.get(i) + line.substring(index + search.length());
                            replaced[i] = true;
                        }
                    }
                }
                fw.write(line + System.lineSeparator());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
问题分析与解决方案

你的代码存在三个核心问题:

  1. 同时读写同一文件:用FileWriter直接写入原文件时,文件会被提前清空,导致后续BufferedReader读取的内容不完整甚至为空。
  2. 错误的匹配方式:indexOf是字面量匹配,但你传入的是正则表达式字符串,原文件中不存在这个字面量,自然匹配失败。
  3. 替换次数不足:你只定义了2个搜索项,但原文件有3个<PMt>标签需要替换,第三个标签无法被处理。

修正后的代码如下:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ReplaceText {
    public static void main(String[] args) {
        String inputFile = "C:\\Files\\File1.txt";
        String outputFile = "C:\\Files\\output.txt";
        List<String> replaceList = new ArrayList<>();

        // 读取替换内容,跳过空行
        try (BufferedReader br = new BufferedReader(new FileReader("C:\\Files\\File2.txt"))) {
            String line;
            while ((line = br.readLine()) != null) {
                if (!line.trim().isEmpty()) {
                    replaceList.add(line);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
            return;
        }

        Pattern pmPattern = Pattern.compile("<PMt>.+?</PMt>");
        int replaceIndex = 0;

        // 读取原文件并写入新文件
        try (BufferedReader br = new BufferedReader(new FileReader(inputFile));
             FileWriter fw = new FileWriter(outputFile)) {
            String line;
            while ((line = br.readLine()) != null) {
                Matcher matcher = pmPattern.matcher(line);
                if (matcher.find() && replaceIndex < replaceList.size()) {
                    // 替换当前匹配的<PMt>标签
                    line = matcher.replaceFirst(replaceList.get(replaceIndex));
                    replaceIndex++;
                }
                fw.write(line + System.lineSeparator());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        // (可选)若需要覆盖原文件,添加以下代码(需导入java.nio.file相关类)
        // Files.copy(Paths.get(outputFile), Paths.get(inputFile), StandardCopyOption.REPLACE_EXISTING);
    }
}

修正说明:

  • 分离读写操作:先读取原文件内容,写入到新的输出文件,避免读写冲突。如需覆盖原文件,可在最后添加文件复制逻辑。
  • 正则匹配替换:使用Pattern和Matcher正确匹配<PMt>...</PMt>格式的标签,替代无效的字面量匹配。
  • 动态计数替换:用replaceIndex跟踪当前使用的替换内容,每替换一个标签就推进索引,直到用完所有替换内容。
  • 过滤空行:读取替换文件时跳过空行,避免无效替换。

内容的提问来源于stack exchange,提问作者Ali Murtza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 07:53:12