Word文档和记事本工具是日常生活工作中两种非常常用的文本编辑器,它们的功能既丰富,又强大。但是,对于有些非常实用的功能,Word文档具备,记事本工具缺失,例如字数统计功能。因此,为了让用户在使用记事本工具后能够快速地得到记事本文件中的字符数,这里将介绍如何用Java开发一个简单的字符统计工具。用户通过这个工具,能够快速地得到在某一个记事本文件中有多少个数字、字母、英文标点和字符。效果如图1和图2所示。
图1 初始界面
图2 统计并显示记事本文件中的数字总数、字母总数(包含文字 、英文标点总数和字符总数
要统计并显示记事本文件中的数字总数、字母总数(包含文字 、英文标点总数和字符总数。主要用到Java中的StreamTokenizer类。StreamTokenizer类用于将任何输入流分割为一系列标记。通常情况下,StreamTokenizer类认为以下内容是标记
英文字母 a z、A Z;
数字 0、1、2、3……;
空白字符 0到32之间的ASCII值;
注释符号 /;
英文格式下的单引号和双引号 ' 和 "。
StreamTokenizer类的构造方法的语法格式如下
StreamTokenizer(Reader r)
r 提供输入流的Reader对象。
StreamTokenizer类包含一些非常重要的、用于标记读取文件中的内容的常量。这些常量与含义如表17.1所示。
表17.1 StreamTokenizer类中的常量及其说明
常量名 | 说 明 |
TT_EOF | 表示读取到文件末尾 |
TT_WORD | 指示读到一个文字标记的常量 |
TT_NUMBER | 表示已读到一个数字标记的常量 |
需要注意的是,在统计文件的字符数时,不能简单统计标记的个数,因为文件的字符数不等于标记的个数。按照StreamTokenizer类对标记的说明,就算引号中的字符多达数百个,也会被StreamTokenizer类视作一个标记。因此,如果希望把引号和引号中的字符都做统计,就应该使用StreamTokenizer类中的ordinaryChar()方法把英文格式下的单引号和双引号都当作普通字符。关键实现步骤如下
(1 首先定义一个静态的、参数为记事本文件完整路径的statis()方法,该方法返回的是一个int型的一维数组。因为StreamTokenizer类的构造方法需要一个Reader对象,所以在statis()方法中,定义一个值为null的FileReader类的对象fileReader。为了避免读写记事本文件的过程中发生异常,需要在StatUtil类中使用try-catch块对可能发生的异常进行捕获。代码如下
01 public class StatUtil { 02 public static int[] statis(String fileName) { 03 FileReader fileReader = null; 04 try { 05 …// 省略try块中的代码 06 } catch (Exception e) { 07 e.printStackTrace(); 08 } 09 } 10 } |
(2 借助statis()方法中的参数,即可创建一个FileReader类的对象,把这个对象赋值给已经定义的FileReader类的对象fileReader。使用对象fileReader,即可创建一个StreamTokenizer类的对象stokenizer。在统计记事本文件的字符数时,为了把英文格式下的引号和引号中的字符都做统计,需要使用StreamTokenizer类中的ordinaryChar()方法把单引号和双引号都当作普通字符。此外,还需要把英文格式下的注释符号“/” 当作普通字符。代码如下所示
statis()方法具有返回值,返回的是一个int型的一维数组。这个一维数组包含4个元素,它们分别是数字总数、字母总数(包含文字 、英文标点总数和字符总数。代码如下
01 int[] length = new int[4]; // 定义保存计算结果的int型数组 02 int numberSum = 0; // 定义保存数字的变量 03 int symbolSum = 0; // 定义保存英文标点数的变量 04 int wordSum = 0; 05 int sum = 0; // 定义保存总字符数的变量 |
(3 在使用StreamTokenizer类的对象stokenizer读取被选中的记事本文件时,如果没有读到这个记事本文件的末尾,就会一直读取被选中的记事本文件。为了体现这个读取的过程,将使用while循环语句。为了统计出记事本文件中的数字总数、字母总数(包含文字 和英文标点总数,需要用到表17.1中的常量,因为常量不止一个,所以使用switch语句会得到事半功倍的结果。最后,把得到数字总数、字母总数(包含文字 和英文标点总数依次存储到int型的一维数组中。代码如下
01 String str; 02 while (stokenizer.nextToken() != StreamTokenizer.TT_EOF) { // 如果没有读到文件的末尾 03 switch (stokenizer.ttype) { // 判断读取标记的类型 04 case StreamTokenizer.TT_NUMBER: // 如果用户读取的是一个数字标记 05 str = String.valueOf(stokenizer.nval); // 获取读取的数字值 06 numberSum += str.length() 2; // 计算读取的数字长度 07 length[0] = numberSum; // 设置数组中的元素 08 break; // 退出语句 09 case StreamTokenizer.TT_WORD: // 如果读取的是文字标记 10 str = stokenizer.sval; // 获取该标记 11 wordSum += str.length(); // 计算该文字的长度 12 length[1] = wordSum; 13 break; 14 default: // 如果读取的是其他标记 15 str = String.valueOf((char) stokenizer.ttype); // 读取该标记 16 symbolSum += str.length(); // 计算该标记的长度 17 length[2] = symbolSum; // 设置int数组中的元素 18 } 19 } |
得到记事本文件中的数字总数、字母总数(包含文字 和英文标点总数后,把它们相加即可得到这个记事本文件中的字符总数,而且字符总数也要被存储到int型的一维数组中。因为statis()方法具有返回值,所以需要使用return关键字返回这个int型的一维数组。代码如下
01 sum = symbolSum + numberSum + wordSum; // 获取总字符数 02 length[3] = sum; 03 return length; |
Powered by 小羊羔外链网 8.3.11
©2015 - 2024 小羊羔外链网
您的IP:23.22.35.162,2024-04-23 04:49:04,Processed in 0.05515 second(s).