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

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

1、原始的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 : 111760
用时:1秒114毫秒

Total number of lines : 111760
用时:1秒132毫秒

2、改进的方法使用了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 : 111760
用时:1秒92毫秒
Total number of lines : 111760
用时:1秒180毫秒

3、此外,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 : 111760
用时:1秒174毫秒

Total number of lines : 111760
用时:1秒92毫秒

posted @ 2022-12-18 06:19  锐洋智能  阅读(1137)  评论(0编辑  收藏  举报