我有一个文件(更具体地说是一个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>
我认为对于这种类型的实现可以使用哈希映射吗?
任何体面的文本编辑器都具有支持正则表达式的搜索和替换功能。
但是,如果您有理由重新发明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中有记录
IOUtils