A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 林康春 黑马帝   /  2012-8-6 23:22  /  1469 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class Test {
   
static int allNum;//统计行数的 变量
public static void main(String[] args) throws IOException {
  
  int countt = getFilesLineCount(new File("F:/workspace1/com.itcast"));
  System.out.println("总行数:" + countt);
  
  
  
}

/**
  * 统计一个文件夹下所有文件(.java)的总行数(包含子孙文件夹)
  *
  * @param dir
  * @return
  */
public static int getFilesLineCount(File dir) {
  
  
  if(dir.isFile())//判断是否是文件
  {
   allNum = allNum+getLineCount(dir);
  }
  else
  {
   for( File file:dir.listFiles())//遍历此目录的所有子目录
   {
    if (file.isFile())
    {   
     String s = file.getName();
     if( s.endsWith(".java"))
     {
      allNum += getLineCount(file);
     }
    }
    else
    {
     getFilesLineCount(file);//递归调用
    }
   }
  }
  return allNum;
}

/**
  * 统计指定文件的行数
  * @param file
  * @return
  * @throws IOException
  */
public static int getLineCount(File file)  {
  
  BufferedReader br = null;
        int num = 0;  
  String s = null;
  
  try {
   br=new BufferedReader(new FileReader(file));
   while( (s = br.readLine())!=null)
   {
    num++;
   }
   br.close();
  } catch (Exception e) {
   e.printStackTrace();
   
  }
  return num;
}
}
/*
* 上面用了递归的调用
* 但我觉得递归虽好,但是会产生内存溢出的问题:但递归的调用很多次的时候,总有很多数据停留在内存里
* 达到一定程度就会出现内存溢出
* 那请问,如果不用递归,如何实现我程序中的功能呢?
* */

评分

参与人数 1技术分 +1 收起 理由
田建 + 1

查看全部评分

2 个回复

倒序浏览
可以考虑用队列来解决这个问题,把每一次需要递归的统计的文件夹,当成一个任务,然后把这个任务存进LinkedList中,通过先进先出的方式,来达到递归的目的。
下面我用列队实现了一下

package cn.itcast.h_linecount;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.LinkedList;

public class LineCounter2 {

        public static void main(String[] args) {
                // 初始时向任务队列中添加一个任务
                // File dir = new File("E:/Test");
                File dir = new File("C:/my_project");
                taskQueue.add(dir);

                // 执行队表中的所有任务
                executeDirFilesLineCountTasks();

                // 显示最终结果
                System.out.println("总行数:" + count);
        }

        // 任务队列
        private static LinkedList<File> taskQueue = new LinkedList<File>();

        // 统计结果
        private static int count = 0;

        /**
         * 执行任务:统计一个文件夹下所有文件的总行数,并且把所有的子文件夹作为新任务添加到任务队列中
         *
         */
        public static void executeDirFilesLineCountTasks() {
                // 循环办理任务队表所有的的任务
                while (taskQueue.size() > 0) {
                        // 1,从任务队列中取出一个任务
                        File dir = taskQueue.removeFirst();

                        // 2,办理这个任务
                        // >> a, 取出这个文件夹中所有子文件与子文件夹
                        for (File file : dir.listFiles()) {
                                // >> b, 如果是文件,就统计
                                if (file.isFile()) {
                                        if (file.getName().endsWith(".java")) {
                                                count += getFileLineCount(file);
                                        }
                                }
                                // >> c, 如果是文件夹,就作为一个新任务添加到任务队列中
                                else {
                                        taskQueue.addLast(file);
                                }
                        }
                }
        }

        /**
         * 统计指定文件的行数
         *
         * @param file
         * @return
         */
        public static int getFileLineCount(File file) {
                BufferedReader reader = null;
                try {
                        // 打开文件
                        reader = new BufferedReader(new FileReader(file));

                        // 读一行就加1,直到读完全部行
                        int count = 0;
                        while (reader.readLine() != null) {
                                count++;
                        }

                        // 返回结果
                        return count;

                } catch (Exception e) {
                        throw new RuntimeException(e);
                } finally {
                        if (reader != null) {
                                try {
                                        reader.close();
                                } catch (IOException e) {
                                        throw new RuntimeException(e);
                                }
                        }
                }
        }
}
希望可以帮到你

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 杨文宇 于 2012-8-7 00:36 编辑

我用的是设置标志位的办法。有文件夹设为0,while循环
  1. package javaEnhance;

  2. import java.io.BufferedReader;
  3. import java.io.File;

  4. import java.io.FileReader;
  5. import java.io.IOException;
  6. import java.util.ArrayList;
  7. import java.util.List;

  8. public class Test {
  9. static List arr =new ArrayList();
  10. static int allNum;//统计行数的 变量
  11. public static void main(String[] args) throws IOException {
  12. add("E:\\新建文件夹");
  13. int countt = getFilesLineCount(arr);
  14. System.out.println("总行数:" + countt);
  15. }
  16. public static void add(String name){
  17. arr.add(name);
  18. }

  19. /**
  20. * 统计一个文件夹下所有文件(.java)的总行数(包含子孙文件夹)
  21. *
  22. * @param dir
  23. * @return
  24. */
  25. //传递的是一个集合
  26. public static int getFilesLineCount(List a) {
  27. int flag = 0; //设置标志位
  28. while(flag==0){
  29. for(int i = 0;i<a.size();i++){
  30. flag = 1;//标志位变为1;
  31. System.out.println((String)a.get(i));
  32. File dir = new File((String)a.get(i));
  33. if(dir.isFile())//判断是否是文件
  34. {
  35. allNum = allNum+getLineCount(dir);
  36. }
  37. else
  38. {
  39. for( File file:dir.listFiles())//遍历此目录的所有子目录
  40. {
  41. if(file.isDirectory()){
  42. flag = 0;//当有文件夹时候变0,当所有的都是文件时将会跳出循环
  43. arr.add( file.getAbsolutePath());//把文件路径传递给dir
  44. }
  45. if (file.isFile())
  46. {
  47. String s = file.getName();
  48. if( s.endsWith(".java"))
  49. {
  50. allNum += getLineCount(file);
  51. }
  52. }
  53. }
  54. }
  55. }
  56. }
  57. return allNum;
  58. }

  59. /**
  60. * 统计指定文件的行数
  61. * @param file
  62. * @return
  63. * @throws IOException
  64. */
  65. public static int getLineCount(File file) {

  66. BufferedReader br = null;
  67. int num = 0;
  68. String s = null;

  69. try {
  70. br=new BufferedReader(new FileReader(file));
  71. while( (s = br.readLine())!=null)
  72. {
  73. num++;
  74. }
  75. br.close();
  76. } catch (Exception e) {
  77. e.printStackTrace();
  78. }
  79. return num;
  80. }
  81. }

复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马