<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




                                                                                                           --    學海無涯
            

    主站蜘蛛池模板: 最近中文字幕电影大全免费版 | 伊在人亚洲香蕉精品区麻豆| 亚洲一区二区三区香蕉| 久久久婷婷五月亚洲97号色| jzzijzzij在线观看亚洲熟妇| a毛片免费全部播放完整成| 午夜男人一级毛片免费| 亚洲AV日韩AV天堂久久| 亚洲色精品三区二区一区| 日批视频网址免费观看| 麻豆国产人免费人成免费视频| 国产亚洲一区二区精品| 亚洲国产高清国产拍精品| 一级毛片免费播放| 亚洲国产激情一区二区三区| 亚洲欧洲春色校园另类小说| 香蕉视频在线免费看| 大香人蕉免费视频75| 亚洲国产女人aaa毛片在线 | 黄色免费在线观看网址| 免费精品国产自产拍在线观看图片| 区三区激情福利综合中文字幕在线一区亚洲视频1 | 99久久久国产精品免费牛牛四川 | 91九色精品国产免费| 久久久久亚洲爆乳少妇无 | 青青草国产免费国产是公开| 黄色片在线免费观看 | 国产精品亚洲va在线观看| 99爱视频99爱在线观看免费| 亚洲视频人成在线播放| 亚洲色成人网站WWW永久四虎| 免费黄网站在线看| 亚洲裸男gv网站| 亚洲AV无码AV日韩AV网站| 国产妇乱子伦视频免费| 亚洲AV综合色区无码一区 | a色毛片免费视频| 亚洲AⅤ永久无码精品AA| 伊人久久五月丁香综合中文亚洲| 无码av免费网站| 国内精品久久久久久久亚洲|