[12]
key1=val1
key2=val2
key3=val3
key4=val4
key5=val5
[13]
key1=val1
key2=val2
key3=val3
key4=val4
key5=xyz
[14]
key1=val1
key2=val2
key3=val3
key4=val4
key5=val5
我想要key5=val5
更新[13]
。
try {
br = new BufferedReader(new FileReader(oldFileName));
bw = new BufferedWriter(new FileWriter(tmpFileName));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
if (line.contains("[13]"))
{
while (line.contains("key5")) {
if (line.contains("key5"))
{
line = line.replace("key5", "key5= Val5");
bw.write(line+"\n");
}
}
}
}
} catch (Exception e) {
return;
} finally {
try {
if(br != null)
br.close();
} catch (IOException e) {
//
}
try {
if(bw != null)
bw.close();
} catch (IOException e) {
//
}
}
答案 0 :(得分:2)
这段代码存在问题:
if (line.contains("[13]"))
{
while (line.contains("key5")) {
//etc....
因为没有包含[13]和key5(它们在不同的行上)的行,所以永远不会输入while循环。
相反,当遇到第[13]行时,必须记住它并将标志存储在布尔值中,如下所示:
boolean in13 = false;
//... other lines...
if (line.equals("[13]")) {
in13 = true;
} else if (line.startsWith("[")) {
in13 = false; //another block started, clear flag
}
if (in13 && line.startsWith("key5=")) {
// you've found it
}
答案 1 :(得分:1)
你真的需要在脑海中逐步掌握你的逻辑;在你的代码中:
if (line.contains("[13]")) {
while (line.contains("key5")) {
if (line.contains("key5")) {
line = line.replace("key5", "key5= Val5");
bw.write(line+"\n");
}
}
}
尝试在一张纸或其他东西上写下来然后跟着它。例如,查看您的while (line.contains("key5"))
循环。如果该行包含" [13]"然后它不包含" key5"你的循环甚至不会运行一次。还有许多其他问题(例如,您只是试图写回一行,正如评论中提到的另一个人,或者您在循环中不再读取任何行,以及其他问题)。对于这些类型的事情,请精确 你要做什么,然后编写匹配的代码。看起来您想要执行以下操作:
对于你没有替换的每一行,你必须把它写回来(虽然这里的通用公式,除了内存限制,是解析/加载,然后修改,然后写)。
所以你希望你的代码能够做到这一点。
另请注意,某些INI文件解析器实现(假设您将其视为INI文件)忽略键和节名称中的空格和/或大小写,因此根据文件的来源,您可能需要考虑到了。
顺便说一句,也许可以考虑使用INI文件处理库,例如ini4j,您可以在其中加载文件并直接替换密钥。请参阅What is the easiest way to parse an INI file in Java?。
答案 2 :(得分:0)
这部分看起来不对:
while (line.contains("key5")) {
if (line.contains("key5"))
我假设在循环条件中缺少NOT运算符