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

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

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

    隨筆-179  評(píng)論-666  文章-29  trackbacks-0
    本文從實(shí)踐的角度重點(diǎn)闡述Java語(yǔ)言中輸入流類(lèi)StreamTokenizer在編寫(xiě)HTML文件分析程序中的應(yīng)用,并介紹了以字節(jié)為單位下載Web頁(yè)面的例程。
      
      一、概述
      
      Web服務(wù)器的核心是對(duì)HTML文件中的各標(biāo)記(Tag)作出正確的分析,一種編程語(yǔ)言的解釋程序也是對(duì)源文件中的保留字進(jìn)行分析再做解釋的。實(shí)際應(yīng)用中,我們也常常會(huì)遇到需要對(duì)某一特定類(lèi)型文件進(jìn)行關(guān)鍵字分析的情況,比如,需要將某個(gè)HTML文件下載并同時(shí)下載與之相關(guān)的.gif、.class等文件,此時(shí)就要求對(duì)HTML文件中的標(biāo)記進(jìn)行分離,找出所需的文件名及目錄。在Java出現(xiàn)以前,類(lèi)似工作需要對(duì)文件中的每個(gè)字符進(jìn)行分析,從中找出所需部分,不僅編程量大,且易出錯(cuò)。筆者在近期的項(xiàng)目中利用Java的輸入流類(lèi)StreamTokenizer進(jìn)行HTML文件的分析,效果較好。在此,我們要實(shí)現(xiàn)從已知的Web頁(yè)面下載HTML文件,對(duì)其進(jìn)行分析后,下載該頁(yè)面中包含的HTML文件(如果在Frame中)、圖像文件和Class(Java Applet)文件。
      
      二、StreamTokenizer類(lèi)
      
      StreamTokenizer即令牌化輸入流的作用是將一個(gè)輸入流中變成令牌流。令牌流中的令牌實(shí)體有三類(lèi):?jiǎn)卧~(即多字符令牌)、單字符令牌和空白(包括Java和C/C++中的說(shuō)明語(yǔ)句)。
      
      StreamTokenizer類(lèi)的構(gòu)造器為: StreamTokenizer(InputStream in)
      
      該類(lèi)有一些公有實(shí)例變量:ttype、sval和nval ,分別表示令牌類(lèi)型、當(dāng)前字符串值和當(dāng)前數(shù)字值。當(dāng)我們需要取得令牌(即HTML中的標(biāo)記)之間的字符時(shí),應(yīng)訪問(wèn)變量sval。而讀向下一個(gè)令牌的方法是調(diào)用nextToken()。方法nextToken()的返回值是int型,共有四種可能的返回:
      
      StreamTokenizer.TT_NUMBER: 表示讀到的令牌是數(shù)字,數(shù)字的值是double型,可以從實(shí)例變量nval中讀取。
      
      StreamTokenizer.TT_WORD: 表示讀到的令牌是非數(shù)字的單詞(其他字符也在其中),單詞可以從實(shí)例變量sval中讀取。
      
      StreamTokenizer.TT_EOL: 表示讀到的令牌是行結(jié)束符。
      
      如果已讀到流的盡頭,則nextToken()返回TT_EOF。
      
      開(kāi)始調(diào)用nextToken()之前,要設(shè)置輸入流的語(yǔ)法表,以便使分析器辨識(shí)不同的字符。WhitespaceChars(int low, int hi)方法定義沒(méi)有意義的字符的范圍。WordChars(int low, int hi)方法定義構(gòu)造單詞的字符范圍。
      
      三、程序?qū)崿F(xiàn)
      
      1、HtmlTokenizer類(lèi)的實(shí)現(xiàn)
      
      對(duì)某個(gè)令牌流進(jìn)行分析之前,首先應(yīng)對(duì)該令牌流的語(yǔ)法表進(jìn)行設(shè)置,在本例中,即是讓程序分出哪個(gè)單詞是HTML的標(biāo)記。下面給出針對(duì)我們需要的HTML標(biāo)記的令牌流類(lèi)定義,它是StreamTokenizer的子類(lèi):

    ?1???????? import?java.io.*;?
    ?2  import?java.lang.String;?
    ?3  class?HtmlTokenizer?extends?
    ?4  StreamTokenizer?{?
    ?5  //定義各標(biāo)記,這里的標(biāo)記僅是本例中必須的,?
    ?6  可根據(jù)需要自行擴(kuò)充?
    ?7  ?static?int?HTML_TEXT=-1;?
    ?8  ?static?int?HTML_UNKNOWN=-2;?
    ?9  ?static?int?HTML_EOF=-3;?
    10  ?static?int?HTML_IMAGE=-4;?
    11  ?static?int?HTML_FRAME=-5;?
    12  ?static?int?HTML_BACKGROUND=-6;?
    13  ?static?int?HTML_APPLET=-7;?
    14  ?
    15  boolean?outsideTag=true;?//判斷是否在標(biāo)記之中?
    16  ?
    17  ?//構(gòu)造器,定義該令牌流的語(yǔ)法表。?
    18  ?public?HtmlTokenizer(BufferedReader?r)?{?
    19  super(r);?
    20  this.resetSyntax();?//重置語(yǔ)法表?
    21  this.wordChars(0,255);?//令牌范圍為全部字符?
    22  this.ordinaryChar('<?');?//HTML標(biāo)記兩邊的分割符?
    23  this.ordinaryChar('>');?
    24  ?}
    ?//end?of?constructor?
    25  ?
    26  ?public?int?nextHtml(){?
    27  int?token;?//令牌?
    28  try{?
    29  switch(token=this.nextToken()){?
    30  case?StreamTokenizer.TT_EOF:?
    31  //如果已讀到流的盡頭,則返回TT_EOF?
    32  return?HTML_EOF;?
    33  case?'<?':?//進(jìn)入標(biāo)記字段?
    34  outsideTag=false;?
    35  return?nextHtml();?
    36  case?'>':?//出標(biāo)記字段?
    37  outsideTag=true;?
    38  return?nextHtml();?
    39  case?StreamTokenizer.TT_WORD:?
    40  //若當(dāng)前令牌為單詞,判斷是哪個(gè)標(biāo)記?
    41  if?(allWhite(sval))?
    42  ?return?nextHtml();?//過(guò)濾其中空格?
    43  else?if(sval.toUpperCase().indexOf("FRAME")?
    44  !=-1?&&?!outsideTag)?//標(biāo)記FRAME?
    45  ?return?HTML_FRAME;?
    46  else?if(sval.toUpperCase().indexOf("IMG")?
    47  !=-1?&&?!outsideTag)?//標(biāo)記IMG?
    48  ?return?HTML_IMAGE;?
    49  else?if(sval.toUpperCase().indexOf("BACKGROUND")?
    50  !=-1?&&?!outsideTag)?//標(biāo)記BACKGROUND?
    51  ?return?HTML_BACKGROUND;?
    52  else?if(sval.toUpperCase().indexOf("APPLET")?
    53  !=-1?&&?!outsideTag)?//標(biāo)記APPLET?
    54  ?return?HTML_APPLET;?
    55  default:?
    56  System.out.println?("Unknown?tag:?"+token);?
    57  return?HTML_UNKNOWN;?
    58  ?}
    ?//end?of?case?
    59  }
    catch(IOException?e){?
    60  System.out.println("Error:"+e.getMessage());}
    ?
    61  return?HTML_UNKNOWN;?
    62  ?}
    ?//end?of?nextHtml?
    63  ?
    64  protected?boolean?allWhite(String?s){//過(guò)濾所有空格?
    65  //實(shí)現(xiàn)略?
    66  ?}
    //?end?of?allWhite?
    67  ?
    68  }
    ?//end?of?class?
    69


    posted on 2007-01-18 16:58 Alpha 閱讀(1627) 評(píng)論(3)  編輯  收藏 所屬分類(lèi): Java J2EE JSP

    評(píng)論:
    # re: [轉(zhuǎn)]利用Java編寫(xiě)HTML文件分析程序 2007-09-04 16:04 | yslin_1985
    非常感謝你的轉(zhuǎn)載,我正要用java分類(lèi)下載網(wǎng)頁(yè)的文件,你轉(zhuǎn)載的這篇技術(shù)文章對(duì)我啟發(fā)很大,只是,好像你沒(méi)有轉(zhuǎn)載完,是么?希望下次你轉(zhuǎn)載的時(shí)候能注明轉(zhuǎn)載的網(wǎng)址,給我們更多的方便。再次表示感謝。  回復(fù)  更多評(píng)論
      
    # re: [轉(zhuǎn)]利用Java編寫(xiě)HTML文件分析程序 2007-09-04 16:06 | yslin_1985
    另外,哥們兒是Beyond的fans吧?me too.  回復(fù)  更多評(píng)論
      
    # re: [轉(zhuǎn)]利用Java編寫(xiě)HTML文件分析程序 2007-09-22 23:26 | Alpha

    @yslin_1985
    呵呵,黃家駒忠實(shí)FANS,一生不變~!


      回復(fù)  更多評(píng)論
      
    主站蜘蛛池模板: 无码天堂va亚洲va在线va| 亚洲色大成网站WWW久久九九| 最近高清中文字幕无吗免费看| 色www永久免费| 中文日本免费高清| 亚洲精品偷拍视频免费观看| 乱爱性全过程免费视频| 黄网站在线播放视频免费观看| 另类专区另类专区亚洲| 污视频网站在线免费看| 四虎一区二区成人免费影院网址 | 国产jizzjizz免费视频| 免费高清小黄站在线观看| 免费无码看av的网站| 日韩视频在线免费| 又爽又高潮的BB视频免费看| 亚洲?V无码乱码国产精品| 亚洲国产综合人成综合网站| 亚洲日韩在线观看免费视频| 亚洲熟妇av一区二区三区| 亚洲AV日韩AV永久无码下载| 亚洲美女精品视频| 亚洲一卡一卡二新区无人区 | 亚洲精品无码永久在线观看你懂的 | 亚洲av无码兔费综合| 精品一区二区三区免费毛片| 五月天婷婷免费视频| 精品视频在线免费观看| 最近中文字幕完整版免费高清| 国产a视频精品免费观看| 中文字幕av无码无卡免费| 免费国产成人高清在线观看麻豆| 国产午夜亚洲不卡| 亚洲电影中文字幕| 亚洲人成7777| 黄页网站在线免费观看| 中文字幕乱码一区二区免费| 在线永久免费的视频草莓| 国产免费小视频在线观看| 亚洲国产成人一区二区三区| 亚洲一区二区三区高清视频|