【问题标题】:Groovy read file backwards [duplicate]Groovy向后读取文件[重复]
【发布时间】:2017-02-14 14:46:31
【问题描述】:

任何向后读取文件的常规方法?看了Reader 类,但似乎没有任何帮助。我的用例主要是查找与条件匹配的文件的最后一行(正则表达式,包含字符串等)。

稍后编辑:

我认为这个问题并不是真正的尾巴问题的重复。我认为 tail 更像是文件的“实时”处理。我的问题更多是处理大日志文件(大小为数十 GB),因此不能将整个文件加载到内存中。文件内容是静态的(在处理过程中不会更新)。

例如,每次更新对象时,我们都会记录一行,说明是哪个用户执行的,稍后我们需要最后一个生成该更新的用户。

谢谢

【问题讨论】:

  • 这并不是非常具体的。你可以看看stackoverflow.com/questions/6011345/…stackoverflow.com/questions/8664705/…,可能还有更多。
  • 我同意这个问题本身并不是 groovy 特有的,但我正在尝试看看是否有一些优雅的 groovy 解决方案。
  • 您介意发布更多详细信息以及示例数据等相关信息吗?
  • 我倾向于同意这不是直接复制。我没有纯粹的 groovy 解决方案,但我有一个使用 groovy 元编程的潜在解决方案。不幸的是,我无法添加它,因为这个问题已被关闭为重复。有人可以考虑重新提出这个问题吗?
  • 由于该线程已关闭,我添加了a gist with a potential solution。它确实使用了外部依赖项,但从好的方面来说,它不会将整个文件读入内存,并且确实使用了 groovy 风格的惯用语。它使用 groovy 元编程向 File 类添加了一个file.findLineReverse { String line -> ... } 方法。

标签: regex file groovy


【解决方案1】:

这对我有用:

String filePath = '/path/to/file'
File file = new File(filePath)
String sample = 'searchSample'

file.text.split('\n').reverse().find {it.contains(sample)}

更新

也许 FileUtils#backWardsRead() 会对你有所帮助。

【讨论】:

  • 由于文件大小,无法将完整的文件内容加载到内存中。我假设 FileUtils#backWardsRead 是来自here 的那个。看起来很有趣,谢谢。
【解决方案2】:

这不会向后读取文件,但会向后处理行,我相信这与查找“文件中匹配条件的最后一行”的预期用例一致。

import java.util.stream.Collectors
new File('myfile.csv').newReader()
                      .lines()
                      .collect(Collectors.toList())
                      .reverse()
                      .find { line -> line ==~ myRegex }

这需要 Java 8,因为它使用 Stream API。

【讨论】:

  • 由于文件大小,无法将完整的文件内容加载到内存中
猜你喜欢
  • 2013-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多