gpt4 book ai didi

java - 使用 Stream.lines 返回文件中的 'n' 行

转载 作者:行者123 更新时间:2023-11-30 01:58:34 25 4
gpt4 key购买 nike

我需要构建一个扫描大量文件的应用程序。这些文件包含带有一些有关 session 的数据的 block ,其中每一行都有不同的值。例如:“=ID:39487”。

此时我已经有了该行,但我现在面临的问题是我需要该 ID 上方的 n 行值。我正在考虑迭代器,但它只有前向方法。我还考虑过将结果保存在列表中,但这违背了使用 Stream 的原因,并且某些文件很大,因此会导致内存问题。

我想知道使用 Stream API(文件)是否可以实现类似的操作?或者也许是一个更好的问题,有没有更好的方法来解决这个问题?

Stream<String> lines = Files.lines(Paths.get(file.getName()));
Iterator<String> search = lines.iterator();

最佳答案

您无法使用同一读取器任意向后和向前读取文件(无论您使用的是流、迭代器还是普通的 BufferedReader。)

如果您需要:

  • 给定行之前m
  • 给定行之后的n
  • 在到达该行之前,您事先并不知道 mn 的值

...那么你基本上有三个选择:

  • 读取整个文件一次,将其保留在内存中,然后您的任务就很简单(但这会占用最多的内存。)
  • 读取整个文件一次,标记您需要的行号,然后执行第二遍,提取您需要的行。
  • 读取整个文件一次,存储某种形式的有关行长度的元数据,然后使用 RandomAccessFile 提取所需的特定位,而无需再次读取整个文件。<

我建议考虑到文件很大,这里的第二个选项可能是最现实的。第三种可能会给您带来更好的性能,但需要更多的开发工作。

作为替代方案,如果您可以保证 nm 都低于某个值,并且该值是合理的大小 - 您也可以只保留某个值处理文件时缓冲区中的行数,并在需要“向后”读取行时读取该缓冲区。

关于java - 使用 Stream.lines 返回文件中的 'n' 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53617110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com