当前位置: 首页 > 面试题库 >

Java文件中的行数

康言
2023-03-14
问题内容

我使用巨大的数据文件,有时我只需要知道这些文件中的行数,通常我会打开它们并逐行读取它们,直到到达文件末尾

我想知道是否有更聪明的方法可以做到这一点


问题答案:

这是我到目前为止找到的最快的版本,比readLines快6倍。在150MB的日志文件上,这需要0.35秒,而使用readLines()则需要2.40秒。只是为了好玩,Linux的wc -l命令需要0.15秒。

public static int countLinesOld(String filename) throws IOException {
    InputStream is = new BufferedInputStream(new FileInputStream(filename));
    try {
        byte[] c = new byte[1024];
        int count = 0;
        int readChars = 0;
        boolean empty = true;
        while ((readChars = is.read(c)) != -1) {
            empty = false;
            for (int i = 0; i < readChars; ++i) {
                if (c[i] == '\n') {
                    ++count;
                }
            }
        }
        return (count == 0 && !empty) ? 1 : count;
    } finally {
        is.close();
    }
}

编辑,在9 1/2年后:我几乎没有Java经验,但是无论如何我都尝试根据LineNumberReader下面的解决方案对该代码进行基准测试,因为它困扰着我没有人做。似乎特别是对于大文件,我的解决方案更快。尽管似乎要花一些时间才能使优化程序完成不错的工作。我已经玩了一些代码,并产生了一个始终最快的新版本:

public static int countLinesNew(String filename) throws IOException {
    InputStream is = new BufferedInputStream(new FileInputStream(filename));
    try {
        byte[] c = new byte[1024];

        int readChars = is.read(c);
        if (readChars == -1) {
            // bail out if nothing to read
            return 0;
        }

        // make it easy for the optimizer to tune this loop
        int count = 0;
        while (readChars == 1024) {
            for (int i=0; i<1024;) {
                if (c[i++] == '\n') {
                    ++count;
                }
            }
            readChars = is.read(c);
        }

        // count remaining characters
        while (readChars != -1) {
            System.out.println(readChars);
            for (int i=0; i<readChars; ++i) {
                if (c[i] == '\n') {
                    ++count;
                }
            }
            readChars = is.read(c);
        }

        return count == 0 ? 1 : count;
    } finally {
        is.close();
    }
}

1.3GB文本文件的基准结果,y轴以秒为单位。我使用相同的文件执行了100次运行,并使用进行了每次运行测量System.nanoTime()。你可以看到其中countLinesOld有一些异常值,并且countLinesNew没有异常值,虽然速度更快一点,但是差异在统计上是显着的。LineNumberReader显然慢一些。



 类似资料:
  • 问题内容: 如何替换在文本文件中找到的一行文本? 我有一个字符串,例如: 我想用更新它: (反之亦然) 我该如何完成? 顺便说一句,我只想替换已读取的行。不是整个文件。 问题答案: 在底部,我有一个通用的解决方案来替换文件中的行。但是首先,这是眼前特定问题的答案。辅助功能: 然后调用它: 原始文本文件内容: Output: New text file content: And as a note,

  • 问题内容: 我会尽量保持清楚,但如果我的问题不完美,请原谅我。我有一个包含多行数据的txt文件。例: 123拉尔夫·玻色20000 200 1 2 256 ed shane 30000 100 2 4 … 我需要按顺序读取每一行,并将其传递回单独类中的方法进行处理。我知道如何通过使用StringTokenizer将每一行分解为元素。 但是,我不确定如何一次读取一行,将元素传递回另一类,然后在完成处

  • 本文向大家介绍使用Java计算文本文件中的行数,包括了使用Java计算文本文件中的行数的使用技巧和注意事项,需要的朋友参考一下 我们可以使用Java的BufferedReader类读取文件中的行。请参阅下面的示例- 示例 在类路径中请看以下文本文件。 test.txt 测试器 这将产生以下结果- 输出结果

  • 问题内容: 我有一个文本文件,我只想更改文件的第一行。该文件可能长达数百万行,因此我宁愿不必遍历所有内容,因此我想知道是否还有另一种方法可以做到这一点。 我还想对第一行应用一些规则,以便将某些单词的实例替换为其他单词。 这可能吗? 问题答案: 除非结果行的长度与原始行的长度不同,否则A 将达到目的。 如果事实证明您被迫执行复制(替换第一行,其余数据应原样复制),我建议使用和。首先使用的读取第一行。

  • 问题内容: 我有一个包含以下行的文本文件: 每个“ |” 符号表示它有一列。我必须从“ |”内部的每一行中提取信息 迹象。当我尝试以下代码时: 它给了我: 如何正确解析? 问题答案: 试试这个:

  • 问题内容: 我正在尝试在qt内执行一个Java文件,这是我的Java文件代码: 问题是如何调用此java文件,我很困惑&不知道如何调用函数onUpdate,有什么想法吗? 问题答案: 要在Qt Android应用程序中运行Java代码,您应该使用Qt Android Extras 模块,该模块包含用于在Android上进行开发的其他功能。 您可以使用JNI从C / C 调用Java函数或从Java