<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Cyh的博客

    Email:kissyan4916@163.com
    posts - 26, comments - 19, trackbacks - 0, articles - 220

    使用StreamTokenizer統計文件的字符數

    Posted on 2009-05-24 21:46 啥都寫點 閱讀(744) 評論(0)  編輯  收藏 所屬分類: J2SE
    關鍵技術:
    • 類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




                                                                                                           --    學海無涯
            

    主站蜘蛛池模板: 一个人看的免费视频www在线高清动漫 | 久久免费国产视频| 日韩成全视频观看免费观看高清| 国产日产亚洲系列| 亚洲精品乱码久久久久久V | 色一情一乱一伦一视频免费看| 9久热这里只有精品免费| 成人超污免费网站在线看| 亚洲色欲或者高潮影院| 在线免费观看伊人三级电影| 四虎影库久免费视频| 久久亚洲国产成人影院| 日韩免费一区二区三区在线| 亚洲午夜久久久精品影院| 中文字幕a∨在线乱码免费看 | 亚洲Av无码国产情品久久| 亚洲国产无线乱码在线观看 | 亚洲成电影在线观看青青| 最近免费mv在线观看动漫| 国产精品V亚洲精品V日韩精品| 亚洲av成人一区二区三区观看在线| 美女视频黄的全免费视频网站| 国产亚洲综合色就色| 99久久99这里只有免费的精品| 久久久高清免费视频| 亚洲视频免费观看| 性xxxx视频免费播放直播| 免费精品国产自产拍在| 亚洲熟妇丰满多毛XXXX| 亚欧免费无码aⅴ在线观看| 亚洲精品视频在线播放| 最近最新中文字幕完整版免费高清 | 亚洲av无码潮喷在线观看| 免费国产作爱视频网站| 国产亚洲人成在线播放| 国产亚洲老熟女视频| 一级毛片免费观看不卡视频| 亚洲国产日韩视频观看| 黑人大战亚洲人精品一区| 精品免费人成视频app| 理论亚洲区美一区二区三区|