java实现代码统计小程序

首先,为了实现一个Java代码统计小程序,我们需要掌握以下几个方面的知识:

  1. Java I/O 操作:Java I/O 操作可以让我们读取和写入文件内容,包括字符流和字节流两种方式。

  2. Java 正则表达式:正则表达式可以帮助我们识别代码中的各种语句和注释,便于代码统计。

  3. Java 集合框架:Java 集合框架中的 List、Set 等集合类型可以帮助我们存储和分析代码内容。

接下来,我们将一步一步地介绍如何实现一个统计 Java 代码文件行数、字符数、注释数和空行数的小程序。

步骤一:读取文件

我们首先需要从文件中读取代码内容。可以通过 Java 的 FileInputStream 或 FileReader 两种方式来实现文件读取,同时考虑到代码文件可能包含中文字符,我们可以使用 BufferedReader 和 InputStreamReader 进行字符编码转换,从而避免乱码问题。示例代码如下:

// 读取文本文件内容
public String readTextFile(String fileName) throws IOException {
    FileInputStream fis = new FileInputStream(fileName);
    BufferedReader br = new BufferedReader(new InputStreamReader(fis, "UTF-8"));
    StringBuilder sb = new StringBuilder();
    String line;
    while ((line = br.readLine()) != null) {
        sb.append(line);
        sb.append(System.lineSeparator());
    }
    br.close();
    return sb.toString();
}

步骤二:分析代码行数

对于 Java 代码行数统计,我们可以使用正则表达式来移除代码文件中的所有注释和空行,然后统计剩余行数即可。示例代码如下:

// 统计代码行数
public int countCodeLines(String content) {
    String[] lines = content.split("\\r?\\n");
    int count = 0;
    for (String line : lines) {
        line = line.trim();
        if (!line.isEmpty() && !line.matches("^\\/{2,}\\s*$")) {
            count++;
        }
    }
    return count;
}

步骤三:分析注释行数

Java 代码中注释有两种形式,即单行注释和多行注释。对于单行注释,我们可以使用 String 类的 startsWith() 方法快速判断,对于多行注释,我们可以使用正则表达式来识别。示例代码如下:

// 统计注释行数
public int countCommentLines(String content) {
    String[] lines = content.split("\\r?\\n");
    int count = 0;
    boolean inComment = false;
    for (String line : lines) {
        line = line.trim();
        if (line.startsWith("//") || line.startsWith("/*") || line.endsWith("*/")) {
            count++;
            continue;
        }
        if (inComment) {
            count++;
        }
        if (line.matches("^\\s*/\\*.*")) {
            count++;
            inComment = true;
        } else if (line.matches(".*\\*/\\s*$")) {
            count++;
            inComment = false;
        } else if (inComment) {
            count++;
        }
    }
    return count;
}

步骤四:分析空白行数

对于空白行,我们使用 String 类的 isEmpty() 方法进行统计。示例代码如下:

// 统计空白行数
public int countBlankLines(String content) {
    String[] lines = content.split("\\r?\\n");
    int count = 0;
    for (String line : lines) {
        if (line.trim().isEmpty()) {
            count++;
        }
    }
    return count;
}

通过以上几步,我们就可以实现一个简单的 Java 代码统计小程序了。下面给出一个完整的代码示例:

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class CodeCounter {

    // 读取文本文件内容
    public String readTextFile(String fileName) throws IOException {
        FileInputStream fis = new FileInputStream(fileName);
        BufferedReader br = new BufferedReader(new InputStreamReader(fis, "UTF-8"));
        StringBuilder sb = new StringBuilder();
        String line;
        while ((line = br.readLine()) != null) {
            sb.append(line);
            sb.append(System.lineSeparator());
        }
        br.close();
        return sb.toString();
    }

    // 统计代码行数
    public int countCodeLines(String content) {
        String[] lines = content.split("\\r?\\n");
        int count = 0;
        for (String line : lines) {
            line = line.trim();
            if (!line.isEmpty() && !line.matches("^\\/{2,}\\s*$")) {
                count++;
            }
        }
        return count;
    }

    // 统计注释行数
    public int countCommentLines(String content) {
        String[] lines = content.split("\\r?\\n");
        int count = 0;
        boolean inComment = false;
        for (String line : lines) {
            line = line.trim();
            if (line.startsWith("//") || line.startsWith("/*") || line.endsWith("*/")) {
                count++;
                continue;
            }
            if (inComment) {
                count++;
            }
            if (line.matches("^\\s*/\\*.*")) {
                count++;
                inComment = true;
            } else if (line.matches(".*\\*/\\s*$")) {
                count++;
                inComment = false;
            } else if (inComment) {
                count++;
            }
        }
        return count;
    }

    // 统计空白行数
    public int countBlankLines(String content) {
        String[] lines = content.split("\\r?\\n");
        int count = 0;
        for (String line : lines) {
            if (line.trim().isEmpty()) {
                count++;
            }
        }
        return count;
    }

    // 测试代码
    public static void main(String[] args) throws IOException {
        CodeCounter counter = new CodeCounter();
        String content = counter.readTextFile("HelloWorld.java");
        int codeLines = counter.countCodeLines(content);
        int commentLines = counter.countCommentLines(content);
        int blankLines = counter.countBlankLines(content);
        System.out.println("Code lines: " + codeLines);
        System.out.println("Comment lines: " + commentLines);
        System.out.println("Blank lines: " + blankLines);
    }

}

在实际使用中,我们只需要替换掉 main() 函数中的文件名参数即可统计指定的 Java 代码文件。例如,经测试,使用上述代码统计经典的 Hello World 程序(仅含单行注释)结果如下:

Code lines: 3
Comment lines: 1
Blank lines: 1

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java实现代码统计小程序 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • java编程题之从上往下打印出二叉树

    Java编程题之从上往下打印出二叉树 题目描述 给定一棵二叉树的根节点,从上往下按层打印出这个二叉树,同一层的节点按照从左到右的顺序打印。 例如,给定一个如下所示的二叉树: 8 / \ 6 10 / \ / \ 5 7 9 11 打印出的顺序为:8 6 10 5 7 9 11。 解题思路 此题的解法可以用到二叉树的遍历,我们可以用队列来保存每一层的节点。 将…

    Java 2023年5月26日
    00
  • vue2+springsecurity权限系统的实现

    下面我来详细讲解“vue2+springsecurity权限系统的实现”的完整攻略。 一、前后端分离架构说明 前后端分离架构是近年来比较流行的一种架构模式,其核心思想就是将前端与后端完全分离,前端负责 UI 的实现和展示,后端则提供数据接口 API。这种架构模式的优点是前后端职责分离,能提高开发效率和维护性,同时能提供更好的用户体验和响应速度。 二、技术选型…

    Java 2023年6月3日
    00
  • 详解IDEA用maven创建springMVC项目和配置

    以下是关于“详解IDEA用Maven创建SpringMVC项目和配置”的完整攻略,其中包含两个示例。 详解IDEA用Maven创建SpringMVC项目和配置 在使用SpringMVC框架开发Web应用程序时,使用Maven构建项目是一个非常好的选择。本文将介绍如何使用Maven和IDEA创建SpringMVC项目,并配置相关依赖和插件。 创建Maven项目…

    Java 2023年5月16日
    00
  • 响应式编程初探

    响应式 响应式系统(Reactive System) 具有以下特质:即时响应性(Responsive)、回弹性(Resilient)、弹性(Elastic)以及消息驱动(Message Driven)响应式系统更加灵活,松耦合,可伸缩 即时响应性 只要有可能, 系统就会及时地做出响应。 即时响应是可用性和实用性的基石, 而更加重要的是,即时响应意味着可以快速…

    Java 2023年4月17日
    00
  • java创建txt文件并存入内容

    下面就为您详细讲解如何使用Java语言创建txt文件并存入内容的完整攻略。 1. 准备工作 在创建和存入txt文件之前,我们需要先建立一个Java项目,打开eclipse等IDE并创建一个Java类。接着引入如下包: import java.io.File; import java.io.FileWriter; import java.io.IOExcept…

    Java 2023年5月20日
    00
  • 数据库中经常用到的操作和管理数据库的语句总结

    下面是数据库中经常用到的操作和管理数据库的语句总结的攻略。 数据库的操作 创建数据库 创建数据库的语句如下: CREATE DATABASE db_name; 其中,db_name 为数据库的名称。在执行此命令时,数据库的名称必须是唯一的。 删除数据库 删除数据库的语句如下: DROP DATABASE db_name; 其中,db_name 为要删除的数据…

    Java 2023年6月15日
    00
  • 利用Java的Struts框架实现电子邮件发送功能

    利用Java的Struts框架实现电子邮件发送功能 在Struts框架中,可以使用JavaMail实现电子邮件的发送。下面是实现电子邮件发送的完整攻略: 步骤1:导入JavaMail和相关依赖 要使用JavaMail,需要将相关的jar包导入项目中。可以下载JavaMail的jar包和JAF(Java Activation Framework)的jar包,导…

    Java 2023年5月20日
    00
  • JSP与JS交互问题 值传递

    JSP与JS交互问题是Web开发中非常关键的一点,在实际开发中经常会遇到需要将JSP页面中的数据传递给JS,或者需要将JS中的数据传递给JSP页面的情况。需要解决值传递的问题。 下面通过两个示例分别说明如何在JSP和JS之间实现值传递。 JSP向JS传递值 首先在JSP页面定义需要传递的数据: <% String username = "张三…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部