查找和替换文件中的单词/行

2022-08-31 14:50:28

我有一个文件(更具体地说,一个log4j配置文件),我希望能够读取该文件并挑选出代码中的某些行并替换它们。例如,文件中有一个文本字符串,指示它所在的目录或记录器的级别。我希望能够替换这些文本字符串,而无需读取文件,将其写入另一个文件并删除原始文件。有没有更有效的方法来使用Java查找和替换文件中的文本?

以下是我尝试使用的文本文件的示例:

log4j.rootLogger=DEBUG, A0

log4j.appender.A0=org.apache.log4j.RollingFileAppender
log4j.appender.A0.File=C:/log.txt
log4j.appender.A0.MaxFileSize=100KB
log4j.appender.A0.MaxBackupIndex=1

log4j.appender.A0.layout=org.apache.log4j.RollingFileAppender
log4j.appender.A0.layout.ConversionPattern=%-4r [%t] %-5p: %c %x - %m%n

我希望能够读取文件并将“DEBUG”替换为另一个级别或替换文件目录名称“C:/log.txt”。日志配置文件也以 xml 格式写入。下面提供了一个示例。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration>
    <appender class="org.apache.log4j.RollingFileAppender" name="A0">
        <param name="append" value="false"/>
        <param name="File" value="C:/log/.txt"/>
        <param name="MaxBackupIndex" value="1"/>
        <param name="MaxFileSize" value="100KB"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-4r [%t] %-5p: %c %x - %m%n"/>
        </layout>
    </appender>
    <root>
        <level value="DEBUG"/>
        <appender-ref ref="A0"/>
    </root>
</log4j:configuration>

我认为可以使用哈希映射来实现这种类型的实现?


答案 1

任何像样的文本编辑器都有一个支持正则表达式的搜索和替换工具。

但是,如果您有理由在Java中重新发明轮子,则可以执行以下操作:

Path path = Paths.get("test.txt");
Charset charset = StandardCharsets.UTF_8;

String content = new String(Files.readAllBytes(path), charset);
content = content.replaceAll("foo", "bar");
Files.write(path, content.getBytes(charset));

这仅适用于Java 7或更高版本。如果您卡在较旧的Java上,您可以执行以下操作:

String content = IOUtils.toString(new FileInputStream(myfile), myencoding);
content = content.replaceAll(myPattern, myReplacement);
IOUtils.write(content, new FileOutputStream(myfile), myencoding);

在这种情况下,您需要添加错误处理并在完成流后关闭流。

IOUtils记录在 http://commons.apache.org/proper/commons-io/javadocs/api-release/org/apache/commons/io/IOUtils.html


答案 2

在访问了这个问题并注意到所选解决方案的最初问题之后,我想我会为那些不使用Java 7的人贡献这个解决方案,Java 7使用FileUtils而不是Apache Commons的IOUtils。这里的优点是readFileToStringdeverStringToFile处理自动为您关闭文件的问题。(writeStringToFile 不会记录它,但你可以读取源代码)。希望这个食谱能为任何新来解决这个问题的人简化事情。

  try {
     String content = FileUtils.readFileToString(new File("InputFile"), "UTF-8");
     content = content.replaceAll("toReplace", "replacementString");
     File tempFile = new File("OutputFile");
     FileUtils.writeStringToFile(tempFile, content, "UTF-8");
  } catch (IOException e) {
     //Simple exception handling, replace with what's necessary for your use case!
     throw new RuntimeException("Generating file failed", e);
  }