-1
[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) {
            //
         }
      }
4

3 回答 3

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
}
于 2013-10-28T09:51:44.740 回答
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”,并且您的循环甚至不会运行一次。还有许多其他问题(例如,正如评论中提到的另一个人所提到的那样,您只尝试写回一行,或者您没有在循环中读取更多行,以及其他问题)。对于这些类型的事情,准确地计算出你想要做什么,然后编写代码来匹配。看起来您想要执行以下操作:

  1. 搜索“[13]”行。一经发现...
  2. 搜索以“key5=”开头的行,但在遇到新部分(以“[”开头)时停止。如果找到:
  3. 将该行替换为 "key5=" + 新值。

对于你触摸的每一行,你不替换,你必须把它写回去(尽管这里的一个通用公式,除非内存限制,是解析/加载,然后修改,然后写)。

所以你会希望你的代码做到这一点。

另请注意,某些 INI 文件解析器实现(假设您将其视为 INI 文件)忽略键和节名称中的空格和/或大小写,因此根据文件的来源,您可能需要考虑到这一点。

顺便说一句,也许考虑使用 INI 文件处理库,例如ini4j,您可以在其中加载文件并直接替换键。请参阅在 Java 中解析 INI 文件的最简单方法是什么?.

于 2013-10-28T09:42:00.483 回答
0

这部分看起来不对:

while (line.contains("key5")) {
    if (line.contains("key5"))

我假设循环条件中缺少 NOT 运算符

于 2013-10-28T09:40:29.627 回答