java中IO流的简单应用-java基础(递归遍历 处理异常 数代码)

因为工作原因,需要复习一下Java基础,这几天大体溜了一遍,但是总觉的得写点东西才舒服,于是利用java基础写了一个计算自己到底写了多少行代码的小程序。

该程序的需求

  • 通过程序的运行来实现代码的自动计数。
  • 计算一下**.java**文件的个数。
  • 计算**.java**文件中代码的行数。
  • 将数据写成日志一样的文件保存在磁盘上。

实现程序功能需要解决的问题

  1. 实现自动计算**.java**文件的个数就得对目标目录进行遍历:循环或者递归(我用的递归),同时要实现数字的累加就因该有一个全局变量。
  2. 计算代码行数,也要有一个全局的变量实现数字的累加,因为实现计算代码行数的功能,可以考虑采用按行读入的方式实现文件的计数(我选择的是BufferedReader)。
  3. 将最终的两个计数结果写入一个磁盘文件保存下来,选择一个文件写出的方法就能实现(我选择的是BufferedWriter)。

具体实现

话不多说,上边基本上理清了程序的实现思路具体的细节就要在代码的实现过程中考虑了。
首先,得来两个全局变量:

    //代码文件数,即总共创建了多少个java文件
    static int codeFileNum=0;
    //代码的行数,即总共写了多少行代码
    static long codeRowNum=0;

全局变量有了这样就能在接下来的计数过程中保证多个文件都是对唯一的值进行累加的,不会出现多个文件多个变量的混乱情况。
接下来我们实现对目标目录的遍历,遍历到非目录文件就判断是否是**.java文件,是的话进行代码行数的计算操作,不是的话略过去;如果遍历到目录文件,就递归调用该方法,实现对遍历到的目录文件的遍历…直到所有文件都遍历完成,从而计算.java文件的个数;在这过程中每找到一个.java文件就要对它的内容跟进行按行读取,如果读取到的一行不为null**我们就对代码行数进行加一操作。下面请看代码:

	/**
     * 递归遍目标目录,同时数出代码数
     * 每个文件判断是否为目录,是--递归继续遍历
     *                          否--通过IO流进行文件的读操作同时计数行数
     * @param file:传入目标目录文件
     * @throws IOException
     */
    public static void codeCount(File file) throws IOException{
            File[] fileList = file.listFiles();        //得到文件列表
            if (fileList != null) {                    //文件列表不为空就代表该文件夹下还有其他文件我们就要对它进行循环遍历
                for (File ffile : fileList) {
                    if (ffile.isDirectory()) {         //遍历过程中判断每个文件是否是目录文件,是目录就递归调用该方法
                        codeCount(ffile);
                    } else {                           //如果不是那就判断该文件是不是.java文件
                        String ffileName=ffile.getName();
                        if(ffileName.endsWith(".java")){  //如果是.java文件就对.java文件个数进行+1操作
                            codeFileNum+=1;
                            BufferedReader bufR=new BufferedReader(new FileReader(ffile));
                            String Text=bufR.readLine();     //将这个文件按行读入同时每读入一行就要对代码行数进行+1操作
                            while(Text!=null){            // 循环实现行数的计算,当读入的下一行为空的时候代表文件已经读完不再计数
                                codeRowNum+=1;
                                Text=bufR.readLine();
                            }
                            bufR.close();
                        }
                    }
                }
            }
    }

最后,我们就要实现将结果写入磁盘的操作,如果想写入磁盘我们就得先在磁盘上新建一个文件,用来保存程序写入的内容,考虑到多次运行程序的情况,我们就得让程序实现文件的续写而不是文件更新重写,这样就能实现将每次的运行结果都记录下来这样也利于以后的对比分析(看看自己第二次运行程序比第一次运行程序多写了多少代码,嘿嘿!!!可以考虑加个时间戳。)这个实现过程中没什么大问题保证文件续写而不是更新就ok了。上代码:

    public static void main(String[] args) throws IOException {
        File file=new File("F:\\");     //需要遍历的文件,我打算遍历F:盘
        try {
            codeCount(file);           //将目标文件传入刚才写过的计数方法里进行计数
        }catch (IOException e){
            System.out.println("应该是文件路径出了问题!");   //如果出现异常我就让他这样输出一下,也方便我们调bug。
        }
        Timestamp date=new Timestamp(new Date().getTime());    //加个时间戳
        System.out.println("截止到 "+date);
        System.out.println("总共完成了"+codeFileNum+"个java文件");
        System.out.println("总共写了"+codeRowNum+"行代码");          //这三条输出直接输出到控制台上,看着清晰不然程序运行完了没什么反应看着不过瘾
        String string="       "+date+";"+"          "+codeFileNum+"          "+";"+"        "+codeRowNum+"      ";     //需要写道磁盘的字符串(中间的空格主要是为了保证写入文件之后能美观一点)
        File f=new File("F:\\数代码.txt");     //新建文件保存写入磁盘的内容
        BufferedWriter bufw=new BufferedWriter(new FileWriter(f,true));    //这里边有个参数必须要传入true,这是保证文件续写的关键,如果改成false,就会重写文件,之前的文件就会丢失
        bufw.write(string);
        bufw.newLine();
        bufw.write("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*");   //写入一行这个就是为了好看,木有为什么。
        bufw.newLine();
        bufw.flush();
        bufw.close();
    }

到这整个代码就算写完了,如果耐下心来看的话应该能看明白。
下边我把我的整体代码搬上来,这样看着舒服点:

import java.io.*;
import java.sql.Timestamp;
import java.util.Date;

/**
 * @author LiuHongyu @ NEFU
 * @date 2019/8/29 12:33
 */

/**
 * 这是一个用来数代码的程序,并将数出的代码数加上时间戳
 * 写到磁盘的“F:\\数代码.txt”中记录下来。
 */
public class CodeCount {
    public static void main(String[] args) throws IOException {
        File file=new File("F:\\");
        try {
            codeCount(file);
        }catch (IOException e){
            System.out.println("应该是文件路径出了问题!");
        }
        Timestamp date=new Timestamp(new Date().getTime());
        System.out.println("截止到 "+date);
        System.out.println("总共完成了"+codeFileNum+"个java文件");
        System.out.println("总共写了"+codeRowNum+"行代码");
        String string="       "+date+";"+"          "+codeFileNum+"          "+";"+"        "+codeRowNum+"      ";
        File f=new File("F:\\数代码.txt");
        BufferedWriter bufw=new BufferedWriter(new FileWriter(f,true));
        bufw.write(string);
        bufw.newLine();
        bufw.write("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*");
        bufw.newLine();
        bufw.flush();
        bufw.close();
    }

    //代码文件数,即总共创建了多少个java文件
    static int codeFileNum=0;
    //代码的行数,即总共写了多少行代码
    static long codeRowNum=0;

    /**
     * 递归遍历F盘文件的方法,同时数出代码数
     * 每个文件判断是否为目录,是--递归继续遍历
     *                         否--通过IO流进行文件的读操作同时计数行数
     * @param file:传入目标目录文件
     * @throws IOException
     */
    public static void codeCount(File file) throws IOException{
            File[] fileList = file.listFiles();
            if (fileList != null) {
                for (File ffile : fileList) {
                    if (ffile.isDirectory()) {
                        codeCount(ffile);
                    } else {
                        String ffileName=ffile.getName();
                        if(ffileName.endsWith(".java")){
                            codeFileNum+=1;
                            BufferedReader bufR=new BufferedReader(new FileReader(ffile));
                            String Text=bufR.readLine();
                            while(Text!=null){
                                codeRowNum+=1;
                                Text=bufR.readLine();
                            }
                            bufR.close();
                        }
                    }
                }
            }
    }
}

总结一下,整个程序中复习了IO流的内容,这次主要使用了字符流不过其他的也大体浏览了一下;复习了时间系统的一些类和方法比如java.util.Date类和数据库中的java.sql.Timestamp;期间也回忆了异常的处理的知识点。总的来说感觉还行,以后有机会再将它进一步优化一下,争取加上UI界面,哈哈哈。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

没有络腮胡

同为爱码士,咋能不打赏一下呢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值