我们现在有这样一个需求,统计出eclipse的工作空间中java文件的中java代码的总行数。考虑的思路如下:
首先我们需要将目录里的文件全找出来,然后过滤出java文件。再按行读入文件,每读一行计数一次。对于找文件,我们构造了一个方法Num,使用递归方法,找出所有的文件。详细代码如下所示:
package Demo;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class javaLineCount {
static int javaLineCount=0;
public static void main(String[] args) throws IOException {
File file=new File("E:\\workplace");
Num(file);
System.out.println(javaLineCount);
}
//构造统计方法Num
private static void Num(File file) throws IOException {
//判断文件是否为空
if (file==null) {
throw new IOException();
}
//判断是否为目录
if (file.isDirectory()) {
File[] fs=file.listFiles();
for (File ff:fs) {
Num(ff);
}
}else {
BufferedReader reader=new BufferedReader(new FileReader(file));
if (file.getName().endsWith(".java")) {
while (reader.readLine()!=null) {
javaLineCount++;
}
reader.close();
}
}
}
}
运行结果为正确的行数,亲测可用。
现在又有这样一个需求,我们经常工作空间直接在一个盘符里而不是在一个文件夹中,我使用的是E盘,代码如下(仅仅改变的路径,代码跟上面一样):
package Demo;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class javaLineCount {
static int javaLineCount=0;
public static void main(String[] args) throws IOException {
File file=new File("E:\\");
Num(file);
System.out.println(javaLineCount);
}
//构造统计方法Num
private static void Num(File file) throws IOException {
//判断文件是否为空
if (file==null) {
throw new IOException();
}
//判断是否为目录
if (file.isDirectory()) {
File[] fs=file.listFiles();
for (File ff:fs) {
Num(ff);
}
}else {
BufferedReader reader=new BufferedReader(new FileReader(file));
if (file.getName().endsWith(".java")) {
while (reader.readLine()!=null) {
javaLineCount++;
}
reader.close();
}
}
}
}
我们可以发现根本没有得到我们想要的结果,而是出现了空指针异常,为什么我们会出现空指针异常,为什么会出现这样的效果,我们进行了探索。我在Num方法中对其进行了打印,结果我们可以看到,最后一行出现:E:\System Volume Information,这是Windows系统自带的文件,我们java程序读取不了它,因此它给我们一个NullPointerException。怎么解决呢?
我们对方法Num进行异常的捕获,可以得到正确的结果。
package Demo;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class javaLineCount {
static int javaLineCount=0;
public static void main(String[] args) throws IOException {
File file=new File("E:\\");
try {
Num(file);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(javaLineCount);
}
//构造统计方法Num
private static void Num(File file) throws IOException {
//判断文件是否为空
if (file==null) {
throw new IOException();
}
//判断是否为目录
if (file.isDirectory()) {
File[] fs=file.listFiles();
for (File ff:fs) {
System.out.println(ff);//
Num(ff);
}
}else {
BufferedReader reader=new BufferedReader(new FileReader(file));
if (file.getName().endsWith(".java")) {
while (reader.readLine()!=null) {
javaLineCount++;
}
reader.close();
}
}
}
}
运行结果为正常数值,不会出现空指针异常。