黑马程序员技术交流社区

标题: 利用IO流计算你一共敲了多少行代码 [打印本页]

作者: 付江涛    时间: 2014-8-1 16:28
标题: 利用IO流计算你一共敲了多少行代码
本帖最后由 付江涛 于 2014-8-2 17:25 编辑


--------------------------------------------------------------------------------------------------------------------------
先贴上代码:
  1. /*
  2. 需求:获取文件夹下所有.java文件的行数
  3. */

  4. import java.io.*;
  5. import java.util.*;
  6. class Demo
  7. {
  8.         
  9.         public static void main(String[] args) throws Exception
  10.         {
  11.                 File file=new File("f:\\java\\java");

  12.                 int x=file(file);

  13.                 System.out.println(x);



  14.                

  15.                
  16.         }

  17.         public static int file(File dir) throws Exception
  18.         {
  19.                
  20.                
  21.                 File[] file=dir.listFiles();   
  22.                 List<File> al=new ArrayList<File>();

  23.                 for (int x=0;x<file.length ;x++ )  //递归出所有.java文件,添加到ArrayList数组
  24.                 {
  25.                         if(file[x].isDirectory())
  26.                                 file(file[x]);
  27.                         if(file[x].getName().endsWith(".java"))
  28.                                 al.add(file[x]);

  29.                 }

  30.                

  31.                 Iterator<File> it=al.iterator();
  32.                 int num=1;
  33.                 while (it.hasNext())  //遍历
  34.                 {
  35.                         
  36.                         File f=it.next();
  37.                         BufferedReader fr=new BufferedReader(new FileReader(f)); //通过FileReader的read()方法读取所有文件内容。
  38.                         
  39.                         String line=null;

  40.                         while((line=fr.readLine())!=null)
  41.                         {
  42.                                 //if(line.contains("\r\n")) //如果有回车,num+1。
  43.                                 num++;
  44.                         }
  45.                 }

  46.                 //System.out.println("sddfasd");  //打印数字
  47.                 return num;

  48.         }
  49. }
复制代码


需求:获取文件夹下所有.java文件的行数。

代码如上,想看看自己java文件下一共敲了多少行代码。写了大半天,还是没能实现,感觉没问题,但输出结果挺惊讶的,就一个System.out.println()语句,但在控制台上就打印了好几行。不知道问题出在哪?高手给看一下。

-------------------------------------------2014.8.2 更--------------------------------------
很小的一个问题,自己竟然都没看出啦,@
裤裆里的温柔、。

正确代码如下:
  1. /*
  2. 需求:获取文件夹下所有.java文件的行数
  3. */

  4. import java.io.*;
  5. import java.util.*;
  6. class Demo
  7. {
  8.        
  9.         public static void main(String[] args) throws Exception
  10.         {
  11.                 File file=new File("f:\\java\\java");// 输入代码所在路径

  12.                 List<File> al=new ArrayList<File>();

  13.                 file(file,al);
  14.                 text(al);

  15.                
  16.         }

  17.         public static void file(File dir,List<File> al) throws Exception
  18.         {
  19.                
  20.                

  21.                 File[] file=dir.listFiles();   
  22.                

  23.                 for (int x=0;x<file.length ;x++ )  //递归出所有.java文件,添加到ArrayList数组
  24.                 {
  25.                         if(file[x].isDirectory())
  26.                                 file(file[x],al);

  27.                         if(file[x].getName().endsWith(".java"))
  28.                         al.add(file[x]);

  29.                 }
  30.         }

  31.         public static void text(List<File> al) throws Exception
  32.         {
  33.                
  34.                 Iterator<File> it=al.iterator();
  35.                 int num=1;
  36.                 while (it.hasNext())  //遍历
  37.                 {

  38.                         BufferedReader bufr=new BufferedReader(new FileReader(it.next()));
  39.                        
  40.                         String  len=null;

  41.                         while((len=bufr.readLine())!=null)
  42.                         {
  43.                                 num++;
  44.                         }
  45.                 }

  46.                 System.out.println("一共敲了"+num+"行代码!");  //打印数字

  47.                

  48.         }
  49. }

复制代码
有个缺点,空格也会加入结果,所以结果不准确。但能提供一个参考。




作者: 付江涛    时间: 2014-8-1 18:36
人工置顶~~~~
作者: 阿磊    时间: 2014-8-1 19:00
if("\r\n".equals(len))  这个是要怎么个比较法哦,一个是字符串,一个是read出来的ASCII值,类型是int的。怎么equals呢。研究了半天  ,打印结果也不可能是几行吧,应该是1,不管你文件多少都是1。因为你的if里面的代码不会执行,num始终是1.回车键对应的值是13吗?假如是13的话,条件应该是if(len==13)来进行判断吧,这样就有结果了。
作者: 阿磊    时间: 2014-8-1 19:02
刚才试了下 是13  改成13用13判断就OK 了  至于怎么把那个值变成字符串 我还真不知道  呵呵
作者: 付江涛    时间: 2014-8-1 20:50
阿磊 发表于 2014-8-1 19:02
刚才试了下 是13  改成13用13判断就OK 了  至于怎么把那个值变成字符串 我还真不知道  呵呵 ...

代码:
  1. /*
  2. 需求:获取文件夹下所有.java文件的行数
  3. */

  4. import java.io.*;
  5. import java.util.*;
  6. class Demo
  7. {
  8.        
  9.         public static void main(String[] args) throws Exception
  10.         {
  11.                 File file=new File("f:\\java\\java");

  12.                 file(file);

  13.                
  14.         }

  15.         public static void file(File dir) throws Exception
  16.         {
  17.                
  18.                
  19.                 File[] file=dir.listFiles();   
  20.                 List<File> al=new ArrayList<File>();

  21.                 for (int x=0;x<file.length ;x++ )  //递归出所有.java文件,添加到ArrayList数组
  22.                 {
  23.                         if(file[x].isDirectory())
  24.                                 file(file[x]);
  25.                         if(file[x].getName().endsWith(".java"))
  26.                                 al.add(file[x]);

  27.                 }

  28.                

  29.                 Iterator<File> it=al.iterator();
  30.                 int num=1;
  31.                 while (it.hasNext())  //遍历
  32.                 {
  33.                        
  34.                         File f=it.next();
  35.                         FileReader fi=new FileReader(f); //通过FileReader的read()方法读取所有文件内容。
  36.                        
  37.                         int  len=1;

  38.                         while((len=fi.read())!=-1)
  39.                         {
  40.                                 if(len==13) //如果有回车,num+1。
  41.                                 num++;
  42.                         }
  43.                 }

  44.                 System.out.println(num);  //打印数字

  45.         }
  46. }
复制代码

输出语句就一句,可我的结果确实是很多行。。看图:


搞不懂为什么
如果把输出语句中的num随便换成一个字符串,打印的还是很多行。。

如果用BufferedReader里的readLine()方法,只要readLine!=null,num值就+1,这样可以不用比较了(不知道你能不能听懂。。表述不清。。)


作者: 阿磊    时间: 2014-8-1 23:00
付江涛 发表于 2014-8-1 20:50
代码:

输出语句就一句,可我的结果确实是很多行。。看图:

那就搞不清咯 ,我用你的代码没有改过的,直接把回车改成13然后==len就可以打印出来了,如果不改,打印结果是1,如果还是这样就别理了,直接BufferReader吧,这样更简单
作者: 付江涛    时间: 2014-8-2 11:07
阿磊 发表于 2014-8-1 23:00
那就搞不清咯 ,我用你的代码没有改过的,直接把回车改成13然后==len就可以打印出来了,如果不改,打印结 ...

哥们  我知道问题在哪了  


方法里面用到了递归,循环一次 ,就多一个。问题应该就在这了。但现在不知道怎么改了。数组放不了方法外面,方法都是静态方法。。


作者: 裤裆里的温柔、    时间: 2014-8-2 13:19
把arrayList当参数传进去就行了,判断那里可以用正则匹配一下
作者: 付江涛    时间: 2014-8-2 13:38
裤裆里的温柔、 发表于 2014-8-2 13:19
把arrayList当参数传进去就行了,判断那里可以用正则匹配一下

忘了能传参数。。试了,还是打印了很多行。。请问是递归那块出问题了?如果把文件夹改成文件夹下还有文件夹的,打印会出现很多行。如果改成文件夹下全是.java文件,打印成功。。正则表达式还没学。。
作者: 裤裆里的温柔、    时间: 2014-8-2 14:24
付江涛 发表于 2014-8-2 13:38
忘了能传参数。。试了,还是打印了很多行。。请问是递归那块出问题了?如果把文件夹改成文件夹下还有文件 ...

打印多行,是因为你把打印放到递归方法了,每次递归完都打印,递归的内容不要太多,执行效率很低,和读取文件应该分开。
作者: 付江涛    时间: 2014-8-2 16:22
裤裆里的温柔、 发表于 2014-8-2 14:24
打印多行,是因为你把打印放到递归方法了,每次递归完都打印,递归的内容不要太多,执行效率很低,和读取 ...

{:3_65:}这么简单的问题我竟然都没看见。。多谢提醒!!
作者: 王一勇    时间: 2014-8-2 16:36
楼主很有想法~
作者: 付江涛    时间: 2014-8-2 17:19
王一勇 发表于 2014-8-2 16:36
楼主很有想法~

这也是别人我问敲了多少行代码,才想出用io解决一下。不过有个缺点,结果也包含空行,所以数据不准确{:3_54:}
作者: 阿磊    时间: 2014-8-3 10:15
付江涛 发表于 2014-8-2 11:07
哥们  我知道问题在哪了  

嗯嗯  看到啦
作者: 阿磊    时间: 2014-8-3 10:18
付江涛 发表于 2014-8-2 11:07
哥们  我知道问题在哪了  

嗯嗯  看到啦




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2