use*_*811 53 java replace hashmap find
我有一个文件(更具体地说,一个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
Run Code Online (Sandbox Code Playgroud)
我希望能够读取该文件并将'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>
Run Code Online (Sandbox Code Playgroud)
我在想这种类型的实现可能会使用哈希映射吗?
mer*_*ike 134
任何体面的文本编辑器都有一个支持正则表达式的搜索和替换工具.
但是,如果您有理由在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));
Run Code Online (Sandbox Code Playgroud)
这仅适用于Java 7或更高版本.如果您遇到旧的Java,您可以:
String content = IOUtils.toString(new FileInputStream(myfile), myencoding);
content = content.replaceAll(myPattern, myReplacement);
IOUtils.write(content, new FileOutputStream(myfile), myencoding);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您需要添加错误处理并在完成后关闭流.
IOUtils记录在http://commons.apache.org/proper/commons-io/javadocs/api-release/org/apache/commons/io/IOUtils.html
oji*_*oad 18
在访问了这个问题并注意到所选解决方案的初始问题之后,我想我会为那些不使用Java 7而不是来自Apache Commons的IOUtils的Java 7做出贡献.这里的优点是readFileToString和writeStringToFile自动处理关闭文件的问题.(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);
}
Run Code Online (Sandbox Code Playgroud)