使用StreamTokenizer统计文件的字符

网友投稿 614 2022-12-01

使用StreamTokenizer统计文件的字符数

使用StreamTokenizer统计文件的字符数

关键技术:

java.io.StreamTokenizer可以获取输入流并将其分析为Token(标记)。StreamTokenizer的nextToken方法将读取下一个标记默认情况下,StreamTokenizer认为下列内容是Token:字母、数字、除C和C++注释符号以外的其他符号。如符号“/”不是Token,注释后的内容也不是,而“\”是Token。单引号和双引号以及其中的内容,只能算是一个Token。要统计文件的字符数,不能简单地统计Token数,因为字符数不等于Token,按照Token的规定,引号中的内容就算是10页也算是一个Token。如果希望引号和引号中的内容都算作Token,应该通过StreamTokenizer的ordinaryCha方法将单引号和双引号当做普通字符处理。

package book.io; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.io.StreamTokenizer; /** * 使用StreamTokenizer来统计文件中的字符数 * StreamTokenizer 类获取输入流并将其分析为“标记”,允许一次读取一个标记。 * 分析过程由一个表和许多可以设置为各种状态的标志控制。 * 该流的标记生成器可以识别标识符、数字、引用的字符串和各种注释样式。 * * 默认情况下,StreamTokenizer认为下列内容是Token: 字母、数字、除C和C++注释符号以外的其他符号。 * 如符号"/"不是Token,注释后的内容也不是,而"\"是Token。单引号和双引号以及其中的内容,只能算是一个Token。 * 统计文章字符数的程序,不是简单的统计Token数就万事大吉,因为字符数不等于Token。按照Token的规定, * 引号中的内容就算是10页也算一个Token。如果希望引号和引号中的内容都算作Token,应该调用下面的代码: * st.ordinaryChar('\''); * st.ordinaryChar('\"'); */ public class StatisFileChars { /** * 统计字符数 * @param fileName 文件名 * @return 字符数 */ public static long statis(String fileName) { FileReader fileReader = null ; try { fileReader = new FileReader(fileName); // 创建分析给定字符流的标记生成器 StreamTokenizer st = new StreamTokenizer( new BufferedReader( fileReader)); // ordinaryChar方法指定字符参数在此标记生成器中是“普通”字符。 // 下面指定单引号、双引号和注释符号是普通字符 st.ordinaryChar( ' \ '' ); st.ordinaryChar( ' \" ' ); st.ordinaryChar( ' / ' ); String s; int numberSum = 0 ; int wordSum = 0 ; int symbolSum = 0 ; int total = 0 ; // nextToken方法读取下一个Token. // TT_EOF指示已读到流末尾的常量。 while (st.nextToken() != StreamTokenizer.TT_EOF) { // 在调用 nextToken 方法之后,ttype字段将包含刚读取的标记的类型 switch (st.ttype) { // TT_EOL指示已读到行末尾的常量。 case StreamTokenizer.TT_EOL: break ; // TT_NUMBER指示已读到一个数字标记的常量 case StreamTokenizer.TT_NUMBER: // 如果当前标记是一个数字,nval字段将包含该数字的值 s = String.valueOf((st.nval)); System.out.println(s); numberSum += s.length(); break ; // TT_WORD指示已读到一个文字标记的常量 case StreamTokenizer.TT_WORD: // 如果当前标记是一个文字标记,sval字段包含一个给出该文字标记的字符的字符串 s = st.sval; wordSum += s.length(); break ; default : // 如果以上3中类型都不是,则为英文的标点符号 s = String.valueOf(( char ) st.ttype); symbolSum += s.length(); } } System.out.println( " sum of number = " + numberSum); System.out.println( " sum of word = " + wordSum); System.out.println( " sum of symbol = " + symbolSum); total = symbolSum + numberSum + wordSum; System.out.println( " Total = " + total); return total; } catch (Exception e) { e.printStackTrace(); return - 1 ; } finally { if (fileReader != null ) { try { fileReader.close(); } catch (IOException e1) { } } } } public static void main(String[] args) { String fileName = " c:/temp/newTemp.txt " ; StatisFileChars.statis(fileName); } } 运行结果: sum of number = 11 sum of word = 55 sum of symbol = 4 Total = 70

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:android之自定义ViewGroup和自动换行的布局的实现
下一篇:Springboot错误页面和错误信息定制操作
相关文章

 发表评论

暂时没有评论,来抢沙发吧~