如何在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(); } } }
问题分析与解决方案
你的代码存在三个核心问题:
- 同时读写同一文件:用
FileWriter直接写入原文件时,文件会被提前清空,导致后续BufferedReader读取的内容不完整甚至为空。 - 错误的匹配方式:
indexOf是字面量匹配,但你传入的是正则表达式字符串,原文件中不存在这个字面量,自然匹配失败。 - 替换次数不足:你只定义了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
相关产品推荐
相关产品推荐

