Java 统计代码的小工具

简介:

统计代码的小工具,程序功能不是很完善,欢迎大家多给意见

 
  1. import java.awt.event.ActionEvent;  
  2. import java.awt.event.ActionListener;  
  3. import java.io.BufferedReader;  
  4. import java.io.File;  
  5. import java.io.FileNotFoundException;  
  6. import java.io.FileReader;  
  7. import java.io.IOException;  
  8. import javax.swing.JFileChooser;  
  9. import javax.swing.JFrame;  
  10. import javax.swing.JMenu;  
  11. import javax.swing.JMenuBar;  
  12. import javax.swing.JMenuItem;  
  13. import javax.swing.JScrollPane;  
  14. import javax.swing.JTextArea;  
  15. import javax.swing.UIManager;  
  16.  
  17. public class CodeCounterFrame extends JFrame  
  18. {  
  19.     JMenuBar menuBar = new JMenuBar();  
  20.     JMenu fileMenu = new JMenu("文件");  
  21.     JMenuItem openMenuItem = new JMenuItem("打开");  
  22.     JTextArea txa = new JTextArea();  
  23.     JScrollPane jsp =new JScrollPane(txa);  
  24.     String output = "";  
  25.     static long codeLines = 0;  
  26.     static long commentLines = 0;  
  27.     static long blankLines = 0;  
  28.     public CodeCounterFrame()  
  29.     {  
  30.         this.setJMenuBar(menuBar);  
  31.         menuBar.add(fileMenu);  
  32.         fileMenu.add(openMenuItem);  
  33.         txa.setEditable(false); //txa里面的内容不能被编辑  
  34.         add(jsp);  
  35.           
  36.         //内部匿名类监听器  
  37.         openMenuItem.addActionListener(new ActionListener()  
  38.         {  
  39.             public void actionPerformed(ActionEvent e)  
  40.             {  
  41.                 if(e.getSource() == openMenuItem)  
  42.                 {  
  43.                     //点击了打开菜单  
  44.                     //弹出文件选择器  
  45.                     JFileChooser chooser = new JFileChooser();  
  46.                     chooser.showOpenDialog(null);  
  47.                       
  48.                     //获取选中的文件  
  49.                     File selectedFile = chooser.getSelectedFile();  
  50.                     BufferedReader br = null;  
  51.                     boolean flag = false;  
  52.                     try {  
  53.                          FileReader reader = new FileReader(selectedFile);//读取文档的内容  
  54.                          br = new BufferedReader(reader);  
  55.                          String line = "";  
  56.                            
  57.                         //2读文件  
  58.                         while ((line = br.readLine()) != null)  
  59.                         {  
  60.                             line = line.trim(); // 除去注释前的空格  
  61.                             if (line.matches("^[ ]*$"))   
  62.                             {   
  63.                                 // 匹配空行  
  64.                                 blankLines++;  
  65.                             }   
  66.                             else if (line.startsWith("//"))   
  67.                             {  
  68.                                 commentLines++;  
  69.                             }   
  70.                               else if (line.startsWith("/*") && !line.endsWith("*/"))  
  71.                              {  
  72.                                 commentLines++;  
  73.                                 flag = true;  
  74.                             }   
  75.                             else if (line.startsWith("/*") && line.endsWith("*/"))   
  76.                             {  
  77.                                 commentLines++;  
  78.                             }   
  79.                             else if (flag == true)   
  80.                             {  
  81.                                 commentLines++;  
  82.                                 if (line.endsWith("*/"))   
  83.                                 {  
  84.                                     flag = false;  
  85.                                 }  
  86.                             }   
  87.                             else   
  88.                             {  
  89.                                 codeLines++;  
  90.                             }  
  91.                         }  
  92.  
  93.                         //将结果保存到output  
  94.                         output+=("代码行数:" + codeLines+"\n"+"注释行数:" + commentLines+"\n" 
  95.                                   +"空白行数: " + blankLines+"\n"+"总行数:" + (codeLines+commentLines+blankLines));  
  96.                           
  97.                         //将统计的结果在txa里面显示  
  98.                         txa.setText(output);  
  99.                     }   
  100.                     catch (FileNotFoundException ex)   
  101.                     {  
  102.                         ex.printStackTrace();  
  103.                     }   
  104.                     catch (IOException ex)   
  105.                     {  
  106.                         ex.printStackTrace();  
  107.                     }   
  108.                     finally   
  109.                     {  
  110.                         if (br != null)   
  111.                         {  
  112.                             try {  
  113.                                 br.close();  
  114.                                 br = null;  
  115.                             }   
  116.                             catch (IOException ex)   
  117.                             {  
  118.                                 ex.printStackTrace();  
  119.                             }  
  120.                         }  
  121.                     }  
  122.                 }  
  123.             }  
  124.         });  
  125.     }  
  126.       
  127.     //Frame主程序  
  128.        public static void main(String[] args)   
  129.        {  
  130.            try {  
  131.                  UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); //windows界面风格  
  132.             } catch (Exception e) {  
  133.                 e.printStackTrace();  
  134.             }  
  135.             CodeCounterFrame frame = new CodeCounterFrame();  
  136.             frame.setTitle("统计代码的小工具");  
  137.             frame.setSize(300,200);  
  138.             frame.setVisible(true);  
  139.             frame.setLocationRelativeTo(null);//窗体居中显示  
  140.             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  141.        }  
  142. }  
  143.       
  144.       
  145.       
  146.  
  147.       
  148.  

运行的窗口:

 输出的结果:


本文转自 lingdududu 51CTO博客,原文链接:http://blog.51cto.com/liangruijun/624394

相关文章
|
6天前
|
Java 测试技术 应用服务中间件
常见 Java 代码缺陷及规避方式(下)
常见 Java 代码缺陷及规避方式(下)
25 0
|
8天前
|
Java
Java中ReentrantLock释放锁代码解析
Java中ReentrantLock释放锁代码解析
25 8
|
11天前
|
前端开发 小程序 Java
uniapp上传图片 前端以及java后端代码实现
uniapp上传图片 前端以及java后端代码实现
28 0
|
13天前
|
设计模式 存储 Java
23种设计模式,享元模式的概念优缺点以及JAVA代码举例
【4月更文挑战第6天】享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享技术有效地支持大量细粒度对象的重用。这个模式在处理大量对象时非常有用,特别是当这些对象中的许多实例实际上可以共享相同的状态时,从而可以减少内存占用,提高程序效率
30 4
|
13天前
|
设计模式 Java 中间件
23种设计模式,适配器模式的概念优缺点以及JAVA代码举例
【4月更文挑战第6天】适配器模式(Adapter Pattern)是一种结构型设计模式,它的主要目标是让原本由于接口不匹配而不能一起工作的类可以一起工作。适配器模式主要有两种形式:类适配器和对象适配器。类适配器模式通过继承来实现适配,而对象适配器模式则通过组合来实现
30 4
|
14天前
|
存储 缓存 算法
优化 Java 后台代码的关键要点
【4月更文挑战第5天】本文探讨了优化 Java 后台代码的关键点,包括选用合适的数据结构与算法、减少不必要的对象创建、利用 Java 8 新特性、并发与多线程处理、数据库和缓存优化、代码分析与性能调优、避免阻塞调用、JVM 调优以及精简第三方库。通过这些方法,开发者可以提高系统性能、降低资源消耗,提升用户体验并减少运营成本。
|
15天前
|
Java 开发工具 流计算
flink最新master代码编译出现Java Runtime Environment 问题
在尝试编译Flink源码时遇到Java运行时环境致命错误:EXCEPTION_ACCESS_VIOLATION。问题出现在JVM.dll+0x88212。使用的是Java 11.0.28和Java HotSpot(TM) 64-Bit Server VM。系统为Windows客户端,没有生成核心dump文件。错误日志保存在hs_err_pid39364.log和replay_pid39364.log。要解决这个问题,建议检查JDK版本兼容性,更新JDK或参照错误报告文件提交Bug至http://bugreport.java.com/bugreport/crash.jsp。
|
16天前
|
Java
使用Java代码打印log日志
使用Java代码打印log日志
73 1
|
16天前
|
设计模式 Java 数据库
Java设计模式精讲:让代码更优雅、更可维护
【4月更文挑战第2天】**设计模式是解决软件设计问题的成熟方案,分为创建型、结构型和行为型。Java中的单例模式确保类仅有一个实例,工厂方法模式让子类决定实例化哪个类。适配器模式则协调不兼容接口间的合作。观察者模式实现了一对多依赖,状态变化时自动通知相关对象。学习和适当应用设计模式能提升代码质量和可维护性,但需避免过度使用。设计模式的掌握源于实践与不断学习。**
Java设计模式精讲:让代码更优雅、更可维护
|
17天前
|
SQL 设计模式 安全
Java单例模式几种写法以及代码案例拿来直接使用
Java单例模式几种写法以及代码案例拿来直接使用
31 0