Java 如何将文本动态附加到文本文件中

Java 如何将文本动态附加到文本文件中,java,file-io,Java,File Io,我想更新key5=val5where[13] [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 这部分看起来不对: try { br = new BufferedReader(new FileRead

我想更新
key5=val5
where
[13]

[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
这部分看起来不对:

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

我假设NOT运算符在循环条件中丢失

您确实需要在头脑中逐步了解您的逻辑;在代码中:

while (line.contains("key5")) {
    if (line.contains("key5"))
试着把它写在一张纸或什么东西上,然后跟着写。例如,查看
while(line.contains(“key5”)
循环。如果该行包含“[13]”,则它不包含“key5”,并且循环甚至不会运行一次。还有许多其他问题(例如,正如其他人在评论中提到的,您只尝试写回一行,或者您没有在循环中阅读更多行,等等)。对于这些类型的事情,精确地计算出您想要做什么,然后编写匹配的代码。看起来您要执行以下操作:

if (line.contains("[13]"))
{
    while (line.contains("key5")) {
    //etc....
  • 搜索行“[13]”。一旦发现
  • 搜索以“key5=”开头的行,但遇到新节(以“[”)开头)时停止。如果找到该行:
  • 将该行替换为“key5=“+新值”
  • 对于您触摸到的未替换的每一行,您必须将其写回(尽管这里有一个通用公式,排除内存限制,即解析/加载,然后修改,然后写入)

    因此,您希望您的代码能够做到这一点

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


    顺便说一下,也许考虑使用一个INI文件处理库,例如,您可以在其中直接加载文件并替换密钥。参见./P> < P>此代码块是有问题的:

    if (line.contains("[13]")) {
        while (line.contains("key5")) {
            if (line.contains("key5")) {
                line = line.replace("key5", "key5= Val5");
                bw.write(line+"\n");
            }
        }
    }
    
    因为没有同时包含[13]和键5的行(它们在单独的行上),所以永远不会进入while循环

    相反,当遇到第[13]行时,需要记住它并将标志存储在布尔值中,如下所示:

    if (line.contains("[13]"))
    {
        while (line.contains("key5")) {
        //etc....
    

    问题是什么?你看到了什么样的输出,它与你期望的有什么不同?我已经更新了我的帖子。顺便说一下,你可能想看看这样的东西,尽管一般来说,先温习一下你的逻辑技能会有帮助(我仍然建议你修改代码,如果只是为了学习经验的话)。您不必将状态存储在标志中,您可以像OP尝试的那样使用嵌套或连续循环来实现。但是,标志将导致更清晰、更灵活的代码。顺便说一句,您需要
    .equals(“[13]”)和
    .startsWith(“key5=”)
    (在这两种情况下都不区分大小写和空格,INI解析器实现在这些细节上有所不同)。不,我实际上是指line.startsWith(“[”),以便在遇到[14]等时清除标志。不使用标志的问题是当第[13]行遇到时,它将输入if块,但不会输入while块,因为key5位于单独的行上。当它到达key5时,if块将被跳过,因为该行上不会有[13]。[13]和key5位于两个单独的行上。我不清楚;这不是我指出的行。目前,您的代码将看到例如。“key=[13]”作为本节的开头,而“key1=somekey5”或“key50=which”作为替换行。我的意思是:您的
    .contains(“[13]”)应该是
    .equals(“[13]”)而
    .contains(“key5”)
    应该是
    .startsWith(“key5=”
    。您的
    .startsWith([”)
    是正确的。对此表示抱歉。是的,这是公平的。我将进行相应的编辑。感谢Jason C和NickJ,您的评论帮助了我。如果条件相同,那么等待一段时间是没有意义的。此外,如果有一行同时包含[13]和键5(没有),while循环将永远不会退出。我当然同意。我发布的代码是OP代码的一个片段,未经编辑,旨在引起人们对我所说的内容的注意。这不是我自己的更改建议。我误解了,对此表示抱歉。删除了否决票。+1