当前位置: 首页 > 知识库问答 >
问题:

从文件中读取特定的行非常慢

阙博容
2023-03-14

我创建了一个方法,根据文件中的行号从文件中读取特定行。它对大多数文件都很好,但当我试图读取一个包含大量非常长的行的文件时,它需要很长时间,特别是当它在文件中的位置越来越深时。我还做了一些调试,似乎也占用了大量内存,但我不确定这是否可以改进。我知道还有一些其他的问题集中在如何从文件中读取某些行,但这个问题主要集中在性能方面。

public static final synchronized List<String> readLines(final File file, final Integer start, final Integer end) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
        List<String> lines = new ArrayList<>();
        try {
            String line = bufferedReader.readLine();
            Integer currentLine = 1;
            while (line != null) {
                if ((currentLine >= start) && (currentLine <= end)) {
                    lines.add(line + "\n");
                }
                currentLine++;
                if (currentLine > end) {
                    return lines;
                }
                line = bufferedReader.readLine();
            }
        } finally {
            bufferedReader.close();
        }
        return lines;
    }

如何优化此方法以使其比光速更快?

共有1个答案

葛雪松
2023-03-14

我意识到我之前做的事情本来就很慢,而且占用了太多内存。

通过将所有行添加到内存中,然后处理<code>列表

我现在使用Java 8 Stream并在读取点进行处理,这是我迄今为止使用的最快的方法。

Path path = Paths.get(file.getAbsolutePath());
Stream<String> stream = Files.lines(path, StandardCharsets.UTF_8);
        for (String line : (Iterable<String>) stream::iterator) {
        //do stuff
        }   
}
 类似资料:
  • 问题内容: 我不是在谈论特定的行号,因为我正在读取具有相同格式但长度不同的多个文件。 说我有这个文本文件: 我希望你知道我的意思。我正在考虑遍历文件,然后使用正则表达式搜索以找到“开始”和“结束”的行号,然后使用线缓存从开始行读取到结束行。但是如何获得行号?我可以使用什么功能? 问题答案: 如果您只想要和之间的文本块,则可以执行以下操作: 实际上,您不需要操纵行号即可读取开始和结束标记之间的数据。

  • 问题内容: 我正在尝试使用php从文本文件中读取特定行。这是文本文件: 我如何使用php获取第二行的内容?这将返回第一行: ..但我需要第二个。 任何帮助将不胜感激 问题答案: 文件—将整个文件读入数组

  • 问题内容: 有什么方法可以从文本文件中读取特定行?在API或Apache Commons中。就像是 : 我同意实现起来很简单,但是特别是当文件很大时,效率不是很高。 问题答案: 可以,但是仍然存在效率问题。 或者,您可以使用: 由于有缓冲,这将稍微更有效。 看一下并尝试跳过整行(使用正则表达式)。我无法确定它是否会更有效- 对其进行基准测试。 PS 代表 效率, 我的意思是 记忆效率

  • 问题内容: 我对此有一个文件模拟:… 我想从存在“ HDK1001”字样的行开始阅读,并在世界“ HDK7564”字样处结束阅读 我尝试使用此代码,但无法执行限制 请帮帮我 问题答案: 试试这个代码。

  • 所以我正在写一个代码来获取scanf一个文本文件并返回一个格式化的文本消息日志。我一直在想,当文件扫描行“332982000 20555552002 205551001 7 Webb先生,我能问你一个问题吗?”时,如何在某一点扫描文件中的字符串,并打印E.X点以外的所有字符串我将前4个数字扫描为整数,并将其余写入的文本扫描到从“Mr.Webb”开始的字符数组中。 我尝试使用一个for循环与fsca

  • 我有这个代码below.What我想做的是读取一个文本文件,每行都有字符串分隔tabs.For示例(名称\t国家\t ID\t内容),其中\t是tab.Then我想只打印每行的第二列。我试图将整行拆分为标记,但它只适用于文件的第一行,然后它抛出ArrayIndexOutOfBoundsException。此外,当我尝试只打印第一列(标记[0])但不打印标记[1]时,它也很完美,我need.So我需