在網絡上搜了下快速計算文本行數的,基本上都是用如下方法
long fileLength = File.length();
LineNumberReader.skip(fileLength);
LineNumberReader.getLineNumber
但運行結果發現該方法會少掉一行(在windows環境下,linux沒測過),原因在於file.length()返回的是字節長度,而LineNumberReader.skip跳躍的是字符數,除非最後多出一行空行,該方法結果纔會正確,但是又不能直接在結果加1,因爲很多文本文件確實最後會多出一行空行。於是自己寫了個方法,該方法僅適用於每一行格式統一的文本文件,比如批量導入數據
/**
* 獲取文件實際內容行數
* @author lmiky
* @date 2014-4-18
* @param file 文件
* @param lineContent 文件單行實際內容,即無排除空格無格式化等,讀出來一行是什麼內容,就傳入什麼內容
* @return
*/
public static int getFileLine(File file, String lineContent) {
//獲取總字節數,之所以加2是因爲文本文件結束符佔兩個字節
long fileLength = file.length() + 2;
int lines = 0;
try {
//內容長度加結束符
int lineLength = lineContent.getBytes().length + 2;
System.out.println(lineLength);
//總字節數已經加2了,所以無需四捨五入,直接取最接近並小於的整數,這樣即使最後多出一行空格,也不會影響到計算結果
lines = (int)(fileLength/lineLength);
} catch (Exception e) {
LoggerUtils.logException(e);
}
return lines;
}
之所以參數上有lineContent,是因爲系統業務上的原因,在調用本方法之前已經創建了FileReader,所以不需要再耗資源在方法中創建文件流,可根據需要修改方法。