JAVA快速统计大文本文件行数

统计某文件的文本行数,常用的方法是通过BufferedReader类的readLine()方法递归遍历文件,从而间接地统计行数。然而对于大的文本文件,尤其是一些生信的测序文件,readLine()的方法显然不能让人满意,所以,通过查阅了一些资料,找到了一些更为高效的方法。测试文件选择了一个4985014行的文件,文件大小为242MB。测试耗时以毫秒为单位。

原始的readLine方法:

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;

public class LineNumberReaderExample
{
    public static void main(String[] args)
    {
    	try{
    		File file =new File("c:\\test.txt");
    		if(file.exists()){
    		    FileReader fr = new FileReader(file);
    		    LineNumberReader lnr = new LineNumberReader(fr);
    		    int linenumber = 0;
    	            while (lnr.readLine() != null){
    	        	linenumber++;
    	            }
    	            System.out.println("Total number of lines : " + linenumber);
    	            lnr.close();
    		}else{
    			 System.out.println("File does not exists!");
    		}
    	}catch(IOException e){
    		e.printStackTrace();
    	}
    }
} 

测试结果:

Total number of lines : 4985014

total time is:585


改进的方法使用了LineNumberReader类。

使用LineNumberReader类使用默认的输入缓冲区大小来创建新的行号读取器。skip方法用于跳过n个数字字符,所以在这里我们跳过 文件长度大小的字符,跳到文件的末尾。getLineNumber()方法返回最后一行的当前行号。具体的代码如下:

 public static void main(String[] args) {
    	try {
    		File file = new File("e://test.fa");
    		if(file.exists()){
    			long fileLength = file.length();
    			LineNumberReader lineNumberReader = new LineNumberReader(new FileReader(file));
    			lineNumberReader.skip(fileLength);
    	                int lines = lineNumberReader.getLineNumber();
    	                System.out.println("Total number of lines : " + lines);
	                lineNumberReader.close();
    		}else {
    			System.out.println("File does not exists!");
    		}
    	}catch(IOException e) {
    		e.printStackTrace();
    	}
    }

测试结果:

Total number of lines : 4985014

total time is:466

此外,JAVA8的出现也为我们提供了一些新的思路

public class CountOfLines {
  public static void main(String[] args) {
    // for total number of lines in the File with Files.lines
    try {
    	long startTime=System.currentTimeMillis();
        long lines = Files.lines(Paths.get(new File("e://test.fa").getPath())).count();
        System.out.println("Total number of lines : " + lines);
        long endTime=System.currentTimeMillis();
        System.out.println("Total time is:"+ (endTime-startTime) );
    } catch (IOException e) {
      System.out.println("No File Found");
    }
  }
}

虽然代码变得简单了一些,但是测试结果显示时间花费很大。

测试结果:

Total number of lines : 4985014

Total time is:544


总结:

这三种方法的测试显示第二种的时间花费是最少的,但时间花费的减少幅度并没有很大。所以,当面对更大的文件时,依旧需要寻找更为高效的方法。在shell命令行模式使用wc -l是一种相对来说最高效的方法,但考虑到在Java中过多使用外部命令,在Java中如何更快速地统计大文本文件行数的问题依旧没有解决。



参考文献:

http://www.technicalkeeda.com/java-tutorials/count-total-number-of-lines-of-file-using-java

http://blog.csdn.net/kirayuan/article/details/6321900


  • 10
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
要使用C语言获取文本文件行数,可以使用以下代码示例中的其中一种方法: 方法一: ```c #include<stdio.h> #include<stdlib.h> int main() { int line_count = 0; char ch; FILE *file; file = fopen("record.txt", "r"); if (file == NULL) { printf("无法打开文件\n"); exit(1); } while ((ch = fgetc(file)) != EOF) { if (ch == '\n') { line_count++; } } printf("该文件中的行数为:%d\n", line_count); fclose(file); return 0; } ``` 在这个方法中,我们打开待统计行数文件并逐个读取字符。每当我们遇到一个换行符('\n')时,行数就增加1。最后,我们输出行数。 方法二: ```c #include<stdio.h> #include<stdlib.h> #include<string.h> int main() { int line_count = 0; char file_name<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [统计txt文件中的行数——C语言设计](https://blog.csdn.net/m0_64316589/article/details/124375207)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [【C语言编程】统计一个文本文件行数](https://blog.csdn.net/yyyjyou/article/details/21938815)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Java与C语言混合开发技术](https://download.csdn.net/download/milk416666/88249349)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值