基于JAVA实现的仿WC统计程序
Posted caihaijie
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于JAVA实现的仿WC统计程序相关的知识,希望对你有一定的参考价值。
目标要求: wc.exe 是一个常见的工具,它能统计文本文件的字符数、单词数和行数。这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数、单词数和行数,并具备了一定的图形化实现。
1.Github 地址:https://gitee.com/caihaijie/WC.git
2.PSP表格
PSP2.1 | 预估耗时(分钟 | 实际耗时(分钟) |
Planning | 25 | 30 |
Estimate | 200 | 230 |
Development | 120 | 150 |
Analysis | 20 | 20 |
Design Spec | 20 | 20 |
Design Review | 20 | 20 |
Coding Standard | 10 | 15 |
Design | 30 | 45 |
Coding | 150 | 180 |
Code Review | 20 | 15 |
Test | 10 | 20 |
Reporting | 30 | 40 |
Test Report | 20 | 20 |
Size Measurement | 10 | 10 |
Postmortem & Process Improvement Plan | 20 | 30 |
705 | 855 |
3.解题思路
当初看到题目的第一想法就是打算用JAVA写一个简单的图形化窗口,用checkbox复选框实现三个功能的点击选择,用File类获得文件后再计算字符数、单词数、行数,再在TextArea上输出三者的统计结果。
4.设计实现过程
只有一个类:WcGUI
WcGUI包括图形化实现、控件监听方法、主函数
public void createAndShowGUI()图形化实现
class FileChooseListener implements ActionListener 打开文件的监听方法,返回文件
class OneListener implements ActionListener
class TwoListener implements ActionListener
class ThreeListener implements ActionListener 三个复选框的监听方法,输出字符数、单词数、行数的统计结果
5.代码说明
1 public class WcGUI { 2 /**{ 3 * 创建并显示GUI。出于线程安全的考虑, 4 * 这个方法在事件调用线程中调用。 5 */ 6 //创建一个文本方便观看输出结果 7 private TextArea result = new TextArea(); 8 /* 创建三个变量判断字符数、单词数、行数按钮的点击*/ 9 int zifushu = 0; 10 int dancishu = 0; 11 int hangshu = 0; 12 13 public void createAndShowGUI() { 14 // 确保一个漂亮的外观风格 15 JFrame.setDefaultLookAndFeelDecorated(true); 16 17 18 // 创建及设置窗口 19 JFrame frame = new JFrame("WC"); 20 JButton open = new JButton("open"); 21 22 //给open按钮设置监听事件 23 open.addActionListener(new FileChooseListener()); 24 25 frame.setLayout(new BoxLayout(frame,BoxLayout.Y_AXIS)); 26 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 27 JPanel panel = new JPanel(); 28 29 // 创建复选框 30 JCheckBox checkBox01 = new JCheckBox("字符数"); 31 JCheckBox checkBox02 = new JCheckBox("单词数"); 32 JCheckBox checkBox03 = new JCheckBox("行数"); 33 34 35 checkBox01.addActionListener(new OneListener()); 36 checkBox02.addActionListener(new TwoListener()); 37 checkBox03.addActionListener(new ThreeListener()); 38 39 Box topbox = Box.createHorizontalBox(); 40 Box midbox = Box.createVerticalBox(); 41 topbox.add(checkBox01); 42 topbox.add(checkBox02); 43 topbox.add(checkBox03); 44 midbox.add(result); 45 midbox.add(open); 46 47 /*panel.add(checkBox01); 48 panel.add(checkBox02); 49 panel.add(checkBox03); 50 panel.add(checkBox04); 51 panel.add(checkBox05);*/ 52 panel.add(topbox); 53 panel.add(midbox); 54 55 frame.setContentPane(panel); 56 57 // 添加 标签 58 JLabel label = new JLabel("先勾选功能再open文件"); 59 frame.getContentPane().add(label); 60 61 // 显示窗口 62 frame.pack(); 63 frame.setBounds(50,50,500,500); 64 frame.setVisible(true); 65 } 66 //文件选择窗口的创建 67 class FileChooseListener implements ActionListener{ 68 69 @Override 70 public void actionPerformed(ActionEvent e) { 71 JFileChooser jfc=new JFileChooser(); 72 jfc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES ); 73 jfc.showDialog(new JLabel(), "选择"); 74 File file=jfc.getSelectedFile();//得到文件 75 if(file.isDirectory()){ 76 System.out.println("文件夹:"+file.getAbsolutePath()); 77 }else if(file.isFile()){ 78 System.out.println("文件:"+file.getAbsolutePath()); 79 } 80 try (BufferedReader br = new BufferedReader(new FileReader(file))) { 81 82 String s="" ; 83 int a=0;//字符数 84 int b=0;//行数 85 int c=0;//单词数 86 87 while ((s = br.readLine())!=null){ 88 89 b++; 90 a+=s.length(); 91 c+=s.split("\\s+").length; 92 } 93 if (zifushu==1){ 94 result.append("字符数:"+a);} 95 if (dancishu==1){ 96 result.append((" 单词数:"+c)); 97 } 98 if (hangshu==1){ 99 result.append(" 行数:"+b); 100 } 101 if (zifushu==0&&dancishu==0&&hangshu==0){ 102 result.append("输出为空,请选择功能"); 103 } 104 } catch (IOException e1) { 105 e1.printStackTrace(); 106 } 107 } 108 } 109 //三个复选框的监听事件 110 class OneListener implements ActionListener{ 111 public void actionPerformed(ActionEvent event) 112 { 113 JCheckBox checkBox = (JCheckBox) event.getSource(); 114 System.out.println(checkBox.getText() + " 是否选中: " + checkBox.isSelected()); 115 if (checkBox.isSelected()==true) 116 {zifushu=1;} 117 else { 118 zifushu=0; 119 } 120 121 122 123 } 124 } 125 class TwoListener implements ActionListener{ 126 127 @Override 128 public void actionPerformed(ActionEvent e) { 129 JCheckBox checkBox = (JCheckBox) e.getSource(); 130 System.out.println(checkBox.getText() + " 是否选中: " + checkBox.isSelected()); 131 if (checkBox.isSelected()==true) { 132 dancishu = 1; 133 } 134 else{ 135 dancishu = 0; 136 } 137 } 138 } 139 class ThreeListener implements ActionListener{ 140 141 @Override 142 public void actionPerformed(ActionEvent e) { 143 JCheckBox checkBox = (JCheckBox) e.getSource(); 144 System.out.println(checkBox.getText() + " 是否选中: " + checkBox.isSelected()); 145 if (checkBox.isSelected()==true){ 146 hangshu=1;} 147 else{ 148 hangshu = 0; 149 } 150 } 151 } 152 153 public static void main(String[] args) { 154 // 显示应用 GUI 155 javax.swing.SwingUtilities.invokeLater(new Runnable() { 156 public void run() { 157 WcGUI wcGUI=new WcGUI(); 158 wcGUI.createAndShowGUI(); 159 } 160 }); 161 } 162 }
6.测试运行
(1)空文件
(2)八个字符两个单词两行的文件
3.打开文件的窗口
7.遇到的困难及解决方法
由于JAVA已经很久没接触,所以一开始敲代码的时候有点不顺畅。先去csdn看了需要用的函数的相关博客,然后再开始写项目。对于布局控件的操作并不是特别熟练,导致窗口有些简陋(嘻嘻),在计算字符数、单词数、行数的时候,因为钻了牛角尖想得有点复杂,查看了别人的博客后,恍然大悟。
以上是关于基于JAVA实现的仿WC统计程序的主要内容,如果未能解决你的问题,请参考以下文章