Welcome![Sign In][Sign Up]
Location:
Search - import java.io.*

Search list

[Internet-Network用Java编写HTML文件分析程序

Description:

Java编写HTML文件分析程序

 一、概述

    

    Web服务器的核心是对Html文件中的各标记(Tag)作出正确的分析,一种编程语言的解释程序也是对源文件中的保留字进行分析再做解释的。实际应用中,我们也经常会碰到需要对某一特定类型文件进行要害字分析的情况,比如,需要将某个HTML文件下载并同时下载与之相关的.gif.class等文件,此时就要求对HTML文件中的标记进行分离,找出所需的文件名及目录。在Java出现以前,类似工作需要对文件中的每个字符进行分析,从中找出所需部分,不仅编程量大,且易出错。笔者在近期的项目中利用Java的输入流类StreamTokenizer进行HTML文件的分析,效果较好。在此,我们要实现从已知的Web页面下载HTML文件,对其进行分析后,下载该页面中包含的HTML文件(假如在Frame中)、图像文件和ClassJava Applet)文件。

    

    二、StreamTokenizer

    

    StreamTokenizer即令牌化输入流的作用是将一个输入流中变成令牌流。令牌流中的令牌实体有三类:单词(即多字符令牌)、单字符令牌和空白(包括JavaC/C++中的说明语句)。

    

    StreamTokenizer类的构造器为: StreamTokenizer(InputStream in)

    

    该类有一些公有实例变量:ttypesvalnval ,分别表示令牌类型、当前字符串值和当前数字值。当我们需要取得令牌(即HTML中的标记)之间的字符时,应访问变量sval。而读向下一个令牌的方法是调用nextToken()。方法nextToken()的返回值是int型,共有四种可能的返回:

    

    StreamTokenizer.TT_NUMBER: 表示读到的令牌是数字,数字的值是double型,可以从实例变量nval中读取。

    

    StreamTokenizer.TT_Word: 表示读到的令牌是非数字的单词(其他字符也在其中),单词可以从实例变量sval中读取。

    

    StreamTokenizer.TT_EOL: 表示读到的令牌是行结束符。

    

    假如已读到流的尽头,则nextToken()返回TT_EOF

    

    开始调用nextToken()之前,要设置输入流的语法表,以便使分析器辨识不同的字符。WhitespaceChars(int low, int hi)方法定义没有意义的字符的范围。WordChars(int low, int hi)方法定义构造单词的字符范围。

    

    三、程序实现

    

    1HtmlTokenizer类的实现

    

    对某个令牌流进行分析之前,首先应对该令牌流的语法表进行设置,在本例中,即是让程序分出哪个单词是HTML的标记。下面给出针对我们需要的HTML标记的令牌流类定义,它是StreamTokenizer的子类:

    

    

    import java.io.*;

    import java.lang.String;

    class HtmlTokenizer extends

    StreamTokenizer {

    //定义各标记,这里的标记仅是本例中必须的,

    可根据需要自行扩充

     static int HTML_TEXT=-1;

     static int HTML_UNKNOWN=-2;

     static int HTML_EOF=-3;

     static int HTML_IMAGE=-4;

     static int HTML_FRAME=-5;

     static int HTML_BACKGROUND=-6;

     static int HTML_APPLET=-7;

    

    boolean outsideTag=true; //判定是否在标记之中

    

     //构造器,定义该令牌流的语法表。

     public HtmlTokenizer(BufferedReader r) {

    super(r);

    this.resetSyntax(); //重置语法表

    this.wordChars(0,255); //令牌范围为全部字符

    this.ordinaryChar('< '); //HTML标记两边的分割符

    this.ordinaryChar('>');

     } //end of constrUCtor

    

     public int nextHtml(){

    int token; //令牌

    try{

    switch(token=this.nextToken()){

    case StreamTokenizer.TT_EOF:

    //假如已读到流的尽头,则返回TT_EOF

    return HTML_EOF;

    case '< ': //进入标记字段

    outsideTag=false;

    return nextHtml();

    case '>': //出标记字段

    outsideTag=true;

    return nextHtml();

    case StreamTokenizer.TT_WORD:

    //若当前令牌为单词,判定是哪个标记

    if (allWhite(sval))

     return nextHtml(); //过滤其中空格

    else if(sval.toUpperCase().indexOf("FRAME")

    !=-1 && !outsideTag) //标记FRAME

     return HTML_FRAME;

    else if(sval.toUpperCase().indexOf("IMG")

    !=-1 && !outsideTag) //标记IMG

     return HTML_IMAGE;

    else if(sval.toUpperCase().indexOf("BACKGROUND")

    !=-1 && !outsideTag) //标记BACKGROUND

     return HTML_BACKGROUND;

    else if(sval.toUpperCase().indexOf("APPLET")

    !=-1 && !outsideTag) //标记APPLET

     return HTML_APPLET;

    default:

    System.out.println ("Unknown tag: "+token);

    return HTML_UNKNOWN;

     } //end of case

    }catch(IOException e){

    System.out.println("Error:"+e.getMessage());}

    return HTML_UNKNOWN;

     } //end of nextHtml

    

    protected boolean allWhite(String s){//过滤所有空格

    //实现略

     }// end of allWhite

    

    } //end of class

    

    以上方法在近期项目中测试通过,操作系统为Windows NT4,编程工具使用Inprise Jbuilder3


Platform: | Size: 1066 | Author: tiberxu | Hits:

[JSP/JavaCreateKeyStores

Description: import java.io.FileOutputStream import java.security.KeyStore import java.security.cert.Certificate import javax.security.auth.x500.X500PrivateCredential -import java.io.FileOutputStream import java.security.KeyStore import java.securit y.cert.Certificate import javax.security.a uth.x500.X500PrivateCredential
Platform: | Size: 929 | Author: albert_jq | Hits:

[JSP/JavaYXTu

Description: package youxiangtu import java.io.* public class YXTu{ static public void main(String[] args){-package youxiangtu import java.io. * ed ic class YXTu (public static void main (String [ ] args) (
Platform: | Size: 898 | Author: 刘艳 | Hits:

[Other resourcegame

Description: package GuessNumber import java.io.* import java.io.BufferedWriter
Platform: | Size: 1271 | Author: 贾伟 | Hits:

[JSP/JavaZipTest

Description: 压缩代码, 对 import java.io.* import java.util.zip.* 的应用
Platform: | Size: 2167 | Author: situ | Hits:

[Other resourcepcfirebirdchatroom

Description: java网络聊天程序 服务器: import java.awt.* import java.awt.event.* import java.net.* import java.io.* import java.util.*
Platform: | Size: 1725293 | Author: angeltry | Hits:

[Ftp ClientFTP

Description: import net.sf.jftp.net.ConnectionHandler import net.sf.jftp.net.ConnectionListener import net.sf.jftp.net.DataConnection import net.sf.jftp.net.FtpConnection import net.sf.jftp.net.BasicConnection import net.sf.jftp.util.Log import net.sf.jftp.util.Logger import net.sf.jftp.config.Settings import java.io.* // this class download a file via anonymous ftp and shows output.
Platform: | Size: 2565 | Author: luly | Hits:

[JSP/JavaMediaPlayer(java)

Description: MediaPlayer代码,部分代码,合适请用: import java.awt.* import java.awt.event.* import javax.swing.* import javax.media.* import java.io.* import java.util.* //为了导入Vector //import com.sun.java.swing.plaf.windows.* public class MediaPlayer extends JFrame implements ActionListener,Runnable { private JMenuBar bar //菜单条 private JMenu fileMenu,choiceMenu,aboutMenu private JMenuItem openItem,openDirItem,closeItem,about,infor private JCheckBoxMenuItem onTop private boolean top=false,loop //设定窗口是否在最前面 private Player player //Play是个实现Controller的接口 private File file,listFile //利用File类结合JFileChooser进行文件打开操作,后则与list.ini有关
Platform: | Size: 8425 | Author: benson | Hits:

[JSP/JavahttpServer

Description: 基于java实现http服务器//httpServer.java import java.net.* import java.io.* import java.util.* import java.lang.* public class httpServer
Platform: | Size: 4955 | Author: msk | Hits:

[DocumentsjavaNIO

Description: 一系列缓冲区类支撑起了 Java 2 平台标准版的新 I/O(NIO)包。这些类的数据容器形成了其它 NIO 操作(如套接字通道上的非阻塞读取)的基础。在本月的 Merlin 的魔力中,常驻 Java 编程专家 John Zukowski 展示了如何操作那些数据缓冲区来执行如读/写原语这样的任务以及如何使用内存映射文件。在以后的文章里,他将把这里所提到的概念扩展到套接字通道的使用。 Java 2 平台标准版(Java 2 Platform Standard Edition,J2SE)1.4 对 Java 平台的 I/O 处理能力做了大量更改。它不仅用流到流的链接方式继续支持以前 J2SE 发行版的基于流的 I/O 操作,而且 Merlin 还添加了新的功能 — 称之为新 I/O 类(NIO),现在这些类位于 java.nio 包中。 I/O 执行输入和输出操作,将数据从文件或系统控制台等传送至或传送出应用程序。(有关 Java I/O 的其它信息,请参阅 参考资料)。 缓冲区基础 抽象的 Buffer 类是 java.nio 包支持缓冲区的基础。 Buffer的工作方式就象内存中用于读写基本数据类型的 RandomAccessFile 。象 RandomAccessFile一样,使用 Buffer ,所执行的下一个操作(读/写)在当前某个位置发生。执行这两个操作中的任一个都会改变那个位置,所以在写操作之后进行读操作不会读到刚才所写的内容,而会读到刚才所写内容之后的数据。 Buffer 提供了四个指示方法,用于访问线性结构(从最高值到最低值): "capacity() :表明缓冲区的大小 "limit() :告诉您到目前为止已经往缓冲区填了多少字节,或者让您用 :limit(int newLimit) 来改变这个限制 "position() :告诉您当前的位置,以执行下一个读/写操作 "mark() :为了稍后用 reset() 进行重新设置而记住某个位置 缓冲区的基本操作是 get() 和 put() ;然而,这些方法在子类中都是针对每种数据类型的特定方法。为了说明这一情况,让我们研究一个简单示例,该示例演示了从同一个缓冲区读和写一个字符。在清单 1 中, flip() 方法交换限制和位置,然后将位置置为 0,并废弃标记,让您读刚才所写的数据: 清单 1. 读/写示例 import java.nio.*; ... CharBuffer buff = ...; buff.put('A'); buff.flip(); char c = buff.get(); System.out.println("An A: " + c); 现在让我们研究一些具体的 Buffer 子类。 回页首 缓冲区类型 Merlin 具有 7 种特定的 Buffer 类型,每种类型对应着一个基本数据类型(不包括 boolean): "ByteBuffer "CharBuffer "DoubleBuffer "FloatBuffer "IntBuffer "LongBuffer "ShortBuffer 在本文后面,我将讨论第 8 种类型 MappedByteBuffer ,它用于内存映射文件。如果您必须使用的类型不是这些基本类型,则可以先从 ByteBuffer 获得字节类型,然后将其转换成 Object 或其它任何类型。 正如前面所提到的,每个缓冲区包含 get() 和 put() 方法,它们可以提供类型安全的版本。通常,需要重载这些 get() 和 put() 方法。例如,有了 CharBuffer ,可以用 get() 获得下一个字符,用 get(int index) 获得某个特定位置的字符,或者用 get(char[] destination) 获得一串字符。静态方法也可以创建缓冲区,因为不存在构造函数。那么,仍以 CharBuffer为例,用 CharBuffer.wrap(aString) 可以将 String对象转换成 CharBuffer 。为了演示,清单 2 接受第一个命令行参数,将它转换成 CharBuffer ,并显示参数中的每个字符: 清单 2. CharBuffer 演示 import java.nio.*; public class ReadBuff { public static void main(String args[]) { if (args.length != 0) { CharBuffer buff = CharBuffer.wrap(args[0]); for (int i=0, n=buff.length(); i<n; i++) { System.out.println(i + " : " + buff.get()); } } } } 请注意,这里我使用了 get() ,而没有使用 get(index) 。我这样做的原因是,在每次执行 get() 操作之后,位置都会移动,所以不需要手工来声明要检索的位置。 回页首 直接 vs. 间接 既然已经了解了典型的缓冲区,那么让我们研究直接缓冲区与间接缓冲区之间的差别。在创建缓冲区时,可以要求创建直接缓冲区,创建直接缓冲区的成本要比创建间接缓冲区高,但这可以使运行时环境直接在该缓冲区上进行较快的本机 I/O 操作。因为创建直接缓冲区所增加的成本,所以直接缓冲区只用于长生存期的缓冲区,而不用于短生存期、一次性且用完就丢弃的缓冲区。而且,只能在 ByteBuffer 这个级别上创建直接缓冲区,如果希望使用其它类型,则必须将 Buffer 转换成更具体的类型。为了演示,清单 3 中代码的行为与清单 2 的行为一样,但清单 3 使用直接缓冲区: 清单 3. 列出网络接口 import java.nio.*; public class ReadDirectBuff { public static void main(String args[]) { if (args.length != 0) { String arg = args[0]; int size = arg.length(); ByteBuffer byteBuffer = ByteBuffer.allocateDirect(size*2); CharBuffer buff = byteBuffer.asCharBuffer(); buff.put(arg); buff.rewind(); for (int i=0, n=buff.length(); i<n; i++) { System.out.println(i + " : " + buff.get()); } } } } 在上面的代码中,请注意,不能只是将 String 包装在直接 ByteBuffer中。必须首先创建一个缓冲区,先填充它,然后将位置倒回起始点,这样才能从头读。还要记住,字符长度是字节长度的两倍,因此示例中会有 size*2 。 回页首 内存映射文件 第 8 种 Buffer 类型 MappedByteBuffer 只是一种特殊的 ByteBuffer 。 MappedByteBuffer 将文件所在区域直接映射到内存。通常,该区域包含整个文件,但也可以只映射部分文件。所以,必须指定要映射文件的哪部分。而且,与其它 Buffer 对象一样,这里没有构造函数;必须让 java.nio.channels.FileChannel的 map() 方法来获取 MappedByteBuffer 。此外,无需过多涉及通道就可以用 getChannel() 方法从 FileInputStream 或 FileOutputStream获取 FileChannel 。通过从命令行传入文件名来读取文本文件的内容,清单 4 显示了 MappedByteBuffer : 清单 4. 读取内存映射文本文件 import java.io.*; import java.nio.*; import java.nio.channels.*; import java.nio.charset.*; public class ReadFileBuff { public static void main(String args[]) throws IOException { if (args.length != 0) { String filename = args[0]; FileInputStream fis = new FileInputStream(filename); FileChannel channel = fis.getChannel(); int length = (int)channel.size(); MappedByteBuffer byteBuffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, length); Charset charset = Charset.forName("ISO-8859-1"); CharsetDecoder decoder = charset.newDecoder(); CharBuffer charBuffer = decoder.decode(byteBuffer); for (int i=0, n=charBuffer.length(); i<n; i++) { System.out.print(charBuffer.get()); } } } }
Platform: | Size: 5876 | Author: 635868631@qq.com | Hits:

[JSP/JavaCreateKeyStores

Description: import java.io.FileOutputStream import java.security.KeyStore import java.security.cert.Certificate import javax.security.auth.x500.X500PrivateCredential -import java.io.FileOutputStream import java.security.KeyStore import java.securit y.cert.Certificate import javax.security.a uth.x500.X500PrivateCredential
Platform: | Size: 1024 | Author: albert_jq | Hits:

[JSP/JavaYXTu

Description: package youxiangtu import java.io.* public class YXTu{ static public void main(String[] args){-package youxiangtu import java.io.* ed ic class YXTu (public static void main (String [ ] args) (
Platform: | Size: 1024 | Author: | Hits:

[Other Riddle gamesgame

Description: package GuessNumber import java.io.* import java.io.BufferedWriter -package GuessNumberimport java.io.* import java.io.BufferedWriter
Platform: | Size: 1024 | Author: 贾伟 | Hits:

[JSP/Javapcfirebirdchatroom

Description: java网络聊天程序 服务器: import java.awt.* import java.awt.event.* import java.net.* import java.io.* import java.util.* -java chat server: import java.awt .* import java.awt.event .* import java.net .* import java.io.* import java.util .*
Platform: | Size: 1725440 | Author: | Hits:

[JSP/JavaMediaPlayer(java)

Description: MediaPlayer代码,部分代码,合适请用: import java.awt.* import java.awt.event.* import javax.swing.* import javax.media.* import java.io.* import java.util.* //为了导入Vector //import com.sun.java.swing.plaf.windows.* public class MediaPlayer extends JFrame implements ActionListener,Runnable { private JMenuBar bar //菜单条 private JMenu fileMenu,choiceMenu,aboutMenu private JMenuItem openItem,openDirItem,closeItem,about,infor private JCheckBoxMenuItem onTop private boolean top=false,loop //设定窗口是否在最前面 private Player player //Play是个实现Controller的接口 private File file,listFile //利用File类结合JFileChooser进行文件打开操作,后则与list.ini有关-MediaPlayer code, some code, appropriate use: import java.awt .* import java.awt.event .* import javax.swing .* import javax.media .* import java.io.* import java.util .*// in order to import Vector// import com.sun.java.swing.plaf.windows .* public class MediaPlayer extends JFrame implements ActionListener, Runnable (private JMenuBar bar// menu bar private JMenu fileMenu, choiceMenu, aboutMenu private JMenuItem openItem, openDirItem, closeItem, about, infor private JCheckBoxMenuItem onTop private boolean top = false, loop// set the window in the top private Player player// Play is a Controller Interface realize private File file, listFile// use File Class JFileChooser combine files to open operation, and after the relevant list.ini
Platform: | Size: 8192 | Author: benson | Hits:

[Windows Developliaotainshixianchenxu156

Description: Java聊天室小程序-服务器代码实现方面-import java.io.IOException import java.net.DatagramPacket import java.net.DatagramSocket import java.net.InetAddress import java.net.SocketAddress import java.net.SocketException import java.net.UnknownHostException import java.util.Enumeration import java.util.Hashtable import java.util.Scanner public class Server implements
Platform: | Size: 4096 | Author: 翟艳斌 | Hits:

[JSP/JavaJAVA_javabook

Description: JAVA记事本源代码 import java.awt.* import java.awt.event.* import java.text.* import java.util.* import java.io.* import javax.swing-JAVA jsb import java.awt.* import java.awt.event.* import java.text.* import java.util.* import java.io.* import javax.swing..
Platform: | Size: 23552 | Author: 宋飞 | Hits:

[JSP/Javaregarde-ici

Description: PING import java.awt.event.* import java.io.BufferedReader import java.io.IOException import java.io.InputStreamReader import java.util.logging.Level import java.util.logging.Logger import javax.swing.JTextArea import javax.swing.SwingWorker
Platform: | Size: 192512 | Author: GHMONEM | Hits:

[JSP/Javajava

Description: import java.io.BufferedReader import java.io.File import java.io.FileNotFoundException import java.io.FileReader import java.io.IOException import java.util.ArrayList import java.util.List
Platform: | Size: 1024 | Author: chensheng | Hits:

[JSP/Javajava-plist-shsh

Description: j2SE,J2ME,J2EE,Android,java范围技术交流,iso shsh文件备份和直接通过浏览器下载iphone游戏和或者软件包 ios在解锁或者备份shsh文件时,从手机里获取的plist文件是打不开的,我们可以通过java转成xml或者可以打的plist。shsh文件备份, import java.io.* import com.dd.plist.PropertyListParser public class Plist { public static void main(String[] args) throws Exception { File file = new File( "d:\\Info.plist") //从手机里获取的shsh文件 File file1 = new File( "d:\\Info.xml") //转换存放的路径,linux上的路径如/data/shsh/ PropertyListParser.convertToXml(file, file1) } } -j2SE,J2ME,J2EE,Android,java范围技术交流,iso shsh文件备份和直接通过浏览器下载iphone游戏和或者软件包 ios在解锁或者备份shsh文件时,从手机里获取的plist文件是打不开的,我们可以通过java转成xml或者可以打的plist。shsh文件备份, import java.io.* import com.dd.plist.PropertyListParser public class Plist { public static void main(String[] args) throws Exception { File file = new File( "d:\\Info.plist") //从手机里获取的shsh文件 File file1 = new File( "d:\\Info.xml") //转换存放的路径,linux上的路径如/data/shsh/ PropertyListParser.convertToXml(file, file1) } }
Platform: | Size: 44032 | Author: 司马楚云 | Hits:
« 12 3 »

CodeBus www.codebus.net