<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




                                                                                                           --    學海無涯
            

    主站蜘蛛池模板: 亚洲制服丝袜中文字幕| 亚洲AV日韩AV永久无码免下载| 亚洲av无码电影网| 国产精品1024永久免费视频 | 一级做α爱过程免费视频| 国产免费一区二区三区VR| 亚洲av无码兔费综合| 免费在线观看亚洲| 国产精品午夜免费观看网站| 伊人久久亚洲综合| 无码国产精品一区二区免费模式| 亚洲av不卡一区二区三区| 精品国产sm捆绑最大网免费站| 亚洲剧情在线观看| 国产视频精品免费| av午夜福利一片免费看久久| 国产av天堂亚洲国产av天堂| 24小时日本韩国高清免费| 99久久国产亚洲综合精品| 免费国产精品视频| a级毛片毛片免费观看永久| 亚洲网站在线观看| 成人毛片18女人毛片免费视频未 | 啊v在线免费观看| 免费毛片在线看不用播放器| 91天堂素人精品系列全集亚洲| 最近免费中文字幕4| 日韩免费码中文在线观看| 亚洲av日韩av不卡在线观看| 99久久久国产精品免费无卡顿| 亚洲av无码av在线播放| 国产亚洲无线码一区二区| 99在线精品视频观看免费| 一边摸一边爽一边叫床免费视频| 亚洲第一成年男人的天堂| 国产成人涩涩涩视频在线观看免费 | 国产男女猛烈无遮挡免费网站 | 国产美女被遭强高潮免费网站| 岛国岛国免费V片在线观看| 亚洲国产成人久久精品app| 亚洲人成色77777在线观看大|