如何使用Java从两个方向读取一个非常大的文本文件的n行块

如何使用Java从两个方向读取一个非常大的文本文件的n行块,java,file,Java,File,我需要读取一个非常大的日志文件(大约400MB),并在文本区域显示其内容 显然,由于文件的尺寸,我无法首先读取整个文件,因此我正在寻找一种方法,可以读取前n行(或字节的一部分),然后在被要求时,开始读取下n行,依此类推。该方法需要在两个方向上工作:即,如果显示1000到1500之间的行,并且用户想要回读,则我必须显示500到1000之间的行 我正在尝试使用RandomAccessFile、LineIterator和经典的BufferedReader方法,但这些似乎不是好的解决方案 提前感谢。如果

我需要读取一个非常大的日志文件(大约400MB),并在文本区域显示其内容

显然,由于文件的尺寸,我无法首先读取整个文件,因此我正在寻找一种方法,可以读取前n行(或字节的一部分),然后在被要求时,开始读取下n行,依此类推。该方法需要在两个方向上工作:即,如果显示1000到1500之间的行,并且用户想要回读,则我必须显示500到1000之间的行

我正在尝试使用
RandomAccessFile
LineIterator
和经典的
BufferedReader
方法,但这些似乎不是好的解决方案


提前感谢。

如果您的文件没有严格的结构(即Martijn注意到的每行或某个逻辑块的固定字符数),那么您就不能使用RandomAccessFile的优势

在这种情况下,您可以尝试将大型文件拆分为较小的文件,每个文件中有固定的行数(例如1000行)。在这种情况下,当用户希望看到1800到2100之间的行时,您只需要读取2个文件(如果您说总大小约为400 Mb,则可能是数千个文件)


如果你不能做到这一点,你唯一能做的就是使用NIO来提高性能至少一点。

在类似的情况下,其他人建议将文件存储在数据库中。例如,将每一行作为单独的记录。然后,以任意方向、大小块读取数据要容易得多。

行有固定数量的字符吗?能否将其拆分为几个较小的文件(每行1000行)?行没有固定数量的字符。是的,我可以将文件拆分为几个较小的文件,但在大多数情况下,用户不需要读取整个文件,因此这可能不是一种有效的方法。将文件拆分为较小的文件对我来说似乎不是一个好的解决方案。如果我这样做了,当用户要求查看他正在阅读的文件中没有的行时,我就有了导航这些文件的问题。没有任何问题。读取一个小文件不是很繁重的操作。它比从一端到另一端读取一个大文件要轻得多。如果您确定用户将主要读取连续的行,则使用NIO。如果用户很有可能希望阅读第100行,然后阅读第20000行,那么使用我的方法。