??xml version="1.0" encoding="utf-8" standalone="yes"?>
1. 昄当前q接?/strong>
SQLQ?br />
SELECT *
FROM V$SESSION
WHERE STATUS = 'INACTIVE'
AND USERNAME IS NOT NULL;
源代码已l上传了?br />
W?/span>3?nbsp; 设计文档
3Q?/span>1 d概述
本项d要开发一?/span>P2P文g传输软gQ该软g可以在局域网和互q上使用Q具有文件传输,断点l传Q多U程q接{功能?/span>
3Q?/span>1Q?/span>1 开发背?/span>
随着|络的普及,在网l中交换信息Q特别是文g成ؓ使用|络时经常性工作,现有的文件传输工具如QQ?/span>MSN{,主要功能是作为即旉讯工具使用Q而且在局域网中用时仍需q接Cq网。本文开发的软gZP2Pl构实现文g传输Q不依靠服务器维护用戯料,所以,只要两台机器可以q通,可以进行文件传输?/span>
3Q?/span>1Q?/span>2 定义
P2PQ即peer-to-peerQ可以理解ؓ点对点,或对{传输的意思?/span>
3Q?/span>1Q?/span>3 开发工?/span>
开发采?/span>JAVA语言Q开发工具ؓjbuilder 2005
3Q?/span>2 文g传输业务程
3Q?/span>2Q?/span>1 通讯序关系
在文件传输时Q传输过E可以简单的分ؓ4步,如图 Q?/span>
1?span style="font: 7pt 'Times New Roman'"> 由文件发送者发h件传输,他首先发送文件名Q文件大,验证消息{信息给文g接收者?/span>
2?span style="font: 7pt 'Times New Roman'"> 文g接收者收到文件信息和发送者信息,军_是否接收Q如不接Ӟ则发送拒l接收消息给文g发送者,文g传输l束。如同意接收Q发送同意接收消息和文g传输起始字节Q用于断点箋传)l发送者?/span>
3?span style="font: 7pt 'Times New Roman'"> 发送者开始发送文件数据包Q直到最后一个文件数据包Q发送者在最后一个文件数据包上加上标记?/span>
4?span style="font: 7pt 'Times New Roman'"> 接收者识别最后一个文件数据包Q文件传输成功?/span>
3Q?/span>2Q?/span>2 文g发送端的详l业务流E?/span>
图中昄了发送文件时的详l业务流E?/span>
1、首先,要选择要发送的文gQ可以选择一个文件或同一个文件夹下的多个文g发送,当选择多个文gӞ软gؓ每个文g建立一个传输线E。选择文g后,发送者要填写目标IP和端口,׃是基?/span>P2P的文件传输,不存在服务器l护好友列表Q所以需要知道目?/span>IP才能传输文gQ用户也可以填写验证消息用于描述自己的n份和文g的介l?/span>
2、发送者收到确认包Q判断是否接收文Ӟ如果不接Ӟ则传输结束,如果接收Q则打开要发送的文gQ设|v始传输字节?/span>
3、发送者读取一个文件片D,加入是否是最后一个文件片D늚标志Q打包发l接收者?/span>
4、发送完最后一个文件片D|Q文件传输结束?/span>
3Q?/span>2Q?/span>3 文g接收者详l业务流E?/span>
1?nbsp;从一打开软g开始,监听U程׃启动Q这时用户就扮演者文件接收者的角色Q当有文件发送者发来请求时Q监听线E徏立与发送者的q接Qƈ创徏传输U程Q接收者得到发送者传来的文g信息和验证消息,用户q能得到发送者的IP地址Q用h据这些信息决定是否接收文Ӟq发送确认包l发送者,认包里包含了是否接收的标志Q和开始传输的起始字节?/span>
2?nbsp;接收者开始接收数据包Q解包,写入文g中,直到最后一个文件片D,关闭文gQ文件传输结束?/span>
3Q?/span>3 软g的传输协议设?/span>
Z更好的控制文件传输的程Q开发设计了文g传输协议Q该协议属于应用层协议,Z不传输q程q于复杂Q协议尽量简单设计。主要的内容是传输包的格式?/span>
3Q?/span>3Q?/span>1 传输包的格式
其中传输包的cd?/span>3U:
PACKAGE_TYPE_FILENAME = 0x01
文g名包Q该包用于文件发送者向接收者发送文件信息和验证消息
PACKAGE_TYPE_CONTEXT = 0x02
文g内容包,该包用于传输文g内容
PACKAGE_TYPE_CONFIRMRECEIVE = 0x03
文g传输认包,该包用于文g接收者向发送者确认文件的接收
3Q?/span>3Q?/span>2 文g名包格式
3Q?/span>3Q?/span>3 文g传输包格?br />
其中MORE_DATA用于认是否是文件片D늚最后一个包Q以l束文g的传输?/span>0表示没有数据Q?/span>1表示q有数据?/span>
3Q?nbsp;3Q?/span>4 文g接受认包格?/span>
其中CONFIRM_FLAG表示是否认文g接收Q?/span>1表示接收Q?/span>0表示不接Ӟ当接收时Q?/span>OFF表示文g传输的v始字节,用来实现断点l传?/span>
3Q? 文g传输的状态机
文g传输U程的地层其实就是一个状态{换机Q线E具有几个状态,U程从文件名传输状态开始,Ҏ文g传输的不同情况,在各个状态间转换Q直C输成功或传输p|?/span>
FILE_TRANS_STATUS_FILENAME = 0x01
文g名称传输状态,文g传输刚徏立连接时Q传输状态处于文件名传输状?/span>
FILE_TRANS_STATUS_CONTEXT = 0x02
文g内容传输转台Q在传输文g内容Ӟ传输状态属于该状?/span>
FILE_TRANS_STATUS_WAITFORCONFIRM = 0x03
{待认状态,文g发送者,发送完文g信息和验证消息后Q处于该状态,文g接收者接收到文g信息和验证消息后处于该状?/span>
FILE_TRANS_STATUS_SUCCESS = 0x04
文g传输成功状态,表示文g已成功传输完?/span>
FILE_TRANS_STATUS_FAIL = 0x05
文g传输p|状态,表示文g传输已经p|Q失败原因可能是Ҏ取消了文件传输或|络错误
3Q? l构设计
软g主要?/span>MainFrame,TransFileManager,SocketThread,Server,TransFilePanel五个cL成图 表示了这几个cM间的关系?/span>
cd能介l?/span>
MainFrame
MainFramecL软g的主界面c,负责与用L交互?/span>
TransFileManager
TransFileManagercL文g传输的控制类Q负责管理文件的传输Q它l护一个传输线E(SocketThreadQ的列表Q每个线E都表示一个正在传输的d?/span>TransFileManagercd时的扫描各个U程的状态,Ҏ不同状态做Z同处理,如计传输速度Q显CZ输进度等?/span>
SocketThread
SocketThreadcL文g传输U程c,它负责底层的具体传输工作Q包括打包与解包Qƈ且{换自q状态,完成文g的传输?/span>
Server
ServercL?/span>TransFileManagercM用的Q它负责本地端口的监听,一旦有用户q接Q?/span>TransFileManager创Z个传输线E,攑օU程列表。而它l箋监听端口?/span>
TransFilePanel
TransFilePanel是一个面板,它用有按钮、进度条Q标{用来昄文g的传输状态?/span>
3Q? c设?/span>
3Q?/span>6Q?/span>1 MainFrame
该类是视囄Q是软g的主界面?br />
成员变量Q?/span>
contentPane
contentPane?/span>JPanelcȝ对象Q是ȝ面的面板?/span>
jbtnSend
jbtnSend?/span>JButtoncd象,点击它将打开文g传输对话框?/span>
jbtnSetting
jbtnSetting?/span>JButtoncd象,点击它将打开讄对话框?/span>
jlblIP
jlblIP?/span>JLablecd象,它显C本机的IP地址Q方便文件的传输?/span>
jtpTransFile
jtpTransFile?/span>JTabbedPanecd象,是选项卡控Ӟ用于昄多个文g同时传输?/span>
tfm
tfm?/span>TransFileManagercd象,负责控制文g的传输?/span>
成员ҎQ?/span>
jbtnSend_anctionPerformed()
该方法ؓjbtnSend按钮的点M?/span>
jbtnSetting_actionPerformed()
该方法ؓjbtnSetting按钮的点M?/span>
This_windowClosed()
该方法ؓH口关闭事g
界面截图Q?/span>
3Q?/span>6Q?/span>2 TransFileManagerc?/span>
该类负责传输q程中对各个传输U程的检与控制?/span>
成员变量Q?/span>
jtp
jtp是选项卡控件对象,?/span>MainFramecMjtpTransFile对象的一个引用?/span>
panelist
paneList?/span>ArrayListcd象,它是一个链表结构,存储使用的选项卡?/span>
running
running是一?/span>boolean型的对象Q用来表C线E是否在执行?/span>
s
s?/span>Servercȝ对象Q用来坚听本地端口,{待用户的连接?/span>
threadList
threadList?/span>ArrayListcd象,它是一个链表结构,存储使用的传输线E?/span>
maxThreadNum
maxTreadNum是整型变量,表示最大允许的U程数?/span>
port
port是整型变量,表示使用的端口号?/span>
成员ҎQ?/span>
close()
该方法用于关闭文件传输的控制?/span>
sendFile()
该方法用于徏立一个文件发送,要求输入参数为,目标IPQ端口号Q要发送的文g和验证消息?/span>
3Q?Q? SocketThreadc?/span>
SocketThreadcL文g传输的底层支持类Q它提供文g传输的服务?/span>
成员变量Q?/span>
sendBuf
sendBuf是一个字节型数据Q它是文件发送和接收时的~冲区?/span>
dis
dis?/span>DataInputStream型对象,它是?/span>Socket对象得到的输入流?/span>
dos
dos?/span>DataOutputStream型对象,它是?/span>Socket对象得到的输出流?/span>
fDis
fDis?/span>DataInputStream型对象,它是要发送的文g的输入流?/span>
raf
raf?/span>RandomAccessFile型对象,该对象允许设|输出流的位|,以支持断点箋传?/span>
running
running是一?/span>boolean型对象,用来表示U程是否在执行?/span>
serverName
serverName是字W串型对象,表示服务器的地址Q该对象只有在线E作为发送者时使用?/span>
errorMessage
errorMessage是字W串型对象,表示出错的信息?/span>
fileName
fileName是字W串型对象,表示文g名?/span>
fileSender
fileSender是一?/span>boolean型对象,表示是文件发送者还是文件接收者?/span>
IP
IP是字W串型对象,用来存放目的机的IP地址?/span>
message
message是字W串型对象,用来表示验证信息?/span>
port
port是整型变量,表示q接的端口号?/span>
transFileLength
transFileLength是长整型变量Q表C已l传输的文g长度Q?/span>TransFileManager可以用它来计传输进度和传输速度
成员ҎQ?/span>
cancelTrans()
该方法用于取消传?/span>
confirmReceiveFile()
该方法用于确认传输文?/span>
参数flag用来表示是否同意传输
参数fileName用来表示保存的文?/span>
参数off用来表示起始传输字节
getFileTransMessage()
该方法用于得到文件传输的基本信息。如Q文件发送的目标Q端口号{?/span>
getStatus()
该方法返回一个整型变量,表示当前U程的传输状态?/span>
run()
U程的执行方法,该方法中循环执行发送或接收ҎQ完成文件的发送或接收?/span>
setError()
该方法通过一个字W串型的参数讄错误信息?/span>
stopThread()
该方法用于停止线E的执行?/span>
doPackage()
打包ҎQ该Ҏ中,ҎU程所处的不同状态,Ҏ据加入不同的包头和其他信息,q行打包?/span>
readFromFile()
该方法从要发送的文g中读取一个整型数?/span>
readFromSocket()
该方法从Socket输入读取一个整型数Q它有一个重载版本读取一个字节数l的数据?/span>
receiveFile()
该方法ؓ接收文g的方法,是线E@环中Q文件接收者执行的Ҏ?/span>
sendFile()
该方法ؓ发送文件方法,是线E@环中Q文件发送者执行的Ҏ?/span>
writeToFile()
该方法写一个字节数据的数据C存的文g中?/span>
writeToSocket()
该方法写数据?/span>Socket输出中Q它有三个重载版本,分别是写入整型数Q写入长整型数和写入字节数组数据?/span>
3Q?Q? TransFilePanelc?/span>
q个cd于视囄Q它作ؓȝ面上的一个对象用,含有q度条,按钮Q标{对象Q用于显C文件传输状态,每一个传输线E都拥有自己?/span>TransFilePanelcd象?/span>
成员变量Q?/span>
fileName
fileName是一个字W串Q表CZ输文件的文g名?/span>
fileSender
fileSender?/span>boolean型对象,表示是文件发送者还是接收者?/span>
isCanneled
isCanneled?/span>boolean型对象,传输q程中,用户点了取消按钮后,该标志位|?/span>trueQ?/span>TransFileManager会@环检?/span>isCanneled标志Q当发现其ؓtrue后,它会关闭对应的传输线E,而对方会到传输错误Q文件传输就停止了?/span>
isClosed
isClosed?/span>boolean型对象,它表C当传输q程已经停止Ӟ用户点击了关闭按钮,TransFileManager到isClosed?/span>trueӞ会在列表中去掉对应的传输U程?/span>TransFilePanel?/span>
isConfirm
isConfirm?/span>boolean型对象,它表C文件接收者是否确认了文g接收后(包括同意和拒l)Q?/span>TransFileManager到isConfirm?/span>trueӞ会将认状态发l文件发送者?/span>
jbtnCannel
jbtnCannel是取消按钮?/span>
jbtnOK
jbtnOK是确定按钮?/span>
jpgbFileTrans
jpgbFileTrans是文件传输的q度条?/span>
jtaFileTransStatus
jtaFileTransStatus是一个文本框Q用来显C文件传输的状态?/span>
transFileLength
transFileLength是一个长整型变量Q用来表C已l传输的文g长度?/span>
status
status是一个整行变量,表示文g传输的状态,所表示的状态与SocketThread中的对应?/span>
界面截图
3Q? 法介绍
3Q?/span>7Q?/span>1 TransFileManager的@环监?/span>
TransFileMangercȝ承了Threadc,实现多线E,避免循环监听时生阻塞?/span>
以下是在每次循环中做的工?/span>
1?nbsp;得到传输U程(SocketThread)的数量和传输状态显C面?/span>(TransFilePanel)的数量?/span>
2?nbsp;从传输线E列表中依次取出一个传输线E?/span>
3?nbsp;判断当前取出的线E是否有对应的传输状态显C面板,如果有执?/span>5Q如果没有执?/span>4?/span>
4?nbsp;增加传输状态显C面板,q且在主界面上增加选项卡?/span>
5?nbsp;判断传输U程的状态,Ҏ不同的状态做不同的处理?/span>
6?nbsp;如果列表中的U程取完Q执?/span>1Q没有取完执?/span>2?/span>
E序程图:
3Q?/span>7Q?/span>2 断点l传
软g支持断点l传的功能,该功能主要算法如下:
1?nbsp;当文件传输中途停止时Q文件接收者程序ؓ接收的文件创Z个以该文件名+.tmp为文件名的时文Ӟ临时文g与该文g保存在同一个\径下。时文件中保存文g以传输的字节数和文g的大?/span>
2?nbsp;当文件接收者接收该文gӞ如果有对应的临时文gQ程序会到该文件的临时文gQ读取以传输的字节数和文件大,q且比较传输的字节数与未完成传输的文件大是否相{,文g大小和发送来的文件大是否相{,如果都相{,执行3Q否则执?/span>4?/span>
3?nbsp;文件的输出设|到应该l箋传输的位|,q将起始传输字节数发l发送者,执行5?/span>
4?nbsp;如果有未完成的传输文Ӟ其删除Q执?/span>5?/span>
5?nbsp;q行文g传输?/span>
E序程图:
3Q?Q? 本地端口的多q接监听
Servercd象负责本地端口的监听Q可以支持多了连接,具体数量q戯|?/span>
1?span style="font: 7pt 'Times New Roman'"> 用用戯|的端口创徏监听Q等待连接?/span>
2?span style="font: 7pt 'Times New Roman'"> 当有用户q接上后Q用该连接创Z?/span>SocketThread传输U程Q加入到U程列表?/span>
3?span style="font: 7pt 'Times New Roman'"> 如果停止监听则退出,否则执行1?/span>
E序程图:
字符攉器类是Y件的底层c,它与XML文g交互Q读取文件中的字W信息,l过处理QŞ成标{,文本Q属性等数据Z层提供服务?/span>
成员变量介绍Q?/span>
aReader:Reader对象Q输入流为文件输入流Q它?span>XML文g的字W数据以的形式提供l类?/span>
成员Ҏ介绍Q?/span>
comparedArray(): 输入Q两?span>int型数l,输出Q?span>boolean型,q回两个数组是否相同。用于比较两个数l是否相同,在方法中Q对两个数组的数逐一比较?/span>
hasMoreChars(): 输入Q无Q输出:boolean型,表示文g中是否还有字W,该方法用于确定文件中是否q有字符?/span>
peek(): 输入Q?span>int型数l。用于存储窥探到的字W,输出Q无Q该Ҏ用于从文件中H探数组长度的字W数据。窥探就是从文g中读取数据后Q将输入标记回以前的位|,以免丢失数据?/span>
法qͼ
?span>aReader上标记数l的长度
aReader.mark(buffer.length);
2、将数据依次d数组
for (int i = 0; i < buffer.length; i++) {
buffer[i] = aReader.read();
}
恢复aReader
aReader.reset();
peek(): 输入Q无Q输出:int型,是窥探到的字W,该方法从文g中窥探一个字W数据?/span>
processCDATA(): 输入Q?span>StringBuffer型,用于存放CDATA数据Q输出:无,用于处理XML文g中的CDATA节点。得到的CDATA节点存放?span>StringBuffer对象中?/span>
法qͼ
预设两个数组
int[] cdataHead = {'<', '!', '[', 'C', 'D', 'A', 'T', 'A', '['};
int[] cdataTail = {']', ']', '>'};
H探cdataHead长度的字W存在数l?span>buf?/span>
peek(buf);
比较buf?span>cdataHead数组的内Ҏ否相同,如果不同q回falase,如果相同l箋执行?/span>
?span>aReader跌cdataHead的长度,然后循环d直到H探的字W数l与cdataTail相同Q将中间的字W存攑ֈStringBuffer对象中?/span>
while (true) {
peek(buf);
if (comparedArray(buf, cdataTail)) {
aReader.skip(cdataTail.length);
flag = true;
break;
} else {
bufChar = aReader.read();
if (bufChar == -1) {
throw new IOException("CDATA node without end tag");
}
sb.append((char) bufChar);
}
}
processEntity(): 输入Q?span>StringBuffer型,用于存放实体数据Q输出:无,用语处理XML文g中的内徏实体cd。得到的实体存放?span>StringBuffer对象中?/span>
readTag(): 输入Q无Q输出:String型,是读到的标签Q从XML文g中读取ƈ整理成一个标{数据存攑֜String对象中?/span>
法qͼ
H探一个字W,如果不是’<’Q抛出异常。否则l执行?/span>
int nextChar = peek();
if (nextChar != '<') {
throw new IOException("expect '<',but got '" + (char) nextChar +"'");
}
H探一个字W?span>aChar
int aChar = peek();
如果字符?span>’<’Q进?span>CDATA节点处理
if (aChar == '<') {
if (processCDATA(sb)) {
aChar = peek();
continue;
}
}
如果字符?span>’&’Q进行内建实体处?/span>
if (aChar == '&') {
if (processEntity(sb)) {
aChar = peek();
continue;
}
}
如果字符?span>’>’或文件结束,q回StringBuffer对象?/span>
如果是其它字W,加入?span>StringBuffer对象中?/span>
readText(): 输入Q无Q输出:String型,是读到的文本内容Q从XML文g中读取ƈ整理成一个文本数据存攑֜Sting对象中?/span>
skipOtherTag(): 输入Q无Q输出:无,跌一个不处理的标{?/span>
skipOtherTags(): 输入Q无Q输出:无,跌多个不处理的标签?/span>
skipWhitespace():输入Q无Q输出:无,跌I格?br>
解析内核c?br>
该类用于解析XML文gQ包?span>parser()ҎQ是该类的核心方法?/p>
成员变量介绍Q?/span>
aCharCollector:CharCollectorcd象,负责字符攉?/span>
currentNode: SimpleElementcd象,表示当前处理的元素?/span>
Elements: Stackcd象,用栈的存储结构,表示元素之间的层ơ关pR?/span>
成员Ҏ介绍Q?/span>
Parser(): 输入Q无Q输出:SimpleDocumentcd象,是返回的整个文档树型l构?/span>
法qͼ
1?/span>d一个标{?/span>
2?/span>判断是开始标{还是结束标{,如果是结束标{,转入l束标签处理3
如果是开始标{,转入开始标{֤?span>6
3?/span>得到标签的名Uͼ判断是否?span>currentNode的名U相同,如果相同Q执?/span>
4Q否则抛出异?/span>
4?/span>判断是否q有标签Q如果有l箋执行5Q否则退出?/span>
5?/span>从栈中弹Z个节点给currentNodeQ执?span>1
6?/span>得到标签的名Uͼ属性,文本内容Q将标签加入?span>DOM树中Qƈ且压栈?/span>
执行1
法的程序流E图
中间层管理类
中间层管理类用于控制和协调解析器与用L面?/p>
成员变量介绍Q?/span>
isParsered: boolean型,判断是否已经解析q了?/span>
document: SimpleDocument型对象,表示整个XML文档树,也是解析器返回的?/span>
parser: SimpleDOMParser型对象,表示解析器?/span>
成员Ҏ介绍Q?/span>
getTreeRoot(): 输入Q无Q输出:DefaultMutableTreeNode型对象,是得到的树的根节点,用于得到树的根节炏V?/span>
parser(): 输入Q无Q输出:无,用于执行解析操作?/span>
setInputStream(): 输入Q?span>InputStream型对象,是要讄的输入流Q输出:无,用于讄解析源?/span>
setXMLFile()Q?span> 输入Q?span>File型对象,是要讄?span>XML文gQ输出:无,用于讄XML文g源?/span>
getTreeNode(): 输入Q?span>SimpleElement型对象,是要转换的对象,输出Q?span>DefaultMutableTreeNode型对象,是{换后的对象,?/span>
于{换相应元素ؓ树的节点对象?/span>
各个cȝ功能介绍
Node?/span>Element?/span>Document?/span>Attr?/span>W3C?/span>DOM规范要求实现的接口。还有其它接口未列出?/span>
SimpleNode l承Node接口Q实?/span>Node接口的基本功能?/span>
SimpleElementl承Node?/span>Element接口Q对?/span>DOM树中的标准节点,也就?/span>XML文g中的一个标{?/span>
SimpleDocument l承Node?/span>Document接口Q对应整?/span>DOM树,它是解析器解析完成后Q返回的对象。用户可以用该对象讉K整个DOM树?/span>
SimpleAttr l承Node?/span>Attr接口Q对?/span>DOM树中的属性节点,用于存放属性名U和属性倹{?/span>
CharCollector 字符攉器类Q它直接?/span>XML文g接触Q根据需要向调用者提供下一个标{或文本{数据?/span>
SimpleDOMParser 解析器的核心c,它?/span>CharCollectorc,得到标签、文本等数据。?/span>SimpleElement?/span>SimpleAttr{类存放数据Q生?/span>SimpleDocumnet对象q回l调用者?/span>
MainFrame 用户界面c,它将解析l果展示l用Pq且Ҏ用户的操作,与用戯行交互?/span>
Manager 中间层管理类Q它协调用户界面Q?/span>MainFrameQ与解析器内?/span>(SimpleDOMParser)之间的关p,实现解析器的控制?/span>
内部接口设计
cdU?/span> |
调用c?/span> |
调用功能 |
SimpleDOMParser |
SimpleElement |
节点的存储,查找Q删除?/span> |
SimpleDOMParser |
SimpleAttr |
属性节点的存储Q查找,删除?/span> |
SimpleDOMParser |
SimpleDocument |
生成DOM?/span> |
SimpleDomParser |
CharCollector |
字符攉Q得到标{与文本{?/span> |
Manager |
SimpleDOMParser |
解析XML文档 |
Manager |
MainFrame |
用户界面的相x?/span> |
用例关系设计
用例介绍
用户Q?/span> 参与者, 卌Y件的使用者?/span>
XML文gQ?/span> 参与者,XML文g?/span>
链接的文Ӟ 参与者,XML文g中链接的外部文g?/span>
选择XML文gQ?/span> 用户通过文g选择框选择一个本地的XML文g?/span>
选择URL地址Q?/span> 用户输入一个有效的URLQ指向网l上?/span>XML格式的网c?/span>
解析XML文gQ?/span> 用户定?/span>XML文gq行解析Q该Ҏ作要发生在选择XML文g或选择URL地址之后?/span>
修改文gQ?/span> 用户?/span>XML文gq行修改
保存文gQ?/span> 用户通过文g选择框,选择位置保存XML文g?/span>
选择DOM树节点:用户选择解析后的DOM树型l构上的节点?/span>
解析器解析: 解析器对XMLq行解析
攉字符Q?/span> 字符攉器负责处?/span>XML的字W数?/span>
界面展示Q?/span> 通过树型l构和图表向用户展示数据?/span>
字符攉器有限状态机
DFA M=Q?/span>{S,Ts,Tp,Tq,Cp,Ep,Er,Q},{LT,RT,A,C,EC,,EOF,NL,NLRA},f,S,{Q}Q?/span>
其中 字符集:
LT={<}
RT={/>}
A={&,<,>,&apos,&qout}
C={<!CDATA[[}
EC={]]>}
EOF代表文gl束
NL代表不是<的字W?/span>
NLRA 代表除去LT,RT,LTL,A,C的所有字W?/span>
状态:
SQ?/span> 开始状?/span>
TsQ标{֤理开始状?/span>
TpQ标{֤理状?/span>
TqQ标{֤理结束状?/span>
CpQ?/span>CDATA节点处理状?/span>
EpQ内建实体处理状?/span>
ErQ错误状?/span>
QQ结束状?/span>
状态{换函敎ͼ
f(S,LT)=Ts
f(S,NL)=Er
f(Tp,RT)=Tq
f(Tp,A)=Cp
f(Tp,C)=Ep
f(Ep,EC)=Tp
f(Ep,EOF)=Er
f(Tq,LT)=Ts
f(Tq,EOF)=Q
f(Tq,NLRA)=Tq
MediaTracker mt = new MediaTracker(aFrame); //媒体跟踪?/span>
Image img = Toolkit.getDefaultToolkit().createImage("d.jpg"); //得到囄
mt.addImage(img, 1);
try {
mt.waitForAll();
}
catch (InterruptedException ex) {
}
BufferedImage bi = new BufferedImage(16, 16, BufferedImage.TYPE_INT_RGB);
bi.getGraphics().drawImage(img, 0, 0, 16, 16, f);
int[] rbg = new int[bi.getWidth() * bi.getHeight()];
bi.getRGB(0, 0, 16, 16, rbg, 0, 16); //利用BufferedImage得到像素矩阵
for (int i = 0; i < rbg.length; i++) {
System.out.print(rbg[i] + ","); //打印
}
再在代码中创建静态对?/span>
private static int[] penPixels = {
16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
16777215, 16777215,
16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
16777215, 16777215, -16777216, -16777216, -16777216, 16777215, 16777215,
16777215, 16777215,
16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
16777215, -16777216, -2031616, -2031616, -2031616, -16777216, 16777215,
16777215, 16777215,
16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
16777215, -16777216, -2031616, -1, 16777215, -16777216, 16777215,
16777215, 16777215,
16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
-16777216, -16777216, -2031616, -1, -16777216, 16777215, 16777215,
16777215, 16777215,
16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
-16777216, -256, -16777216, -16777216, -16777216, 16777215, 16777215,
16777215, 16777215,
16777215, 16777215, 16777215, 16777215, 16777215, 16777215, -16777216,
-256, -1, -1842205, -16777216, 16777215, 16777215, 16777215, 16777215,
16777215,
16777215, 16777215, 16777215, 16777215, 16777215, 16777215, -16777216, -1,
-256, -16777216, -16777216, 16777215, 16777215, 16777215, 16777215,
16777215,
16777215, 16777215, 16777215, 16777215, 16777215, -16777216, 16777215,
-256, -1842205, -16777216, 16777215, 16777215, 16777215, 16777215,
16777215, 16777215,
16777215, 16777215, 16777215, 16777215, 16777215, -16777216, -256, -1,
-16777216, -16777216, 16777215, 16777215, 16777215, 16777215, 16777215,
16777215,
16777215, 16777215, 16777215, 16777215, -16777216, -256, -1, -1842205,
-16777216, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
16777215,
16777215, 16777215, 16777215, 16777215, -16777216, -16777216, -256,
-16777216, -16777216, 16777215, 16777215, 16777215, 16777215, 16777215,
16777215, 16777215,
16777215, 16777215, 16777215, 16777215, -16777216, -16777216, -16777216,
-16777216, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
16777215, 16777215,
16777215, 16777215, 16777215, 16777215, -16777216, -16777216, -16777216,
16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
16777215, 16777215,
16777215, 16777215, 16777215, 16777215, -16777216, -16777216, 16777215,
16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
16777215, 16777215,
16777215, 16777215, 16777215, 16777215, -16777216, 16777215, 16777215,
16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,
16777215, 16777215
};//打印出来的矩?/span>
private static MemoryImageSource misPen = new MemoryImageSource(16, 16,
penPixels, 0, 16);
public static Image imgPen = Toolkit.getDefaultToolkit().createImage(misPen);
q样可以直接?/span>imgPen囄了?/span>
DOM规范定义了一l接口,用户通过q些接口来访?/span>DOM解析器返回的树型l构?/span>DOM不同?/span>SAX的事仉动模式,它是整个文档解析完成后QŞ成一个树型结构放在内存中。下面是DOM规范中的所有接口,灰色昄的是本解析器实现的接口?br>
DOMImplementation
DOMImplementation接口允许代码讉KDOM的具体实玎ͼ以找出对各种Ҏ的有效支持。其中的hasFeature(String feature, String version)Ҏ可以试具体?/span>DOM实现是否支持某特性?/span>
NodeList
NodeList对象?/span>Node对象的一个简单的有序集合。例如,可以用来存放一个节点的子节炏V?/span>
Node
Node对象?/span>DOM中所有节点的基对象?/span>Element?/span>Attr?/span>Text?/span>CDATASection?/span>EntityReference?/span>Entity?/span>ProcessingInstruction?/span>Comment?/span>Document?/span>DocumentType?/span>DocumentFragment?/span>Notation对象都派生于Node对象?/span>
NamedNodeMap
NamedNodeMap对象是可以通过猛成讉K?/span>Node对象集合。可以用来存放节点的属性?/span>
DOMException
异常接口
DocumentFragment
DocumentFragment对象是文档片D,是文档(DocumentQ对象的一个简单的版本。它可以用来表示文档的Q意子树?/span>
Document
Document对象是能?/span>DOMCZ的主要对象。它代表整个?/span>xml文档Q也是解析器q回的对象?/span>
Element
Element对象包含文档中的元素的信息。代表一个标{?/span>
Attr
Attr是属性对象,一个节点的属性存?/span>NamedNodeMap里?/span>
CharacterData
CharacterData对象表示xml文g中的字符信息?/span>
DocumentType
DocumentType对象表示文档cdQ也是DTD声明里的内容?/span>
Notation
Notation对象表示DTD声明中的关于表示法的信息?/span>
Entity
Entity对象包含DTD中有兛_体的信息?/span>
EntityReference
EntityReference对象包含对已解析文档中的实体的引用信息?/span>
ProcessingInstruction
ProcessingInstruction对象包含文档中内嵌的处理指o的信息?/span>
Text
Text对象表示节点的文本数据?/span>
Comment
Comment对象表示注释?/span>
CDATASection
CDATASection对象包含文本中未被解析块的内宏V?/span>
b?/font> 得到后台?/span>Graphics实例
Graphics2D offScreenG;
offScreenG = offScreenImg.createGraphics();
c?/font> 覆盖paintComponentҎ
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(offScreenImg, 0, 0, this.maxX, this.maxY, this);
}
l制时用后台GraphicsQ绘制好后,调用repaint()Q将offScreenImgl到面板上?/span>