java - 如何从大文件中读取任意但连续的n行

标签 java

我想读取任意数量的行。这些文件目前是普通的ascii文本文件(稍后可能是UTF8/多字节字 rune 件)

所以我想要的是一种仅读取文件特定行(例如从101-200)的方法,并且在这样做时它不应该阻塞任何事情(即同一文件可以由另一个线程读取201- 210 并且它不应该等待第一次读取操作。

在没有行可以读取的情况下,它应该优雅地返回它可以读取的内容。方法的输出可以是一个列表

到目前为止我想到的解决方案是首先读取整个文件以查找行数以及每个新行字符的字节位置。然后使用 RandomAccessFile 读取字节并将其转换为行。我必须将字节转换为字符串(但这可以在读取完成后完成)。我会通过适当的簿记来避免读取超出文件的文件结尾异常。该解决方案效率有点低,因为它确实要遍历文件两次,但文件大小可能非常大,而我们希望在内存中保留很少的内容。

如果有一个库可以实现这样的功能,但如果有一个更简单的 native java 解决方案就更好了。

一如既往,我很感谢您提出的澄清问题,我将随时编辑这个问题。

最佳答案

为什么不使用 Scanner并循环遍历 hasNextLine() 直到达到所需的计数,然后抓取任意数量的行...如果它用完,它将优雅地失败。这样你只读取文件一次(除非扫描仪完全读取它......我从来没有看过幕后......但它听起来不像你关心,所以......你去:)

关于java - 如何从大文件中读取任意但连续的n行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9173879/

相关文章:

javascript - CKeditor 如何与 Bower 一起使用

java - 通过套接字通信读取数据时出错

java - 为许多按钮实现 ClickHandler 的最佳实践

java - 具有返回类型数组的递归树遍历方法

java - Android 应用程序进行 JSON 调用从服务器获取意外数据,但相同的调用在浏览器中有效

java - 类型参数 vs 无限通配符

java - 安卓相机: Save preview frames to buffer?

java - 从另一个列表的列表中删除对象

java - 数组中包含最大值的元素的位置

java - 如何在 Kotlin 中压缩列表并跳过下一个?