【问题标题】:java- read last 2 lines in a file and delete last line, then add 2 fixed string values at end of filejava-读取文件中的最后2行并删除最后一行,然后在文件末尾添加2个固定字符串值
【发布时间】:2012-10-03 20:15:35
【问题描述】:

我想读取某些文件的最后两行,如果倒数第二行的内容与特定字符串匹配,则只删除最后一行。

另外,经过上述操作,需要在修改后的文件末尾追加两行数据。我看到关于 SO 的其他问题涉及我问题的不同部分,但是有没有一种简单的方法可以用最少的代码完成上述所有操作,最好是在一个函数中? (我可以结合 SO 提供的不同功能,但这会很麻烦......)

【问题讨论】:

  • 文件有多大,假设它们是文本而不是二进制文件?
  • 也许这个answer 可以帮助你。

标签: java file


【解决方案1】:

我建议您“在内存中”执行此操作。很容易逐行读取List,检查最后几行并更新这些行并将其写回文件。


示例:

public static void main(String[] args) throws IOException {

    String fileName = "test.txt";

    List<String> lines = new ArrayList<String>();

    // read the file into lines
    BufferedReader r = new BufferedReader(new FileReader(fileName));
    String in;
    while ((in = r.readLine()) != null)
        lines.add(in);
    r.close();

    // check your condition
    String secondFromBottom = lines.get(lines.size() - 2);
    if (secondFromBottom.matches("Hello World!")) {
        lines.remove(lines.size() - 1);
        lines.add("My fixed string");
    }  

    // write it back
    PrintWriter w = new PrintWriter(new FileWriter(fileName));
    for (String line : lines)
        w.println(line);
    w.close();
}

注意:上面的例子中没有做异常处理……你需要处理例如文件不包含两行的情况和其他问题!

【讨论】:

  • 如果必须处理大文件,最好不要将所有行都存储在内存中。由于只有最后两行是相关的,您可以在读取输入时将前几行写入输出。
  • @raymi:这是“简单的解决方案”,也是我开始做的方式!如果文件那么大,也许这个问题会说些什么..
  • @dacwe- 谢谢,我正在解析的文件每个最多包含 5000 行,您的解决方案可以对这些文件执行我想要执行的操作...
【解决方案2】:

如果您有非常大的文件并且性能是一个问题,那么可以使用RandomAccessFile 并向后读取以查找行终止字节以确定最后两行的开始位置。否则使用 dacwe 的方法。

【讨论】:

    【解决方案3】:

    正如甘道夫所说,你可以:

    • 获取 RandomAccessFile,
    • 使用方法 seek(long) 向前跳转并阅读这些行。但你不会确切知道跳跃应该有多大。
    • 要删除最后一行,您需要最后一行的开头位置,因此在读取每一行之前存储它们的文件指针位置(方法 getFilePointer())。使用 setLength(long) 删除到该位置。

    我在这里阅读和删除最后几行的示例: Deleting the last line of a file with Java

    有用的还可以是: Quickly read the last line of a text file?

    【讨论】:

      猜你喜欢
      • 2021-10-04
      • 2016-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-21
      相关资源
      最近更新 更多