關(guān)于留言
由于留言的提示郵件會(huì)被標(biāo)記為垃圾郵件, 所以很多留言我沒能發(fā)現(xiàn)并回復(fù)。如果有問題要討論,請大家直接發(fā)郵件到郵箱rex_mao@hotmail.com。
另外,如果需要源程序,可聯(lián)系購買,也可提供程序擴(kuò)展開發(fā)。
謝謝。
posted @ 2008-05-24 01:04 Rex Mao| 編輯 收藏
分享java技術(shù)與生活
2007年5月31日 #
posted @ 2008-05-24 01:04 Rex Mao| 編輯 收藏
1. 顯示當(dāng)前連接。
SQL:
SELECT *
FROM V$SESSION
WHERE STATUS = 'INACTIVE'
AND USERNAME IS NOT NULL;
posted @ 2008-05-17 14:11 Rex Mao 閱讀(3122) | 評論 (2) | 編輯 收藏
源代碼已經(jīng)上傳了。
第3章 設(shè)計(jì)文檔
3.1 任務(wù)概述
本項(xiàng)任務(wù)要開發(fā)一款P2P文件傳輸軟件,該軟件可以在局域網(wǎng)和互連上使用,具有文件傳輸,斷點(diǎn)續(xù)傳,多線程連接等功能。
3.1.1 開發(fā)背景
隨著網(wǎng)絡(luò)的普及,在網(wǎng)絡(luò)中交換信息,特別是文件成為使用網(wǎng)絡(luò)時(shí)經(jīng)常性工作,現(xiàn)有的文件傳輸工具如QQ、MSN等,主要功能是作為即時(shí)通訊工具使用,而且在局域網(wǎng)中使用時(shí)仍需連接到互連網(wǎng)。本文開發(fā)的軟件基于P2P結(jié)構(gòu)實(shí)現(xiàn)文件傳輸,不依靠服務(wù)器維護(hù)用戶資料,所以,只要兩臺(tái)機(jī)器可以連通,就可以進(jìn)行文件傳輸。
3.1.2 定義
P2P:即peer-to-peer,可以理解為點(diǎn)對點(diǎn),或?qū)Φ葌鬏數(shù)囊馑肌?/span>
3.1.3 開發(fā)工具
開發(fā)采用JAVA語言,開發(fā)工具為jbuilder 2005
3.2 文件傳輸業(yè)務(wù)流程
3.2.1 通訊順序關(guān)系
在文件傳輸時(shí),傳輸過程可以簡單的分為4步,如圖 :
1、 由文件發(fā)送者發(fā)起文件傳輸,他首先發(fā)送文件名,文件大小,驗(yàn)證消息等信息給文件接收者。
2、 文件接收者收到文件信息和發(fā)送者信息,決定是否接收,如不接收,則發(fā)送拒絕接收消息給文件發(fā)送者,文件傳輸結(jié)束。如同意接收,發(fā)送同意接收消息和文件傳輸起始字節(jié)(用于斷點(diǎn)續(xù)傳)給發(fā)送者。
3、 發(fā)送者開始發(fā)送文件數(shù)據(jù)包,直到最后一個(gè)文件數(shù)據(jù)包,發(fā)送者在最后一個(gè)文件數(shù)據(jù)包上加上標(biāo)記。
4、 接收者識(shí)別最后一個(gè)文件數(shù)據(jù)包,文件傳輸成功。
3.2.2 文件發(fā)送端的詳細(xì)業(yè)務(wù)流程
圖中顯示了發(fā)送文件時(shí)的詳細(xì)業(yè)務(wù)流程。
1、首先,要選擇要發(fā)送的文件,可以選擇一個(gè)文件或同一個(gè)文件夾下的多個(gè)文件發(fā)送,當(dāng)選擇多個(gè)文件時(shí),軟件將為每個(gè)文件建立一個(gè)傳輸線程。選擇文件后,發(fā)送者要填寫目標(biāo)IP和端口,由于是基于P2P的文件傳輸,不存在服務(wù)器維護(hù)好友列表,所以需要知道目標(biāo)IP才能傳輸文件,用戶也可以填寫驗(yàn)證消息用于描述自己的身份和文件的介紹。
2、發(fā)送者收到確認(rèn)包,判斷是否接收文件,如果不接收,則傳輸結(jié)束,如果接收,則打開要發(fā)送的文件,設(shè)置起始傳輸字節(jié)。
3、發(fā)送者讀取一個(gè)文件片段,加入是否是最后一個(gè)文件片段的標(biāo)志,打包發(fā)給接收者。
4、發(fā)送完最后一個(gè)文件片段時(shí),文件傳輸結(jié)束。
3.2.3 文件接收者詳細(xì)業(yè)務(wù)流程
1、 從一打開軟件開始,監(jiān)聽線程就會(huì)啟動(dòng),這時(shí)用戶就扮演者文件接收者的角色,當(dāng)有文件發(fā)送者發(fā)來請求時(shí),監(jiān)聽線程建立與發(fā)送者的連接,并創(chuàng)建傳輸線程,接收者得到發(fā)送者傳來的文件信息和驗(yàn)證消息,用戶還能得到發(fā)送者的IP地址,用戶根據(jù)這些信息決定是否接收文件,并發(fā)送確認(rèn)包給發(fā)送者,確認(rèn)包里包含了是否接收的標(biāo)志,和開始傳輸?shù)钠鹗甲止?jié)。
2、 接收者開始接收數(shù)據(jù)包,解包,寫入文件中,直到最后一個(gè)文件片段,關(guān)閉文件,文件傳輸結(jié)束。
3.3 軟件的傳輸協(xié)議設(shè)計(jì)
為了更好的控制文件傳輸?shù)牧鞒蹋_發(fā)設(shè)計(jì)了文件傳輸協(xié)議,該協(xié)議屬于應(yīng)用層協(xié)議,為了不使傳輸過程過于復(fù)雜,協(xié)議盡量簡單設(shè)計(jì)。主要的內(nèi)容是傳輸包的格式。
3.3.1 傳輸包的格式
其中傳輸包的類型有3種:
PACKAGE_TYPE_FILENAME = 0x01
文件名包,該包用于文件發(fā)送者向接收者發(fā)送文件信息和驗(yàn)證消息
PACKAGE_TYPE_CONTEXT = 0x02
文件內(nèi)容包,該包用于傳輸文件內(nèi)容
PACKAGE_TYPE_CONFIRMRECEIVE = 0x03
文件傳輸確認(rèn)包,該包用于文件接收者向發(fā)送者確認(rèn)文件的接收
3.3.2 文件名包格式
3.3.3 文件傳輸包格式
其中MORE_DATA用于確認(rèn)是否是文件片段的最后一個(gè)包,以結(jié)束文件的傳輸。0表示沒有數(shù)據(jù),1表示還有數(shù)據(jù)。
3. 3.4 文件接受確認(rèn)包格式
其中CONFIRM_FLAG表示是否確認(rèn)文件接收,1表示接收,0表示不接收,當(dāng)接收時(shí),OFF表示文件傳輸?shù)钠鹗甲止?jié),用來實(shí)現(xiàn)斷點(diǎn)續(xù)傳。
3.4 文件傳輸?shù)臓顟B(tài)機(jī)
文件傳輸線程的地層其實(shí)就是一個(gè)狀態(tài)轉(zhuǎn)換機(jī),線程具有幾個(gè)狀態(tài),線程從文件名傳輸狀態(tài)開始,根據(jù)文件傳輸?shù)牟煌闆r,在各個(gè)狀態(tài)間轉(zhuǎn)換,直到傳輸成功或傳輸失敗。
FILE_TRANS_STATUS_FILENAME = 0x01
文件名稱傳輸狀態(tài),文件傳輸剛建立連接時(shí),傳輸狀態(tài)處于文件名傳輸狀態(tài)
FILE_TRANS_STATUS_CONTEXT = 0x02
文件內(nèi)容傳輸轉(zhuǎn)臺(tái),在傳輸文件內(nèi)容時(shí),傳輸狀態(tài)屬于該狀態(tài)
FILE_TRANS_STATUS_WAITFORCONFIRM = 0x03
等待確認(rèn)狀態(tài),文件發(fā)送者,發(fā)送完文件信息和驗(yàn)證消息后,處于該狀態(tài),文件接收者接收到文件信息和驗(yàn)證消息后處于該狀態(tài)
FILE_TRANS_STATUS_SUCCESS = 0x04
文件傳輸成功狀態(tài),表示文件已成功傳輸完畢
FILE_TRANS_STATUS_FAIL = 0x05
文件傳輸失敗狀態(tài),表示文件傳輸已經(jīng)失敗,失敗原因可能是對方取消了文件傳輸或網(wǎng)絡(luò)錯(cuò)誤
3.5 結(jié)構(gòu)設(shè)計(jì)
軟件主要由MainFrame,TransFileManager,SocketThread,Server,TransFilePanel五個(gè)類構(gòu)成圖 表示了這幾個(gè)類之間的關(guān)系。
類功能介紹
MainFrame
MainFrame類是軟件的主界面類,負(fù)責(zé)與用戶的交互。
TransFileManager
TransFileManager類是文件傳輸?shù)目刂祁悾?fù)責(zé)管理文件的傳輸,它維護(hù)一個(gè)傳輸線程(SocketThread)的列表,每個(gè)線程都表示一個(gè)正在傳輸?shù)娜蝿?wù)。TransFileManager類定時(shí)的掃描各個(gè)線程的狀態(tài),根據(jù)不同狀態(tài)做出不同處理,如計(jì)算傳輸速度,顯示傳輸進(jìn)度等。
SocketThread
SocketThread類是文件傳輸線程類,它負(fù)責(zé)底層的具體傳輸工作,包括打包與解包,并且轉(zhuǎn)換自己的狀態(tài),完成文件的傳輸。
Server
Server類是為TransFileManager類使用的,它負(fù)責(zé)本地端口的監(jiān)聽,一旦有用戶連接,TransFileManager就創(chuàng)建一個(gè)傳輸線程,放入線程列表。而它繼續(xù)監(jiān)聽端口。
TransFilePanel
TransFilePanel是一個(gè)面板,它用有按鈕、進(jìn)度條,標(biāo)簽等用來顯示文件的傳輸狀態(tài)。
3.6 類設(shè)計(jì)
3.6.1 MainFrame
該類是視圖類,是軟件的主界面。
成員變量:
contentPane
contentPane是JPanel類的對象,是主界面的面板。
jbtnSend
jbtnSend是JButton類對象,點(diǎn)擊它將打開文件傳輸對話框。
jbtnSetting
jbtnSetting是JButton類對象,點(diǎn)擊它將打開設(shè)置對話框。
jlblIP
jlblIP是JLable類對象,它顯示本機(jī)的IP地址,方便文件的傳輸。
jtpTransFile
jtpTransFile是JTabbedPane類對象,是選項(xiàng)卡控件,用于顯示多個(gè)文件同時(shí)傳輸。
tfm
tfm是TransFileManager類對象,負(fù)責(zé)控制文件的傳輸。
成員方法:
jbtnSend_anctionPerformed()
該方法為jbtnSend按鈕的點(diǎn)擊事件
jbtnSetting_actionPerformed()
該方法為jbtnSetting按鈕的點(diǎn)擊事件
This_windowClosed()
該方法為窗口關(guān)閉事件
界面截圖:
3.6.2 TransFileManager類
該類負(fù)責(zé)傳輸過程中對各個(gè)傳輸線程的檢測與控制。
成員變量:
jtp
jtp是選項(xiàng)卡控件對象,是MainFrame類中jtpTransFile對象的一個(gè)引用。
panelist
paneList是ArrayList類對象,它是一個(gè)鏈表結(jié)構(gòu),存儲(chǔ)使用的選項(xiàng)卡。
running
running是一個(gè)boolean型的對象,用來表示線程是否在執(zhí)行。
s
s是Server類的對象,用來堅(jiān)聽本地端口,等待用戶的連接。
threadList
threadList是ArrayList類對象,它是一個(gè)鏈表結(jié)構(gòu),存儲(chǔ)使用的傳輸線程。
maxThreadNum
maxTreadNum是整型變量,表示最大允許的線程數(shù)。
port
port是整型變量,表示使用的端口號。
成員方法:
close()
該方法用于關(guān)閉文件傳輸?shù)目刂啤?/span>
sendFile()
該方法用于建立一個(gè)文件發(fā)送,要求輸入?yún)?shù)為,目標(biāo)IP,端口號,要發(fā)送的文件和驗(yàn)證消息。
3.6.3 SocketThread類
SocketThread類是文件傳輸?shù)牡讓又С诸悾峁┪募鬏數(shù)姆?wù)。
成員變量:
sendBuf
sendBuf是一個(gè)字節(jié)型數(shù)據(jù),它是文件發(fā)送和接收時(shí)的緩沖區(qū)。
dis
dis是DataInputStream型對象,它是由Socket對象得到的輸入流。
dos
dos是DataOutputStream型對象,它是由Socket對象得到的輸出流。
fDis
fDis是DataInputStream型對象,它是要發(fā)送的文件的輸入流。
raf
raf是RandomAccessFile型對象,該對象允許設(shè)置輸出流的位置,以支持?jǐn)帱c(diǎn)續(xù)傳。
running
running是一個(gè)boolean型對象,用來表示線程是否在執(zhí)行。
serverName
serverName是字符串型對象,表示服務(wù)器的地址,該對象只有在線程作為發(fā)送者時(shí)使用。
errorMessage
errorMessage是字符串型對象,表示出錯(cuò)的信息。
fileName
fileName是字符串型對象,表示文件名。
fileSender
fileSender是一個(gè)boolean型對象,表示是文件發(fā)送者還是文件接收者。
IP
IP是字符串型對象,用來存放目的機(jī)的IP地址。
message
message是字符串型對象,用來表示驗(yàn)證信息。
port
port是整型變量,表示連接的端口號。
transFileLength
transFileLength是長整型變量,表示已經(jīng)傳輸?shù)奈募L度,TransFileManager可以用它來計(jì)算傳輸進(jìn)度和傳輸速度
成員方法:
cancelTrans()
該方法用于取消傳輸
confirmReceiveFile()
該方法用于確認(rèn)傳輸文件
參數(shù)flag用來表示是否同意傳輸
參數(shù)fileName用來表示保存的文件
參數(shù)off用來表示起始傳輸字節(jié)
getFileTransMessage()
該方法用于得到文件傳輸?shù)幕拘畔ⅰH纾何募l(fā)送的目標(biāo),端口號等。
getStatus()
該方法返回一個(gè)整型變量,表示當(dāng)前線程的傳輸狀態(tài)。
run()
線程的執(zhí)行方法,該方法中循環(huán)執(zhí)行發(fā)送或接收方法,完成文件的發(fā)送或接收。
setError()
該方法通過一個(gè)字符串型的參數(shù)設(shè)置錯(cuò)誤信息。
stopThread()
該方法用于停止線程的執(zhí)行。
doPackage()
打包方法,該方法中,根據(jù)線程所處的不同狀態(tài),對數(shù)據(jù)加入不同的包頭和其他信息,進(jìn)行打包。
readFromFile()
該方法從要發(fā)送的文件中讀取一個(gè)整型數(shù)。
readFromSocket()
該方法從Socket輸入流讀取一個(gè)整型數(shù),它有一個(gè)重載版本讀取一個(gè)字節(jié)數(shù)組的數(shù)據(jù)。
receiveFile()
該方法為接收文件的方法,是線程循環(huán)中,文件接收者執(zhí)行的方法。
sendFile()
該方法為發(fā)送文件方法,是線程循環(huán)中,文件發(fā)送者執(zhí)行的方法。
writeToFile()
該方法寫一個(gè)字節(jié)數(shù)據(jù)的數(shù)據(jù)到保存的文件中。
writeToSocket()
該方法寫數(shù)據(jù)到Socket輸出流中,它有三個(gè)重載版本,分別是寫入整型數(shù),寫入長整型數(shù)和寫入字節(jié)數(shù)組數(shù)據(jù)。
3.6.3 TransFilePanel類
這個(gè)類屬于視圖類,它作為主界面上的一個(gè)對象使用,含有進(jìn)度條,按鈕,標(biāo)簽的對象,用于顯示文件傳輸狀態(tài),每一個(gè)傳輸線程都擁有自己的TransFilePanel類對象。
成員變量:
fileName
fileName是一個(gè)字符串,表示傳輸文件的文件名。
fileSender
fileSender是boolean型對象,表示是文件發(fā)送者還是接收者。
isCanneled
isCanneled是boolean型對象,傳輸過程中,用戶點(diǎn)了取消按鈕后,該標(biāo)志位置true,TransFileManager會(huì)循環(huán)檢測isCanneled標(biāo)志,當(dāng)發(fā)現(xiàn)其為true后,它會(huì)關(guān)閉對應(yīng)的傳輸線程,而對方會(huì)檢測到傳輸錯(cuò)誤,文件傳輸就停止了。
isClosed
isClosed是boolean型對象,它表示當(dāng)傳輸過程已經(jīng)停止時(shí),用戶點(diǎn)擊了關(guān)閉按鈕,TransFileManager檢測到isClosed為true時(shí),會(huì)在列表中去掉對應(yīng)的傳輸線程和TransFilePanel。
isConfirm
isConfirm是boolean型對象,它表示文件接收者是否確認(rèn)了文件接收后(包括同意和拒絕),TransFileManager檢測到isConfirm為true時(shí),會(huì)將確認(rèn)狀態(tài)發(fā)給文件發(fā)送者。
jbtnCannel
jbtnCannel是取消按鈕。
jbtnOK
jbtnOK是確定按鈕。
jpgbFileTrans
jpgbFileTrans是文件傳輸?shù)倪M(jìn)度條。
jtaFileTransStatus
jtaFileTransStatus是一個(gè)文本框,用來顯示文件傳輸?shù)臓顟B(tài)。
transFileLength
transFileLength是一個(gè)長整型變量,用來表示已經(jīng)傳輸?shù)奈募L度。
status
status是一個(gè)整行變量,表示文件傳輸?shù)臓顟B(tài),所表示的狀態(tài)與SocketThread中的對應(yīng)。
界面截圖
3.7 算法介紹
3.7.1 TransFileManager的循環(huán)監(jiān)聽
TransFileManger類繼承了Thread類,實(shí)現(xiàn)多線程,避免循環(huán)監(jiān)聽時(shí)產(chǎn)生阻塞。
以下是在每次循環(huán)中做的工作
1、 得到傳輸線程(SocketThread)的數(shù)量和傳輸狀態(tài)顯示面板(TransFilePanel)的數(shù)量。
2、 從傳輸線程列表中依次取出一個(gè)傳輸線程。
3、 判斷當(dāng)前取出的線程是否有對應(yīng)的傳輸狀態(tài)顯示面板,如果有執(zhí)行5,如果沒有執(zhí)行4。
4、 增加傳輸狀態(tài)顯示面板,并且在主界面上增加選項(xiàng)卡。
5、 判斷傳輸線程的狀態(tài),根據(jù)不同的狀態(tài)做不同的處理。
6、 如果列表中的線程取完,執(zhí)行1,沒有取完執(zhí)行2。
程序流程圖:
3.7.2 斷點(diǎn)續(xù)傳
軟件支持?jǐn)帱c(diǎn)續(xù)傳的功能,該功能主要算法如下:
1、 當(dāng)文件傳輸中途停止時(shí),文件接收者程序?yàn)榻邮盏奈募?chuàng)建一個(gè)以該文件名+.tmp為文件名的臨時(shí)文件,臨時(shí)文件與該文件保存在同一個(gè)路徑下。臨時(shí)文件中保存文件以傳輸?shù)淖止?jié)數(shù)和文件的大小。
2、 當(dāng)文件接收者接收該文件時(shí),如果有對應(yīng)的臨時(shí)文件,程序會(huì)檢測到該文件的臨時(shí)文件,讀取以傳輸?shù)淖止?jié)數(shù)和文件大小,并且比較傳輸?shù)淖止?jié)數(shù)與未完成傳輸?shù)奈募笮∈欠裣嗟龋募笮『桶l(fā)送來的文件大小是否相等,如果都相等,執(zhí)行3,否則執(zhí)行4。
3、 將文件的輸出流設(shè)置到應(yīng)該繼續(xù)傳輸?shù)奈恢茫⑵鹗紓鬏斪止?jié)數(shù)發(fā)給發(fā)送者,執(zhí)行5。
4、 如果有未完成的傳輸文件,將其刪除,執(zhí)行5。
5、 進(jìn)行文件傳輸。
程序流程圖:
3.7.3 本地端口的多連接監(jiān)聽
Server類對象負(fù)責(zé)本地端口的監(jiān)聽,可以支持多了連接,具體數(shù)量由用戶設(shè)置。
1、 用用戶設(shè)置的端口創(chuàng)建監(jiān)聽,等待連接。
2、 當(dāng)有用戶連接上后,用該連接創(chuàng)建一個(gè)SocketThread傳輸線程,加入到線程列表。
3、 如果停止監(jiān)聽則退出,否則執(zhí)行1。
程序流程圖:
posted @ 2007-11-03 11:19 Rex Mao 閱讀(13605) | 評論 (5) | 編輯 收藏
posted @ 2007-07-21 10:32 Rex Mao 閱讀(306) | 評論 (0) | 編輯 收藏
字符收集器類是軟件的底層類,它與XML文件交互,讀取文件中的字符信息,經(jīng)過處理,形成標(biāo)簽,文本,屬性等數(shù)據(jù)為上層提供服務(wù)。
成員變量介紹:
aReader:Reader對象,輸入流為文件輸入流,它將XML文件的字符數(shù)據(jù)以流的形式提供給類。
成員方法介紹:
comparedArray(): 輸入:兩個(gè)int型數(shù)組,輸出:boolean型,返回兩個(gè)數(shù)組是否相同。用于比較兩個(gè)數(shù)組是否相同,在方法中,對兩個(gè)數(shù)組的數(shù)逐一比較。
hasMoreChars(): 輸入:無,輸出:boolean型,表示文件中是否還有字符,該方法用于確定文件中是否還有字符。
peek(): 輸入:int型數(shù)組。用于存儲(chǔ)窺探到的字符,輸出:無,該方法用于從文件中窺探數(shù)組長度的字符數(shù)據(jù)。窺探就是從文件中讀取數(shù)據(jù)后,將輸入流標(biāo)記回以前的位置,以免丟失數(shù)據(jù)。
算法簡述:
在aReader上標(biāo)記數(shù)組的長度
aReader.mark(buffer.length);
2、將數(shù)據(jù)依次讀入數(shù)組
for (int i = 0; i < buffer.length; i++) {
buffer[i] = aReader.read();
}
恢復(fù)aReader
aReader.reset();
peek(): 輸入:無,輸出:int型,是窺探到的字符,該方法從文件中窺探一個(gè)字符數(shù)據(jù)。
processCDATA(): 輸入:StringBuffer型,用于存放CDATA數(shù)據(jù),輸出:無,用于處理XML文件中的CDATA節(jié)點(diǎn)。得到的CDATA節(jié)點(diǎn)存放到StringBuffer對象中。
算法簡述:
預(yù)設(shè)兩個(gè)數(shù)組
int[] cdataHead = {'<', '!', '[', 'C', 'D', 'A', 'T', 'A', '['};
int[] cdataTail = {']', ']', '>'};
窺探cdataHead長度的字符存在數(shù)組buf中
peek(buf);
比較buf與cdataHead數(shù)組的內(nèi)容是否相同,如果不同返回falase,如果相同繼續(xù)執(zhí)行。
將aReader跳過cdataHead的長度,然后循環(huán)讀取直到窺探的字符數(shù)組與cdataTail相同,將中間的字符存放到StringBuffer對象中。
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(): 輸入:StringBuffer型,用于存放實(shí)體數(shù)據(jù),輸出:無,用語處理XML文件中的內(nèi)建實(shí)體類型。得到的實(shí)體存放到StringBuffer對象中。
readTag(): 輸入:無,輸出:String型,是讀到的標(biāo)簽,從XML文件中讀取并整理成一個(gè)標(biāo)簽數(shù)據(jù)存放在String對象中。
算法簡述:
窺探一個(gè)字符,如果不是’<’,拋出異常。否則繼續(xù)執(zhí)行。
int nextChar = peek();
if (nextChar != '<') {
throw new IOException("expect '<',but got '" + (char) nextChar +"'");
}
窺探一個(gè)字符aChar
int aChar = peek();
如果字符為’<’,進(jìn)行CDATA節(jié)點(diǎn)處理
if (aChar == '<') {
if (processCDATA(sb)) {
aChar = peek();
continue;
}
}
如果字符為’&’,進(jìn)行內(nèi)建實(shí)體處理
if (aChar == '&') {
if (processEntity(sb)) {
aChar = peek();
continue;
}
}
如果字符為’>’或文件結(jié)束,返回StringBuffer對象。
如果是其它字符,加入到StringBuffer對象中。
readText(): 輸入:無,輸出:String型,是讀到的文本內(nèi)容,從XML文件中讀取并整理成一個(gè)文本數(shù)據(jù)存放在Sting對象中。
skipOtherTag(): 輸入:無,輸出:無,跳過一個(gè)不處理的標(biāo)簽。
skipOtherTags(): 輸入:無,輸出:無,跳過多個(gè)不處理的標(biāo)簽。
skipWhitespace():輸入:無,輸出:無,跳過空格。
解析內(nèi)核類
該類用于解析XML文件,包含parser()方法,是該類的核心方法。
成員變量介紹:
aCharCollector:CharCollector類對象,負(fù)責(zé)字符收集。
currentNode: SimpleElement類對象,表示當(dāng)前處理的元素。
Elements: Stack類對象,用棧的存儲(chǔ)結(jié)構(gòu),表示元素之間的層次關(guān)系。
成員方法介紹:
Parser(): 輸入:無,輸出:SimpleDocument類對象,是返回的整個(gè)文檔樹型結(jié)構(gòu)。
算法簡述:
1、讀取一個(gè)標(biāo)簽
2、判斷是開始標(biāo)簽還是結(jié)束標(biāo)簽,如果是結(jié)束標(biāo)簽,轉(zhuǎn)入結(jié)束標(biāo)簽處理3
如果是開始標(biāo)簽,轉(zhuǎn)入開始標(biāo)簽處理6
3、得到標(biāo)簽的名稱,判斷是否與currentNode的名稱相同,如果相同,執(zhí)行
4,否則拋出異常
4、判斷是否還有標(biāo)簽,如果有繼續(xù)執(zhí)行5,否則退出。
5、從棧中彈出一個(gè)節(jié)點(diǎn)給currentNode,執(zhí)行1
6、得到標(biāo)簽的名稱,屬性,文本內(nèi)容,將標(biāo)簽加入到DOM樹中,并且壓棧。
執(zhí)行1
算法的程序流程圖
中間層管理類
中間層管理類用于控制和協(xié)調(diào)解析器與用戶界面。
成員變量介紹:
isParsered: boolean型,判斷是否已經(jīng)解析過了。
document: SimpleDocument型對象,表示整個(gè)XML文檔樹,也是解析器返回的。
parser: SimpleDOMParser型對象,表示解析器。
成員方法介紹:
getTreeRoot(): 輸入:無,輸出:DefaultMutableTreeNode型對象,是得到的樹的根節(jié)點(diǎn),用于得到樹的根節(jié)點(diǎn)。
parser(): 輸入:無,輸出:無,用于執(zhí)行解析操作。
setInputStream(): 輸入:InputStream型對象,是要設(shè)置的輸入流,輸出:無,用于設(shè)置解析源。
setXMLFile(): 輸入:File型對象,是要設(shè)置的XML文件,輸出:無,用于設(shè)置XML文件源。
getTreeNode(): 輸入:SimpleElement型對象,是要轉(zhuǎn)換的對象,輸出:DefaultMutableTreeNode型對象,是轉(zhuǎn)換后的對象,用
于轉(zhuǎn)換相應(yīng)元素為樹的節(jié)點(diǎn)對象。
posted @ 2007-05-31 11:32 Rex Mao 閱讀(1187) | 評論 (0) | 編輯 收藏