【问题标题】:search a string in file and insert content above在文件中搜索字符串并在上面插入内容
【发布时间】:2012-11-16 12:07:24
【问题描述】:

我尝试在 txt 文件中搜索一个字符串并在其上方插入一些特定内容。 遗憾的是,输出看起来与我的预期完全不同。

有人可以给我一个提示吗?
这就是我有多远!

    String description= "filename.txt";
    String comparison="    return model;";
    RandomAccessFile output = null;
        try
        {
          output = new RandomAccessFile(description, "rw" );
          String line = null;
          while ((line = output.readLine()) != null) {
                  if (line.equals(comparison)){
                      //System.out.println("alt: "+line);
                      output.seek(output.getFilePointer()-line.getBytes().length);
                      output.writeChars("new stuff; \n");
                      //System.out.println("new: "+output.readLine());
                      }
          }
        }
        catch ( IOException e ) {
          e.printStackTrace();
        }
        finally {        
          if ( output != null ){ try { output.close(); } catch ( IOException e ) { e.printStackTrace(); }}
        }

这是我尝试阅读的文件:

/*filename.txt*/
    some longer content ~ 100kB

    return model;

    further content 

这就是我希望得到的

/*filename.txt*/
    some longer content ~ 100kB

    new stuff;

    return model;

    further content 

【问题讨论】:

  • 而你实际上得到了什么?
  • 这就是你所拥有的,这就是你期望得到的......但是你得到了什么?
  • 使用两个文件。复制到您想要的行到新文件中。添加你的新行。然后再次将其余行复制到文件中。最后,将新文件的全部内容复制到旧文件中。
  • 由于编码问题,我得到了一些我无法在此处复制和粘贴的内容。此外,似乎 writeChars 命令执行了错误的值并且不插入它们。

标签: java seek randomaccessfile


【解决方案1】:

文件不支持插入或删除除文件末尾之外的内容。 (不是 Java 的限制,而是操作系统的限制)

要插入文本,您必须重写文件(至少从您要更改的点开始) 最简单的解决方案是将内容复制到临时文件,根据需要更改/插入或删除并替换原始文件,如果这是成功的。

【讨论】:

  • 我尽量避免构建副本,因为文件大小可能会变得非常大。
  • 除非您说的是 10 MB+,否则大小可能并不重要。无论如何,你不能按照你的建议去做。
  • http://www.java2s.com/Code/Java/File-Input-Output/Appendingdatatoexistingfile.htm 里面的文件被放大了.....所以有可能吗?!
  • @user1193134 就像我说的那样,有可能“在文件末尾”。
  • 那么把“新东西、返回模型和更多内容”的部分放入缓冲区并重写文件末尾是否可行?!
【解决方案2】:

使用两个文件。复制到您想要的行到新文件中。添加您的新行。然后再次将其余行复制到文件中。最后,将新文件的全部内容复制到旧文件中

【讨论】:

    【解决方案3】:

    首先:您要测试的字符串中有空格:

    String comparison="    return model;";
    

    像这样比较这些行会更好:

    if (line.trim().equals(comparison.trim())){ ...
    

    trim() 的调用将删除该行和比较字符串中的所有空格/制表符,因此如果某些文件使用制表符而不是空格或不同数量的空格,它也会匹配...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-26
      • 2017-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-11
      • 2018-12-03
      • 2021-10-18
      相关资源
      最近更新 更多