使用StreamTokenizer统计文件的字符数

 关键技术:

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

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->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

时间: 2024-09-10 23:05:26

使用StreamTokenizer统计文件的字符数的相关文章

c++统计文件中字符个数代码汇总_C 语言

我们先来看看下面的代码: #include<iostream> #include<fstream> #include<cstdlib> using namespace std; class CntCharacters { private: int cnt; public: CntCharacters():cnt(0){} ~CntCharacters(){} void opentxt(char* p) { ifstream fin; fin.open(p,ios_bas

Linux统计文件代码行数及统计文件数

直接上代码吧: 1.统计当前文件夹下文件数量 ls -l|grep "^-"|wc -l 2.统计文件行数(单个文件): wc -l name.c 3.统计目录所有文件行数(全部目录): find . -name *.c| xargs wc -l 4.统计目录并按行数排序(按行大小排序): find . -name *.c| xargs wc -l | sort -n 5.统计目录并按行数排序(按行文件名排序): find . -name *.c| xargs wc -l | sort

Ruby中实现统计文件行数、单词数和字符数_ruby专题

在Ruby中我们定义一个wc方法,用来统计文件中出现的文本行数.单词数和字符数,ruby代码程序如下: 复制代码 代码如下: def wc(filename)   nline = nword = nchar = 0   File.open(filename) do |io|     io.each_line do |line|       words = line.split(/\s+/).reject{|w| w.empty? }       #本例中使用了split方法分割单词,当行首有空白

刚刚学c++好多不会-C++ 统计一串字符各种字符的数

问题描述 C++ 统计一串字符各种字符的数 头文件#include #include #include #include #include void count(char a[]);using namespace std; void count(char a[]){ int D_num=0X_num=0num=0spen=0other=0; int i;for(i=0;i<=(strlen(a)-1);i++){ if(a[i]>='a' && a[i]<='z') X_

求大神指点 急急急-《统计字符数》但是运行不了??

问题描述 <统计字符数>但是运行不了?? #include using namespace std; int main() { int cases,sum[26],i,max; char str; cin>>cases; while(cases>0) { for(i=0;i { sum[i]=0; } while((str=getchar())!='/n') { sum[str-'a']++; } max=0; for(i=1;i { if(sum[i]>sum[max

Shell脚本统计文件行数的8种方法_linux shell

获取单个文件行数 文件:test1.sh 行数:20 方法一 复制代码 代码如下: awk '{print NR}' test1.sh|tail -n1 如图所示: 方法二 复制代码 代码如下: awk 'END{print NR}' test1.sh 如图所示: 方法三 复制代码 代码如下: grep -n "" test1.sh|awk -F: '{print '}|tail -n1 如图所示: 方法四 复制代码 代码如下: sed -n '$=' test1.sh 如图所示: 方

C语言实现的统计php代码行数功能源码(支持文件夹、多目录)_C 语言

放假在家没事,睡过懒觉,看过电影,就想起来写个小程序. 统计php代码的行数,对于phper还是挺实用的.支持单个文件和目录.下面是代码和演示的例子! /**  * @date     2012-12-1  * @author bright  * @todo     统计php代码行数  */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #inc

C语言中使用lex统计文本文件字符数_C 语言

我曾经在Linux上写的一个C程序,借助Lex做词法分析来同时统计N个文本文件的字符数,单词数和行数.让我觉得Lex确实挺有意思的.确实Lex的功能非常强大,用来做小巧的词法分析非常适合,也非常好用.这个程序参考了<Lex与Yacc>上的一个例子. %{ unsigned int char_count = 0, word_count = 0, line_count = 0; %} %% [^ /t/n]+ {word_count++; char_count+=yyleng;}; /n {cha

Linux下控制(统计)文件的生成的C代码实现_C 语言

本文分享了Linux下控制(统计)文件的生成的C代码实现案例,供大家参考,具体内容如下 一.需求描述 不定时地在Linux机器下的某目录中放入文件,文件内容中包含了用户号码.起止时间等字段,现要求编写一程序来统计目前该目录中所有文件中的记录总条数及所有记录中的最早起始时间和最晚结束时间. 例如,该目录中有两个文件Test_1.txt和Test_2.txt,其中Test_1.txt文件内容为: 15696192591|15696192592|20151103 120909|20151103 201