统计指定目录下Java源代码的总行数

代码行统计(可以对C\C++、Java的源代码进行统计,统计结果包括:总行数、空行数、注释行数和代码行数,统计结果可以以表格的形式显示给用户或另存为文件) 代码行统计工具使用说明 代码行统计工具用Java语言实现,可以对C\C++、Java的源代码进行统计,统计结果包括:总行数、空行数、注释行数和代码行数,统计结果可以以表格的形式显示给用户或另存为文件。 一 执行环境: 操作系统:WindowsNT/2000; 执行环境:JDK1.3。 二 安装: 1)将code.zip解压缩; 3)设置环境变量: 在 开始—〉设置—〉控制面板—〉系统—〉高级—〉环境变量 中设置环境变量: PATH=[code.zip的安装目录]\jre\bin CLASSPATH=[code.zip的安装目录]\class 三 运行: 直接运行(双击)在源程序[code.zip的安装目录]\class目录下的CodeStatistic.bat 批处理文件。 〈注〉:如果程序不能正常运行,有可能是前面系统环境变量PATH、CLASSPATH设置的问题,请检查添加的路径是否正确,确定正确还不能正常运行,请注销当前用户后再启动程序。 四 使用方法: 1. 代码行统计工具开始工作后,点击窗口下方的“添加”按钮会以对话框的形式浏览硬盘目录,现在可以添加要进行统计的C\C++、Java源程序, 2. 选定文件后,会在代码行统计工具主界面的列表框中显示已选定的文件名和路径; 3. 点击“添加”按钮继续添加需统计的文件或点击“删除”按钮删除已选文件; 4. 需统计的文件选定后,点击“统计”按钮开始统计,弹出“代码行统计结果”窗口以表格形式显示统计结果; 5. 在“代码行统计结果” 窗口中可选择将统计结果另存为文件形式; 6. 点击“关闭”按钮关闭“代码行统计结果” 窗口,回到主窗口; 7. 继续其它统计活动或点击“退出”按钮退出代码行统计工具。 立即下载

遍历指定文件夹并统计代码行数,和Java关键字频率,降序输出所有结果。

默认统计.java文件,可以自定义统计其他源码。

打算将它整合到自己做的桌面小程序中。

部分输出如下:

代码总行数:11341
E:\java\以往习作\KingTetris.java--->行数:419
F:\EclipseProject\Test\src\king\countcode\CountCodeLine.java--->行数:340
F:\EclipseProject\记事本\src\king\notepad\view\NotepadFrame.java--->行数:332
F:\EclipseProject\五子棋\src\guyuanguanli.java--->行数:298
F:\EclipseProject\记事本\src\king\notepad\service\TextService.java--->行数:277
F:\EclipseProject\简易绘图板\src\King\Test.java--->行数:267
---------Java代码关键字统计:----------
关键字:new           出现次数:873
关键字:int           出现次数:668
关键字:public        出现次数:608
关键字:private       出现次数:520
关键字:null          出现次数:511
关键字:void          出现次数:413
关键字:static        出现次数:299
关键字:return        出现次数:293
关键字:if            出现次数:282
关键字:this          出现次数:232
关键字:class         出现次数:201
关键字:for           出现次数:161
关键字:true          出现次数:146
关键字:else          出现次数:92
关键字:final         出现次数:88
关键字:false         出现次数:79
关键字:case          出现次数:78
关键字:catch         出现次数:68
关键字:while         出现次数:67
关键字:try           出现次数:63
关键字:boolean       出现次数:60
关键字:extends       出现次数:56
关键字:implements    出现次数:55
关键字:throws        出现次数:45
关键字:break         出现次数:41
关键字:char          出现次数:40
关键字:super         出现次数:34
关键字:byte          出现次数:32
关键字:switch        出现次数:22
关键字:double        出现次数:17
关键字:abstract      出现次数:16
关键字:do            出现次数:15
关键字:protected     出现次数:13
关键字:synchronized  出现次数:9
关键字:long          出现次数:9
关键字:finally       出现次数:8
关键字:throw         出现次数:8
关键字:instanceof    出现次数:7
关键字:default       出现次数:6
关键字:float         出现次数:2
关键字:continue      出现次数:2
关键字:package       出现次数:2
关键字:transient     出现次数:2
关键字:import        出现次数:2
关键字:interface     出现次数:2
关键字:native        出现次数:2
关键字:volatile      出现次数:2
关键字:short         出现次数:2
关键字:strictfp      出现次数:1
关键字:enum          出现次数:1
关键字:const         出现次数:1
关键字:goto          出现次数:1
关键字:assert        出现次数:1

源码:

package king.countcode;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


/**
 * 统计指定目录下Java文件的总行数、关键字频率
 *
 */
public class CountCodeLine {
    private int count = 0;
    // 所有需要遍历的文件
    private List<File> allFile = new LinkedList<File>();
    // 所有遍历结果
    private Map<String, Integer> allResult = new HashMap<String, Integer>();
    // 排序后的所有遍历结果
    private List<Map.Entry<String, Integer>> allSortedResult = new LinkedList<Map.Entry<String, Integer>>();
    // 需要检查的文件后缀,默认添加.java
    private List<String> allSuffix = new LinkedList<String>();  
    private static final String JAVA_SUFFIX = ".java"; 
    
    //提取单词的正则表达式
    private Pattern p = Pattern.compile("(?<=\\W)\\w+(?=\\W)"); 
    
    //用于计数
    private Keywords countKeyword = new Keywords(); 
    
    public CountCodeLine(){
        addSuffix(JAVA_SUFFIX);
    }
    
    public static void main(String[] args) {
        CountCodeLine count = new CountCodeLine();
        
        // 添加需要检查的文件或文件夹
        count.addPath("E:\\java");
        count.addPath("F:\\EclipseProject");
        
//        // 遍历C盘之外所有硬盘
//        // 由于文件太多,全部遍历需要很久才能出结果,一般不建议
//        File[] roots = File.listRoots();
//        for(int i = 0; i < roots.length; i++){
//            // C盘某些文件夹无权限进入,会报错,故剔除
//            if (!roots[i].getAbsolutePath().toLowerCase().startsWith("c:")){
//                count.addPath(roots[i].getAbsolutePath());
//            }
//        }
        
        // 检查并返回统计 总行数
        System.out.println("代码总行数:" + count.execute());
        
        // 输出降序排列的总结果
        for(Map.Entry<String, Integer> entry : count.getAllSortedResult()){
            System.out.println(entry.getKey() + "--->行数:" + entry.getValue());
        }
        
        //输出所有Java文件中的关键字频率统计
        // 如果想统计单个文件,请在上方addPath()仅输入单个文件的绝对地址
        System.out.println();
        System.out.println("---------Java代码关键字统计:----------");
        System.out.println(count.getUsedKeywordFrequency());
        
    }
  
    
    /*
     * 添加需要检查的文件或文件夹
     */
    public void addPath(String path){
        allFile.add(new File(path));
    }
    
    /*
     * 添加需要检查的后缀名
     * 如果要用来统计其他后缀名的文件,请先clear()
     */
    public void addSuffix(String suffix){
        suffix = suffix.toLowerCase(); //全转小写
        if (!suffix.startsWith(".")) suffix = "." + suffix;
        allSuffix.add(suffix);
    }
    
    /*
     * 开始遍历
     */
    public int execute(){
        for(File file : allFile){
            checkFile(file);
        }
        // 排序所有结果
        sortAllResult(); 
        return getCount();
    }
    
    /*
     * 获取当前count值
     */
    public int getCount(){
        return count;
    }
    
    /*
     * 返回详细的结果
     * 文件名-代码行数映射的Set<Map.Entry<String, Integer>>
     */
    public Set<Map.Entry<String, Integer>> getAllResult(){
        return allResult.entrySet();
    }
    
    /**
     * 返回所有排序后的结果
     */
    public List<Map.Entry<String, Integer>> getAllSortedResult(){
        return new LinkedList<Map.Entry<String, Integer>>(allSortedResult);
    }
    
    /**
     * 返回关键字频率的统计结果
     * @return
     */
    public String getUsedKeywordFrequency(){
        return countKeyword.getUsedKeywordFrequency();
    }
    /*
     * 清空所有内容,以便开始全新的查找
     */
    public void clear(){
        count = 0;
        allFile.clear();
        allResult.clear();
        allSortedResult.clear();
        allSuffix.clear();        
    }
    
    /*
     * 遍历文件夹
     */
    private void checkFile(File file){
        if (file.isDirectory()){
            File[] files = file.listFiles();
            for(File f : files){
                checkFile(f);
            }
        } else if (checkSuffix(file)){
            countLine(file);
        }
//        // 下面是循环方法,当递归溢出时,可改用循环
//        Stack<File> stack = new Stack<File>();
//        stack.push(file);
//        while(!stack.isEmpty()){
//            File tmp = stack.pop();           
//            if (tmp.isDirectory()){
//                File[] files = tmp.listFiles();
//                for (File f : files){
//                    stack.push(f);
//                }
//            } else if (checkSuffix(tmp)){
//                countLine(tmp);
//            }
//        }
    }
    
    
    /**
     * 检查后缀名
     */
    private boolean checkSuffix(File file){
        String fileName = file.getName().toLowerCase();
        for(String suffix : allSuffix){
            if (fileName.endsWith(suffix)) return true;
        }
        return false;
    }

    /*
     * 统计Java文件的行数
     */
    private void countLine(File file){
        try (BufferedReader input = new BufferedReader(new FileReader(file))){
            String str = null;
            int tmpCount = 0;
            while ((str = input.readLine()) != null){
                // 检查这一行里的每一个单词
                Matcher m = p.matcher(str);
                while(m.find()){
                    // 判断是否Java关键字
                    countKeyword.checkWord(m.group());
                }
                tmpCount++;
            }
            count += tmpCount;
            allResult.put(file.getAbsolutePath(), tmpCount); //保存到集合中
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 排序所有统计结果
     * 降序
     */
    private void sortAllResult(){
        allSortedResult.addAll(allResult.entrySet());
        Collections.sort(allSortedResult, new Comparator<Map.Entry<String, Integer>>(){
            @Override
            public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2){
                int value1 = o1.getValue();
                int value2 = o2.getValue();
                if (value1 == value2) return 0;
                return value1 > value2 ? -1 : 1;
            }
        });
    }
}

//关键字集合,用于计数
class Keywords {
    // 所有关键字
    private Map<String, Integer> keywords = new HashMap<String, Integer>();   
    
    
    //构造器
    public Keywords(){
        reset();
    }
    
    //复位清零
    public void reset(){
        for(Keyword k : Keyword.values()){ //从枚举类获取关键字
            keywords.put(k.getKeyword(), 0);
        }
    }
    
    //检测一个单词是否关键字,如果是,就让对应的关键字频数加1
    public void checkWord(String word){
        if (keywords.keySet().contains(word)){
            keywords.put(word, keywords.get(word) + 1);
        }
    }
    
    //返回统计结果
    public String getUsedKeywordFrequency(){
        StringBuilder result = new StringBuilder();
        StringBuilder tmp = new StringBuilder();
        //按频数即value值排序
        //就算用TreeMap也只能对key排序,下面用自己写的比较器排序
        //继承Comparator接口改改名compare方法后,TreeSet会认为compare结果为0的两个元素是同一个元素,故不用TreeSet
        List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(keywords.entrySet());
        Collections.sort(list, new MyMapEntryComparator());
        for(Map.Entry<String, Integer> entry : list){
            if (entry.getValue() != 0){
                tmp.setLength(0);
                tmp.append("关键字:").append(entry.getKey()).append("出现次数:").append(entry.getValue());
                result.append(typeset(tmp)).append("\n");
            }
        }
        return result.toString();
    }
    
    /**
     * 将字符串排版再返回,如下输出不整齐
     * 关键字:null    出现次数:1
     * 关键字:implements  出现次数:1
     * 控制“关键字”和“出现次数”之间的空格,
     * 将来可能改变输出的汉字,故下面用正则式考虑更广泛的情况
     * @param StringBuilder
     * @return String
     */
    private String typeset(StringBuilder sb){
        StringBuilder result = new StringBuilder();
        int blank = 15; //不同组汉字之间的空白
        int index = 0, length = 0, differ;
        //找出右边不是紧邻汉字的汉字,向后数十五个空
        Pattern p = Pattern.compile("(?<![一-龥])[一-龥]+(?![一-龥])");
        Matcher m = p.matcher(sb);  
        while(m.find()){ //find()后移一位
            result.append(sb.substring(index, m.start()));
            if((differ = blank -(m.start() - index - length)) > 0 && m.start() != 0){
                while(differ-- > 0){
                    result.append(" ");
                }
            }           
            index = m.start();
            length = m.group().length();
        }
        //如果后面中文,则把剩下的全接上去
        result.append(sb.substring(index));
        return result.toString();
    }
    
    //比较用的Comparator,只在这时用到,故写成内部类
    private class MyMapEntryComparator implements Comparator<Map.Entry<String, Integer>>{
        @Override
        public int compare(Map.Entry<String, Integer> m1, Map.Entry<String, Integer> m2){
            return -(m1.getValue() - m2.getValue());
        }
    } 

}

//所有关键字,枚举类,仅用于存储
enum Keyword{
 ABSTRACT("abstract"), ASSERT("assert"), BOOLEAN("boolean"), BREAK("break")
     , BYTE("byte"), CASE("case"), CATCH("catch"), CHAR("char"), CLASS("class")
     , CONST("const"), CONTINUE("continue"), DEFAULT("default"), DO("do"), DOUBLE("double")
     , ELSE("else"), ENUM("enum"), EXTENDS("extends"), FALSE("false"), FINAL("final")
     , FINALLY("finally"), FLOAT("float"), FOR("for"), GOTO("goto"), IF("if")
     , IMPLEMENTS("implements"), IMPORT("import"), INSTANCEOF("instanceof"), INT("int")
     , INTERFACE("interface"), LONG("long"), NATIVE("native"), NEW("new"), NULL("null")
     , PACKAGE("package"), PRIVATE("private"), PROTECTED("protected"), PUBLIC("public")
     , RETURN("return"), SHORT("short"), STATIC("static"), STRICTFP("strictfp")
     , SUPER("super"), SWITCH("switch"), SYNCHRONIZED("synchronized"), THIS("this")
     , THROW("throw"), THROWS("throws"), TRANSIENT("transient"), TRY("try"), TRUE("true")
     , VOID("void"), VOLATILE("volatile"), WHILE("while");
 
 private String keyword;

 //构造器
 private Keyword(String keyword){
     this.keyword = keyword;
 }
 
 //获取keyword
 public String getKeyword() {
     return keyword;
 }

}


统计你写的java代码行数 NULL 博文链接:https://ily.iteye.com/blog/1399319 立即下载

相关推荐

java实现统计代码行数

用java实现统计代码行数,运行程序会统计编程的工作量以及有效代码的行数

用java程序 写一个统计java项目有多少行代码的工具

方法分别用于递归统计目录或文件的行数以及统计单个Java源代码文件的行数,替换成你自己的Java项目目录,然后运行程序即可统计该项目的行数。方法用于判断是否是注释行或空行。

java_study_的博客 1290

统计代码行数程序(可设置文件类型,可多目录、单目录统计,行数累加)

可以统计一个或多个文件夹内代码的行数 支持自定义文件扩展名 支持"{","}"识别 如 可设置将 { Response.End(); } 视作一行或三行.. 等

关于填写软件著作权申请表时源程序量总行数怎么确认的问题?

申报软件著作权登记填报申请表时有一个填报项目是软件源程序量,由上图可知源程序量指的是所登记软件的源程序的总行数或者总条数。 因为一个软件开发完成后会有多个代码文件夹及代码文件,如果一个个打开慢慢加总统计工作量会比较大而且也比较费时间,为了尽可能快的完成此项统计,在这里给大家推荐一个统计软件,即:SourceCounter。SourceCounter是一款专业的代码统计软件,可以用于统计C++、j...

weixin_46117365的博客 1万+

新手避坑指南:用COMSOL Multiphysics仿真气体放电(汤逊vs.流注)

本文详细介绍了使用COMSOL Multiphysics仿真气体放电的实战指南,涵盖汤逊理论和流注模型的实现方法。通过对比两种放电模型的关键参数和物理场配置,帮助新手避免常见错误,准确预测气体击穿过程。文章还提供了工程应用案例,如高压绝缘子设计优化,展示了仿真技术在电力设备绝缘设计中的实际价值。

weixin_28716181的博客 473

零基础玩转华为AP 4050DN-HD:FAT模式家庭无线网络配置实战

本文为零基础用户提供华为AP 4050DN-HD从FIT模式转换为FAT模式的完整实战教程。详细介绍了固件升级、模式转换以及配置家庭无线网络(包括路由、DHCP、Wi-Fi和NAT)的每一步操作,帮助用户将企业级瘦AP改造为高性能家庭胖AP,打造稳定可靠的家庭网络环境。

weixin_29196613的博客 630

统计前端项目代码的总行数

统计前端项目代码的总行数

ideal-lingyun 3019

PX4飞控 vs 大疆A3:开源与闭源方案在无人机硬件架构中的实战对比

本文深入对比了PX4飞控与大疆A3在无人机硬件架构上的差异,分析了开源与闭源方案在工业级无人机开发中的优劣势。通过详细的硬件配置、传感器兼容性、扩展能力及性能测试数据,为开发者提供选型指南,特别适合需要自定义算法和复杂功能集成的项目。

a3b4c5的博客 888

java如何统计软件代码行数

Java如何统计软件代码行数 在软件开发过程中,代码行数是一个重要的度量指标,它能够反映出项目的复杂程度、开发工作量等信息。通过统计代码行数,团队可以更好地进行项目管理和工作评估。本文将介绍如何使用Java编写一个程序来统计软件代码行数,并展示如何通过饼状图直观地呈现不同类型代码的比例。 一、项目需求分析 在进行代码行数统...

weixin_37079190的博客 687

使用 MATLAB/Simulink + Deep Learning Toolbox,构建一个基于LSTM的电网负荷预测模

本文介绍了一个基于Simulink和深度学习的智能电网负荷预测与调度建模方法。通过LSTM神经网络构建负荷预测模型,将历史负荷、天气、日期等特征作为输入,预测未来24小时负荷。然后将训练好的模型集成到Simulink仿真系统中,结合发电单元模型和经济调度逻辑,实现预测驱动的电力调度优化。实验结果表明,该方法预测误差在2.5%-4.0%之间,相比传统调度方式可降低15%-25%的运行成本。文章详细展示了从数据准备、特征工程、模型训练到系统集成的完整流程,为智能电网中AI技术的应用提供了实用参考。

amy_mhd的博客 171

自动驾驶算法/规划决策控制算法面经汇总、学习路线、面经心得

自动驾驶算法学习路线,面试求职大全

qq_41667348的博客 1万+

统计java源代码行数——coding篇

----------------------------------------------------------------------- 转自: http://fanyang219.iteye.com/blog/186968 -----------------------------------------------------------------------   packag...

Love Cafe, Love Java 632

FISCO BCOS 系列(一)—— 搭建第一个区块链网络&配置控制台指南

本文详细介绍了FISCO BCOS区块链网络的搭建与配置过程,包括环境准备、单机四节点网络搭建、控制台配置使用等核心内容。从系统要求、依赖安装开始,逐步指导如何通过脚本快速搭建区块链网络,配置控制台连接,并演示了账户管理、合约部署调用等基础操作。同时提供了多节点网络配置、常见问题解决方案以及生产环境安全建议,为开发者提供了从入门到进阶的完整指南。

分享AI、区块链技术及应用,未来已来 809

java源码文件夹_java_获取多个文件夹下所有.java源码的总行数

import java.io.BufferedReader;import java.io.File;import java.io.FileReader;import java.io.IOException;import java.util.ArrayList;public class GetSourceCodeSumLine {/*** @param args*/public static voi...

weixin_39752880的博客 122

AI处理器组合

编号0-3的处理器处于同一个链路中,编号4-7的处理器处于另外一个链路中,不通链路中的处理器不能通信,如下图所示。- 如果申请处理器个数为1,则选择同一链路,剩余可用的处理器数量为1个的最佳,其次是剩余3个的为次佳,然后是剩余2个,最后是剩余4个。输出为组合列表,当array=[0, 1, 4, 5, 6, 7] ,num=1时,输出为[[0], [1]]- 如果申请处理器个数为2,则选择同一链路剩余可用的处理器数量2个的为最佳,其次是剩余4个,最后是剩余3个。任务申请1个处理器。

面试高手的博客 1万+

【车联网】Automotive 软件过程能力成熟度模型——ASPICE标准入门介绍

ASPICE标准详细定义了与汽车电子软件开发相关的各种术语和概念,包括软件组件、系统集成、测试和验证等。这些定义确保了所有开发团队在使用相同术语时具有一致的理解。

奶爸的编程之路,也就一周冷个三天 2679

linux统计目录源代码行数,Linux下统计当前目录下源代码行数的Shell脚本

#!/bin/bash -#===============================================================================## FILE: count.sh## USAGE: ./count.sh## DESCRIPTION:## OPTIONS: ---# REQUIREME...

weixin_39911066的博客 166

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

代码统计JAVA

【代码】代码统计JAVA。

qq_42517856的博客 151

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

java代码统计_代码行数统计java实现

import java.io.BufferedReader;import java.io.File;import java.io.FileReader;import java.io.IOException;import java.util.ArrayList;import java.util.Scanner;public class CodeCount {static int count = 0;...

weixin_39802055的博客 112

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

计算一个目录下代码行数

package com.daoyixing.eshop.d.controller; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.util.ArrayList; import java.util.List; /** * *******************

书香代码 515

java程序员代码行数_统计项目代码行数-Java代码版

1.[代码]Java代码import java.io.BufferedReader;import java.io.File;import java.io.FileReader;import java.util.ArrayList;import java.util.List;/*** *********************************************** @descripti...

weixin_34277051的博客 180

使用的递归,查询自己的Java项目一共有多少行java代码

查询自己写了多少行代码

fashion_dog的博客 1648

编写程序统计自己编写了多少个java程序,总共多少行代码?

【代码】编写程序统计自己编写了多少个java程序,总共多少行代码?

qq_62975017的博客 196

Java实验15 Java源程序分析程序

题目类别: 实验 关键字: 类、对象、封装、类之间的关系、字符串、文本IO、File 内容要求: 1 . 编写一个Java应用程序。 2 . 要求实现功能如下: (1) 从键盘输入一个字符串,表示一个目录名称。 (2) 如果输入目录名称对应的目录不存在或不是目录,则输出: [目录名称] 不是合法的目录名称! (3) 如果是合法存在的目录,则对该目录中的Java源程序文件进行分析,分析内容包括: 合计部分:源程序文件个数、源程序文件行数、其中空行数、总的字节数。 细节部分:每个源程序文件的行数、其中空行

zg 2255

文件统计

 /***  统计到目前为止写了多少个java源文件,共计多少行代码,多少个类,用的最多的类名是什么*  将这四个信息存成一个文件*/import java.io.*;import java.util.*;class  JavaCounter{ private int fileCount;      //记录java文件数目 private int rowCount;      //记录代码行

不落的太阳 2264
上一篇: HttpClient使用详解
下一篇: Java时区TimeZone与操作系统时区不一致
KingLearnJava
博客等级 码龄12年 93粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值