如何动态地将文本追加到文本文件中

时间:2013-10-28 09:33:44

标签: java file-io

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

3 个答案:

答案 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"你的循环甚至不会运行一次。还有许多其他问题(例如,您只是试图写回一行,正如评论中提到的另一个人,或者您在循环中不再读取任何行,以及其他问题)。对于这些类型的事情,请精确 你要做什么,然后编写匹配的代码。看起来您想要执行以下操作:

  1. 搜索" [13]"。一旦找到......
  2. 搜索以" key5 ="开头的行,但在遇到新部分(以" ["开头)时停止。如果找到了:
  3. 用" key5 ="替换该行。 +新价值。
  4. 对于你没有替换的每一行,你必须把它写回来(虽然这里的通用公式,除了内存限制,是解析/加载,然后修改,然后写)。

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

    另请注意,某些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运算符