嗨:给定一个任意文件(java),我想计算行数。
这很简单,例如,使用Apache的FileUtils.readLines(…)方法。。。
然而,对于大文件来说,在适当的位置读取整个文件是很可笑的(即只计算行数)。
一个自行开发的选项:创建BufferedReader或使用FileUtils.lineIterator函数,并计算行数。
然而,我假设可能有一个(低内存)、最新的API,用于用最少的java锅炉板进行简单的大型文件操作——在任何Google、Apache等开源java实用程序库中,是否存在任何此类库或功能
使用番石榴:
int nLines = Files.readLines(file, charset, new LineProcessor<Integer>() {
int count = 0;
Integer getResult() {
return count;
}
boolean processLine(String line) {
count++;
return true;
}
});
它不会将整个文件保存在内存或任何东西中。
Java 8捷径:
Files.lines(Paths.get(fileName)).count();
但大多数内存效率:
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对象。
没有库:
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;
}
这里有一个使用Apache Commons 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;
}