这个是我哥们遇到的一个面试题。
要求统计某个文件夹下,所有Java文件的数量,并且统计代码数量。
Java文件中,所有的注视都是以//,没有/**/,空行不计入代码数量。
这个面试题,里面有这样几个难点,
1、遍历文件夹,因为文件夹下可能还有文件夹。
2、读取文件,判断代码行,注释行,和空行。
3、写入文件。
其实主要的都是对文件的操作。
代码可以直接复制运行,代码如下:
package com; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import java.util.TreeSet; public class ErgodicFiles { /* *下面说的都是IO *这里稍微说一下,字节流字符流, *字节有8个二进制位组成,计算机里面储存的任何东西,都是以二进制位保存的,所以,任何文件,都可以用字节流来保存操作。 *字节流,InputStream ,OutputStream *但是,如果明确知道这个文件,属于文本文件,并且对这个文本可能进行操作,读取行,写入行等,进行行级操作的时候,用字符流。 *字符流Reader ,Writer * *关于NIO的正在研究, *IO:流 *NIO:缓冲区 */ static List<File> javalsf = new ArrayList<File>(); static List<File> lsf = new ArrayList<File>(); static int javaFileLinenum = 0; TreeSet<String> nums = new TreeSet<String>(); public static void main(String[] args) throws Exception { File fir = new File("W:/test"); FileOutputStream fio = null; try { //1、 //字节流输入文件 getJavaFiles(fir,lsf); fio = new FileOutputStream(new File("W:/ALLFILE.txt")); String javastr = "java文件个数是:"+javalsf.size()+"个"; String str = "其他文件个数是:"+lsf.size()+"个"; //输入到文件中。 fio.write(javastr.getBytes()); //FileOutputStream 换行 fio.write("\r\n".getBytes()); //继续输出文件 fio.write(str.getBytes()); fio.write("\r\n".getBytes()); fio.write("\r\n".getBytes()); if(javalsf.size()>0){ for(File javafir : javalsf){ getJavaFileNum(javafir); } } String numstr = "java代码的行数是:"+javaFileLinenum; fio.write(numstr.getBytes()); //2、 //字符流输入文件 //FileWriter fw = new FileWriter("w:/zfAllFile.txt"); } catch (Exception e) { e.printStackTrace(); }finally{ if(fio!=null){ fio.close(); } } } //循环路径下所有的文件。 public static List<File> getJavaFiles (File fir, List<File> listfile){ //判断文件是否存在 if (!fir.exists()){ System.out.println("文件名称不存在!"); }else{ //判断是否是文件 if (fir.isFile()){ //如果当前fir是文件,则判断是什么文件 String firName = fir.getName();//获取文件名 //System.err.println(firName.hashCode()); 获取文件后缀名 if(firName.substring(firName.lastIndexOf(".")+1) .equals("java")){ javalsf.add(fir); }else{ lsf.add(fir); } } else{ //如果当前fir是文件夹,则遍历整个文件夹为File数组,继续循环遍历 File[] files = fir.listFiles(); for (int i = 0; i < files.length; i++ ){ getJavaFiles(files[i], listfile); } } } return lsf; } //查看java文件中的代码数量 public static void getJavaFileNum(File fir){ int num = 0 ; try { //不能指定编码格式,会出现乱码问题 //FileReader reader = new FileReader(new File("w:/test.java")); System.out.println("查看的文件是:"+fir.getName()); System.out.println("当前文件的路径是"+fir.getPath()); //可以指定编码格式。 InputStreamReader isr=new InputStreamReader(new FileInputStream(fir),"GBK"); BufferedReader br = new BufferedReader(isr); String str = null; while ((str = br.readLine()) != null) { if(!str.startsWith("//")&&!str.equals("")){ num ++; } } System.out.println("num的数量是:"+num); br.close(); } catch (Exception e) { e.printStackTrace(); } javaFileLinenum += num; System.out.println("Java代码的总量是:"+javaFileLinenum); } }
时间: 2024-09-08 12:36:10