2012-03-13 70 views
4

嗨:給定一個任意文件(java),我想對行進行計數。用於Java中簡單文件(行數)函數的API

這是很容易的,例如,使用Apache的FileUtils.readLines(...)方法...

但是,對於大文件,在地方讀整個文件是可笑的(即只計算行)。

一個自制選項:創建BufferedReader或使用FileUtils.lineIterator函數,並對行進行計數。

然而,我假設可能有一個(低內存),最新的API用於執行簡單的大型文件操作與最小量的鍋爐板爲Java ---是否有任何這樣的庫或功能存在任何地方在任何Google,Apache等...開源Java實用程序庫?

+0

BufferedReader有什麼問題? – 2012-03-13 20:20:22

+0

你可以得到尺寸,是不是比行號更好? – Adrian 2012-03-13 20:21:55

+0

如果不讀取它們,您將無法計算行數。另請參見LineNumberReader。 – EJP 2012-03-13 23:28:51

回答

2

的Java 8一小段路:

Files.lines(Paths.get(fileName)).count(); 

但大多數內存effiecint:

try(InputStream in = new BufferedInputStream(new FileInputStream(name))){ 
    byte[] buf = new byte[4096 * 16]; 
    int c; 
    int lineCount = 0; 
    while ((c = in.read(buf)) > 0) { 
     for (int i = 0; i < c; i++) { 
      if (buf[i] == '\n') lineCount++; 
     } 
    } 
} 

你不需要在這個任務中的String對象都沒有。

6

隨着Guava

int nLines = Files.readLines(file, charset, new LineProcessor<Integer>() { 
    int count = 0; 
    Integer getResult() { 
    return count; 
    } 
    boolean processLine(String line) { 
    count++; 
    return true; 
    } 
}); 

,不會保留在內存中或任何整個文件。

+0

是的:番石榴當然是第二好的 - 但我正在尋找一種解決方案。 – jayunit100 2012-03-14 03:03:30

+3

計算文件中的行可能不是一個足夠常見的用例來獲得自己的番石榴支持,恐怕 - 當我們不能支持這樣的更一般的東西時。 – 2012-03-14 03:27:22

1

如果沒有庫:

public static int countLines(String filename) throws IOException { 
    int count = 0; 
    BufferedReader br = new BufferedReader(new FileReader(filename)); 
    try { 
     while (br.readLine() != null) count++; 
    } finally { 
     br.close(); 
    } 
    return count; 
} 
0

這裏有一個版本,使得使用Apache下議院IO庫。您可以通過null獲取encoding以選擇平臺默認值。

import org.apache.commons.io.FileUtils; 
import org.apache.commons.io.LineIterator; 

public static long countLines(String filePath, String encoding) 
throws IOException { 
    File file = new File(filePath); 
    LineIterator lineIterator = FileUtils.lineIterator(file, encoding); 
    long lines = 0; 
    try { 
     while (lineIterator.hasNext()) { 
      lines++; 
      lineIterator.nextLine(); 
     } 
    } finally { 
     LineIterator.closeQuietly(lineIterator); 
    } 
    return lines; 
}