统计某文件的文本行数,常用的方法是通过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 : 4985014
total time is:585
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 : 4985014
total time is:466
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");
}
}
}