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毫秒