gpt4 book ai didi

java - Java中转到文件行号

转载 作者:太空宇宙 更新时间:2023-11-04 15:09:01 24 4
gpt4 key购买 nike

我想知道如何直接到达java中文本文件的特定行号。一种方法是这样的。

int line=0;
BufferedReader read=new BufferedReader(new FileReader(Filename));
while(read.readLine()!=null){
line++;
if(line==LIMIT) break;
}

但这会创建很多 String 对象,除非运行 gc,否则这些对象不会被释放。请提供一个快速且不消耗大量内存的解决方案。

PS:我正在读取一个有数百万行的文件。

最佳答案

我们假设文本文件具有可变长度的行,并且您尚未对其进行预处理以创建索引。 (否则,应该可以预先确定第N行的位置,然后“寻找”它。)

第一个观察结果是(根据上述假设),如果不检查第 N 行开始之前的每个字符,就不可能找到第 N 行。

但是您仍然可以以不会产生大量垃圾的方式执行此操作。这是一个简单的版本:

BufferedReader br = new BufferedReader(new FileReader(filename));
for (int i = 1; i < LIMIT; i++) {
while ((ch = br.read()) != '\n') {
if (ch == -1) {
// reached the end of file too soon ...
throw new IOException("The file has < " + LIMIT + " lines");
}
}
}
line = br.readLine();

技巧是跳过这些行而不将它们形成 String 对象。

现在上面有一个小缺陷。假设文本文件的行以换行符('\n')终止,而readLine可以处理3种行分隔符。但这是可以解决的……而不会产生额外的垃圾。我将把它作为“给读者的练习”,并研究一些调整,例如使用 read(char[]) 而不是 read()

如果您使用 FileInputStream 打开文件、获取 FileChannel、将字节读入 ByteBuffer 并然后在其中搜索 (byte) '\n'。但代码要复杂得多。

<小时/>

但是,我想强调评论中提出的观点。您可能在这方面浪费时间。尽管会产生大量垃圾,但您的原始版本很可能运行速度足以满足您的目的。实际上,当垃圾与非垃圾的比例较高时,GC 会很快。对于读取丢弃行的程序,几乎可以保证会出现这种情况。

与其花时间在错误的前提下弄清楚如何使程序更快,不如编写一个简单的版本并在典型输入文件上测量其性能。仅当程序实际上太慢时才进行优化。

关于java - Java中转到文件行号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21576584/

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