java Stream Tokenizer使用

來源:互聯網
上載者:User

標籤:

注意:用JAVA解題一般用Scanner類來進行輸入,但對時間要求嚴格的題,用它可能會逾時,我、解POJ1823的時候就遇到這樣的問題,後改用StreamTokenizer類進行輸入,就過了。看來後者處理輸入的效率要高點。 
現小結如下: 

1、類java.io.StreamTokenizer可以擷取輸入流並將其分析為Token(標記)。 
StreamTokenizer的nextToken方法讀取下一個標記 

2、預設情況下,StreamTokenizer認為下列內容是Token:字母、數字、除c和c++注釋符號以外的其他符號。
     如符號“/”不是Token,注釋後的內容也不是,而"/"是Token。單引號和雙引號以及其總的內容,只能算一個Token。 

3、為了提高效率,使用BufferedReader,如下,建立StreamTokenizer對象 

StreamTokenizer st =new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); 


4、為了從流中擷取標記,可以調用StreamTokenizer的nextToken()方法。 
調用nextToken()方法以後,如果標記是字串,可用 String s=st.sval,如果是整數用 int n=(int) st.nval得到。 

st.nextToken();     

int i=(int) st.nval;     //st.navl預設解析出的格式是double

st.nextToken();     

int j=(int) st.nval; 

st.nextToken();     

String s=st.sval;

 

附錄:

轉載於:http://i.cnblogs.com/EditPosts.aspx?opt=1

關鍵點:

    • 類java.io.StreamTokenizer可以擷取輸入資料流並將其分析為Token(標記)。StreamTokenizer的nextToken方法將讀取下一個標記
    • 預設情況下,StreamTokenizer認為下列內容是Token:字母、數字、除C和C++注釋符號以外的其他符號。如符號“/”不是Token,注釋後的內容也不是,而“\”是Token。單引號和雙引號以及其中的內容,只能算是一個Token。
    • 要統計檔案的字元數,不能簡單地統計Token數,因為字元數不等於Token,按照Token的規定,引號中的內容就算是10頁也算是一個Token。如果希望引號和引號中的內容都算作Token,應該通過StreamTokenizer的ordinaryCha()方法將單引號和雙引號當做一般字元處理。

//直接在程式中指定了檔案輸入路徑:String fileName = "d:/ceshi.txt";

package szu.edu;

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 = "d:/ceshi.txt";
        StatisFileChars.statis(fileName);
    }
}

 

注意:除了以上的用法,還有一個很常見的用法。用於基本的輸入操作!(比如:常用語acm編程中,輸入效率比較高。)

BufferedReader provides quite fast read operations for almost all problems. But this class may be used to read single characters and lines only. To read tokens and numbers you should use StringTokenizer orStreamTokenizer.

 

import java.io.*;public class Main{    public static void main(String[] args) throws IOException    {        StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));        //PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));        int a, b;        while(in.nextToken() != StreamTokenizer.TT_EOF)        {            a = (int)in.nval;            in.nextToken();            b = (int)in.nval;            //out.println(a + b);            System.out.println("a + b = "+(a+b));        }        out.flush();    }}

java Stream Tokenizer使用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.