鸿 网 互 联 www.68idc.cn

使用StreamTokenizer统计文件的字符数

来源:互联网 作者:佚名 时间:2015-06-03 08:51
关键技术 类java io StreamTokenizer可以获取输入流并将其分析为Token(标记) StreamTokenizer的nextToken方法将读取下一个标记 默认情况下 StreamTokenizer认为下列内容是Token 字母 数字 除C和C++注释符号以外的其他符号 如符号 / 不是Token 注释后的内容也
关键技术

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

  <!

Code highlighting produced by Actipro CodeHighlighter (freeware)


>package bookio;

import javaioBufferedReader;
import javaioFileReader;
import javaioIOException;
import javaioStreamTokenizer;

/**
 * 使用StreamTokenizer来统计文件中的字符数
 * StreamTokenizer 类获取输入流并将其分析为标记允许一次读取一个标记
 * 分析过程由一个表和许多可以设置为各种状态的标志控制
 * 该流的标记生成器可以识别标识符数字引用的字符串和各种注释样式
 * 
 *  默认情况下StreamTokenizer认为下列内容是Token: 字母数字除C和C++注释符号以外的其他符号
 *  如符号/不是Token注释后的内容也不是\是Token单引号和双引号以及其中的内容只能算是一个Token
 *  统计文章字符数的程序不是简单的统计Token数就万事大吉因为字符数不等于Token按照Token的规定
 *  引号中的内容就算是页也算一个Token如果希望引号和引号中的内容都算作Token应该调用下面的代码
 *     stordinaryChar(\);
 * stordinaryChar(\);
 */publicclass StatisFileChars {

    /**
     * 统计字符数
     * @param fileName 文件名
     * @return    字符数
     */publicstaticlong statis(String fileName) {

        FileReader fileReader =null;
        try {
            fileReader =new FileReader(fileName);
            //创建分析给定字符流的标记生成器            StreamTokenizer st =new StreamTokenizer(new BufferedReader(
                    fileReader));

            //ordinaryChar方法指定字符参数在此标记生成器中是普通字符
            //下面指定单引号双引号和注释符号是普通字符            stordinaryChar(\);            stordinaryChar(\);
            stordinaryChar(/);

            String s;
            int numberSum =;
            int wordSum =;
            int symbolSum =;
            int total =;
            //nextToken方法读取下一个Token
            //TT_EOF指示已读到流末尾的常量while (stnextToken() != StreamTokenizerTT_EOF) {
                //在调用 nextToken 方法之后ttype字段将包含刚读取的标记的类型switch (ype) {
                //TT_EOL指示已读到行末尾的常量case StreamTokenizerTT_EOL:
                    break;
                //TT_NUMBER指示已读到一个数字标记的常量case StreamTokenizerTT_NUMBER:
                    //如果当前标记是一个数字nval字段将包含该数字的值                    s = StringvalueOf((stnval));
                    Systemoutprintln(s);
                    numberSum += slength();
                    break;
                //TT_WORD指示已读到一个文字标记的常量case StreamTokenizerTT_WORD:
                    //如果当前标记是一个文字标记sval字段包含一个给出该文字标记的字符的字符串                    s = stsval;
                    wordSum += slength();
                    break;
                default:
                    //如果以上中类型都不是则为英文的标点符号                    s = StringvalueOf((char) ype);
                    symbolSum += slength();
                }
            }
            Systemoutprintln(sum of number = + numberSum);
            Systemoutprintln(sum of word = + wordSum);
            Systemoutprintln(sum of symbol = + symbolSum);
            total = symbolSum + numberSum + wordSum;
            Systemoutprintln(Total = + total);
            return total;
        } catch (Exception e) {
            eprintStackTrace();
            return;
        } finally {
            if (fileReader !=null) {
                try {
                    fileReaderclose();
                } catch (IOException e) {
                }
            }
        }
    }

    publicstaticvoid main(String[] args) {
        String fileName =c:/temp/newTemptxt;
        StatisFileCharsstatis(fileName);
    }
}


运行结果

sum of number =
sum of word =
sum of symbol =
Total =
网友评论
<