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

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

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

    Rex Mao

    分享java技術(shù)與生活

    2007年5月23日 #

    關(guān)于留言

    由于留言的提示郵件會被標(biāo)記為垃圾郵件, 所以很多留言我沒能發(fā)現(xiàn)并回復(fù)。
    如果有問題要討論,請大家直接發(fā)郵件到郵箱rex_mao@hotmail.com

    另外,如果需要源程序,可聯(lián)系購買,也可提供程序擴展開發(fā)。

    謝謝。

    posted @ 2008-05-24 01:04 Rex Mao| 編輯 收藏

    Oracle SQLPLUS 常用命令小結(jié)(一)


    1. 顯示當(dāng)前連接。

    SQL:
            SELECT *                                                                                                                                                 
            FROM V$SESSION                                                                                                                                 
            WHERE STATUS = 'INACTIVE'                                                                                                             
            AND USERNAME IS NOT NULL;                                                                                                         


    2. 強制關(guān)閉用戶的連接

    SQL:
        a) SELECT USERNAME, SID, SERIAL#                                                                                                   
            FROM V$SESSION                                                                                                                                 
            WHERE STATUS = 'INACTIVE'                                                                                                             
            AND USERNAME IS NOT NULL;                                                                                                         
                                                                                                                                                                              
        b) ALTER SYSTEM KILL SESSION 'SID, SERIAL#'; --SID 和 SERIAL#是在步驟a)中得到的結(jié)果。


    3. 從返回的結(jié)果中選擇第m到n條記錄

    SQL:
            SELECT *                                                                                                                                                   
            FROM (                                                                                                                                                      
                         SELECT A.*, ROWNUM RN                                                                                                       
                         FROM (                                                                                                                                         
                                       SELECT *                                                                                                                        
                                       FROM YOURTABLE --這里請用你的SELECT語句代替                                            
                                      ) A                                                                                                                                     
                         WHERE ROWNUM <= n                                                                                                              
                         )                                                                                                                                                      
            WHERE RN >= m;                                                                                                                                      
        
    4. 重新編譯包 (package) 和 包體 (package body)
        此命令可以用于查看在SQLPLUS中創(chuàng)建的package的編譯錯誤。

    SQL:
            a) 編譯 package
                ALTER PACKAGE YOUR_PACKAGE                                                                                                 
                COMPILE SPECIFICATION;                                                                                                                
            b) 編譯 package body

                ALTER PACKAGE YOUR_PACKAGE                                                                                                 
                COMPILE BODY;                                                                                                                                   

            c) 查看錯誤
                SHOW ERR;                                                                                                                                             

    5. 解除鎖定的用戶

    SQL:
    SQL:
        ALERT USER USERNAME UNLOCK;


     

    posted @ 2008-05-17 14:11 Rex Mao 閱讀(3118) | 評論 (2)編輯 收藏

    JAVA文件傳輸程序

    這個是我做的另一個畢業(yè)設(shè)計,使用的最基本的socket通信實現(xiàn)文件傳輸,使用該程序可同時給多個人發(fā)送不同的文件并支持?jǐn)帱c續(xù)傳。
    由于只為畢業(yè)設(shè)計而寫的,只實現(xiàn)了功能,沒有在速度上優(yōu)化,發(fā)上來只為給要做類似程序的朋友做個參考。以下是畢業(yè)論文中的節(jié)選。

    源代碼已經(jīng)上傳了。

    3章      設(shè)計文檔

    31       任務(wù)概述

           本項任務(wù)要開發(fā)一款P2P文件傳輸軟件,該軟件可以在局域網(wǎng)和互連上使用,具有文件傳輸,斷點續(xù)傳,多線程連接等功能。

    311      開發(fā)背景

           隨著網(wǎng)絡(luò)的普及,在網(wǎng)絡(luò)中交換信息,特別是文件成為使用網(wǎng)絡(luò)時經(jīng)常性工作,現(xiàn)有的文件傳輸工具如QQMSN等,主要功能是作為即時通訊工具使用,而且在局域網(wǎng)中使用時仍需連接到互連網(wǎng)。本文開發(fā)的軟件基于P2P結(jié)構(gòu)實現(xiàn)文件傳輸,不依靠服務(wù)器維護用戶資料,所以,只要兩臺機器可以連通,就可以進行文件傳輸。

    312       定義

           P2P:即peer-to-peer,可以理解為點對點,或?qū)Φ葌鬏數(shù)囊馑肌?/span>

    313       開發(fā)工具

           開發(fā)采用JAVA語言,開發(fā)工具為jbuilder 2005

    32       文件傳輸業(yè)務(wù)流程

    321       通訊順序關(guān)系

           在文件傳輸時,傳輸過程可以簡單的分為4步,如圖

    1、              由文件發(fā)送者發(fā)起文件傳輸,他首先發(fā)送文件名,文件大小,驗證消息等信息給文件接收者。

    2、              文件接收者收到文件信息和發(fā)送者信息,決定是否接收,如不接收,則發(fā)送拒絕接收消息給文件發(fā)送者,文件傳輸結(jié)束。如同意接收,發(fā)送同意接收消息和文件傳輸起始字節(jié)(用于斷點續(xù)傳)給發(fā)送者。

    3、              發(fā)送者開始發(fā)送文件數(shù)據(jù)包,直到最后一個文件數(shù)據(jù)包,發(fā)送者在最后一個文件數(shù)據(jù)包上加上標(biāo)記。

    4、              接收者識別最后一個文件數(shù)據(jù)包,文件傳輸成功。


    322       文件發(fā)送端的詳細業(yè)務(wù)流程


     

    圖中顯示了發(fā)送文件時的詳細業(yè)務(wù)流程。

    1、首先,要選擇要發(fā)送的文件,可以選擇一個文件或同一個文件夾下的多個文件發(fā)送,當(dāng)選擇多個文件時,軟件將為每個文件建立一個傳輸線程。選擇文件后,發(fā)送者要填寫目標(biāo)IP和端口,由于是基于P2P的文件傳輸,不存在服務(wù)器維護好友列表,所以需要知道目標(biāo)IP才能傳輸文件,用戶也可以填寫驗證消息用于描述自己的身份和文件的介紹。

    2、發(fā)送者收到確認(rèn)包,判斷是否接收文件,如果不接收,則傳輸結(jié)束,如果接收,則打開要發(fā)送的文件,設(shè)置起始傳輸字節(jié)。

    3、發(fā)送者讀取一個文件片段,加入是否是最后一個文件片段的標(biāo)志,打包發(fā)給接收者。

    4、發(fā)送完最后一個文件片段時,文件傳輸結(jié)束。

    323       文件接收者詳細業(yè)務(wù)流程


     

    1、 從一打開軟件開始,監(jiān)聽線程就會啟動,這時用戶就扮演者文件接收者的角色,當(dāng)有文件發(fā)送者發(fā)來請求時,監(jiān)聽線程建立與發(fā)送者的連接,并創(chuàng)建傳輸線程,接收者得到發(fā)送者傳來的文件信息和驗證消息,用戶還能得到發(fā)送者的IP地址,用戶根據(jù)這些信息決定是否接收文件,并發(fā)送確認(rèn)包給發(fā)送者,確認(rèn)包里包含了是否接收的標(biāo)志,和開始傳輸?shù)钠鹗甲止?jié)。

    2、 接收者開始接收數(shù)據(jù)包,解包,寫入文件中,直到最后一個文件片段,關(guān)閉文件,文件傳輸結(jié)束。

    33       軟件的傳輸協(xié)議設(shè)計

           為了更好的控制文件傳輸?shù)牧鞒蹋_發(fā)設(shè)計了文件傳輸協(xié)議,該協(xié)議屬于應(yīng)用層協(xié)議,為了不使傳輸過程過于復(fù)雜,協(xié)議盡量簡單設(shè)計。主要的內(nèi)容是傳輸包的格式。

    331       傳輸包的格式


     

    其中傳輸包的類型有3種:

    PACKAGE_TYPE_FILENAME = 0x01

    文件名包,該包用于文件發(fā)送者向接收者發(fā)送文件信息和驗證消息

    PACKAGE_TYPE_CONTEXT = 0x02

    文件內(nèi)容包,該包用于傳輸文件內(nèi)容

    PACKAGE_TYPE_CONFIRMRECEIVE = 0x03

    文件傳輸確認(rèn)包,該包用于文件接收者向發(fā)送者確認(rèn)文件的接收

    332       文件名包格式


     

    333      文件傳輸包格式

     

    其中MORE_DATA用于確認(rèn)是否是文件片段的最后一個包,以結(jié)束文件的傳輸。0表示沒有數(shù)據(jù),1表示還有數(shù)據(jù)。

    3. 34      文件接受確認(rèn)包格式


     

    其中CONFIRM_FLAG表示是否確認(rèn)文件接收,1表示接收,0表示不接收,當(dāng)接收時,OFF表示文件傳輸?shù)钠鹗甲止?jié),用來實現(xiàn)斷點續(xù)傳。

    3.4       文件傳輸?shù)臓顟B(tài)機

    文件傳輸線程的地層其實就是一個狀態(tài)轉(zhuǎn)換機,線程具有幾個狀態(tài),線程從文件名傳輸狀態(tài)開始,根據(jù)文件傳輸?shù)牟煌闆r,在各個狀態(tài)間轉(zhuǎn)換,直到傳輸成功或傳輸失敗。

    FILE_TRANS_STATUS_FILENAME = 0x01

    文件名稱傳輸狀態(tài),文件傳輸剛建立連接時,傳輸狀態(tài)處于文件名傳輸狀態(tài)

    FILE_TRANS_STATUS_CONTEXT = 0x02

    文件內(nèi)容傳輸轉(zhuǎn)臺,在傳輸文件內(nèi)容時,傳輸狀態(tài)屬于該狀態(tài)

    FILE_TRANS_STATUS_WAITFORCONFIRM = 0x03

    等待確認(rèn)狀態(tài),文件發(fā)送者,發(fā)送完文件信息和驗證消息后,處于該狀態(tài),文件接收者接收到文件信息和驗證消息后處于該狀態(tài)

    FILE_TRANS_STATUS_SUCCESS = 0x04

    文件傳輸成功狀態(tài),表示文件已成功傳輸完畢

    FILE_TRANS_STATUS_FAIL = 0x05

    文件傳輸失敗狀態(tài),表示文件傳輸已經(jīng)失敗,失敗原因可能是對方取消了文件傳輸或網(wǎng)絡(luò)錯誤




     

    3.5        結(jié)構(gòu)設(shè)計

    軟件主要由MainFrame,TransFileManager,SocketThread,Server,TransFilePanel五個類構(gòu)成圖 表示了這幾個類之間的關(guān)系。


     

    類功能介紹

    MainFrame

    MainFrame類是軟件的主界面類,負責(zé)與用戶的交互。

    TransFileManager

    TransFileManager類是文件傳輸?shù)目刂祁悾撠?zé)管理文件的傳輸,它維護一個傳輸線程(SocketThread)的列表,每個線程都表示一個正在傳輸?shù)娜蝿?wù)。TransFileManager類定時的掃描各個線程的狀態(tài),根據(jù)不同狀態(tài)做出不同處理,如計算傳輸速度,顯示傳輸進度等。

    SocketThread

    SocketThread類是文件傳輸線程類,它負責(zé)底層的具體傳輸工作,包括打包與解包,并且轉(zhuǎn)換自己的狀態(tài),完成文件的傳輸。

    Server

    Server類是為TransFileManager類使用的,它負責(zé)本地端口的監(jiān)聽,一旦有用戶連接,TransFileManager就創(chuàng)建一個傳輸線程,放入線程列表。而它繼續(xù)監(jiān)聽端口。

    TransFilePanel

    TransFilePanel是一個面板,它用有按鈕、進度條,標(biāo)簽等用來顯示文件的傳輸狀態(tài)。

    3.6        類設(shè)計

    361       MainFrame

    該類是視圖類,是軟件的主界面。

     

    成員變量:

    contentPane

    contentPaneJPanel類的對象,是主界面的面板。

    jbtnSend

    jbtnSendJButton類對象,點擊它將打開文件傳輸對話框。

    jbtnSetting

    jbtnSettingJButton類對象,點擊它將打開設(shè)置對話框。

    jlblIP

    jlblIPJLable類對象,它顯示本機的IP地址,方便文件的傳輸。

    jtpTransFile

    jtpTransFileJTabbedPane類對象,是選項卡控件,用于顯示多個文件同時傳輸。

    tfm

    tfmTransFileManager類對象,負責(zé)控制文件的傳輸。

    成員方法:

    jbtnSend_anctionPerformed()

    該方法為jbtnSend按鈕的點擊事件

    jbtnSetting_actionPerformed()

    該方法為jbtnSetting按鈕的點擊事件

    This_windowClosed()

    該方法為窗口關(guān)閉事件

    界面截圖:


     

    362       TransFileManager

    該類負責(zé)傳輸過程中對各個傳輸線程的檢測與控制。


     

    成員變量:

    jtp

    jtp是選項卡控件對象,是MainFrame類中jtpTransFile對象的一個引用。

    panelist

    paneListArrayList類對象,它是一個鏈表結(jié)構(gòu),存儲使用的選項卡。

    running

    running是一個boolean型的對象,用來表示線程是否在執(zhí)行。

    s

    sServer類的對象,用來堅聽本地端口,等待用戶的連接。

    threadList

    threadListArrayList類對象,它是一個鏈表結(jié)構(gòu),存儲使用的傳輸線程。

    maxThreadNum

    maxTreadNum是整型變量,表示最大允許的線程數(shù)。

    port

    port是整型變量,表示使用的端口號。

    成員方法:

    close()

    該方法用于關(guān)閉文件傳輸?shù)目刂啤?/span>

    sendFile()

    該方法用于建立一個文件發(fā)送,要求輸入?yún)?shù)為,目標(biāo)IP,端口號,要發(fā)送的文件和驗證消息。

    3.6.3           SocketThread

    SocketThread類是文件傳輸?shù)牡讓又С诸悾峁┪募鬏數(shù)姆?wù)。


     

    成員變量:

    sendBuf

    sendBuf是一個字節(jié)型數(shù)據(jù),它是文件發(fā)送和接收時的緩沖區(qū)。

    dis

    disDataInputStream型對象,它是由Socket對象得到的輸入流。

    dos

    dosDataOutputStream型對象,它是由Socket對象得到的輸出流。

    fDis

    fDisDataInputStream型對象,它是要發(fā)送的文件的輸入流。

    raf

    rafRandomAccessFile型對象,該對象允許設(shè)置輸出流的位置,以支持?jǐn)帱c續(xù)傳。

    running

    running是一個boolean型對象,用來表示線程是否在執(zhí)行。

    serverName

    serverName是字符串型對象,表示服務(wù)器的地址,該對象只有在線程作為發(fā)送者時使用。

    errorMessage

    errorMessage是字符串型對象,表示出錯的信息。

    fileName

    fileName是字符串型對象,表示文件名。

    fileSender

    fileSender是一個boolean型對象,表示是文件發(fā)送者還是文件接收者。

    IP

    IP是字符串型對象,用來存放目的機的IP地址。

    message

    message是字符串型對象,用來表示驗證信息。

    port

    port是整型變量,表示連接的端口號。

    transFileLength

    transFileLength是長整型變量,表示已經(jīng)傳輸?shù)奈募L度,TransFileManager可以用它來計算傳輸進度和傳輸速度

    成員方法:

    cancelTrans()

    該方法用于取消傳輸

    confirmReceiveFile()

    該方法用于確認(rèn)傳輸文件

    參數(shù)flag用來表示是否同意傳輸

    參數(shù)fileName用來表示保存的文件

    參數(shù)off用來表示起始傳輸字節(jié)

    getFileTransMessage()

    該方法用于得到文件傳輸?shù)幕拘畔ⅰH纾何募l(fā)送的目標(biāo),端口號等。

    getStatus()

    該方法返回一個整型變量,表示當(dāng)前線程的傳輸狀態(tài)。

    run()

    線程的執(zhí)行方法,該方法中循環(huán)執(zhí)行發(fā)送或接收方法,完成文件的發(fā)送或接收。

    setError()

    該方法通過一個字符串型的參數(shù)設(shè)置錯誤信息。

    stopThread()

    該方法用于停止線程的執(zhí)行。

    doPackage()

    打包方法,該方法中,根據(jù)線程所處的不同狀態(tài),對數(shù)據(jù)加入不同的包頭和其他信息,進行打包。

    readFromFile()

    該方法從要發(fā)送的文件中讀取一個整型數(shù)。

    readFromSocket()

    該方法從Socket輸入流讀取一個整型數(shù),它有一個重載版本讀取一個字節(jié)數(shù)組的數(shù)據(jù)。

    receiveFile()

    該方法為接收文件的方法,是線程循環(huán)中,文件接收者執(zhí)行的方法。

    sendFile()

    該方法為發(fā)送文件方法,是線程循環(huán)中,文件發(fā)送者執(zhí)行的方法。

    writeToFile()

    該方法寫一個字節(jié)數(shù)據(jù)的數(shù)據(jù)到保存的文件中。

    writeToSocket()

    該方法寫數(shù)據(jù)到Socket輸出流中,它有三個重載版本,分別是寫入整型數(shù),寫入長整型數(shù)和寫入字節(jié)數(shù)組數(shù)據(jù)。

    3.6.3            TransFilePanel

    這個類屬于視圖類,它作為主界面上的一個對象使用,含有進度條,按鈕,標(biāo)簽的對象,用于顯示文件傳輸狀態(tài),每一個傳輸線程都擁有自己的TransFilePanel類對象。


     

    成員變量:

    fileName

    fileName是一個字符串,表示傳輸文件的文件名。

    fileSender

    fileSenderboolean型對象,表示是文件發(fā)送者還是接收者。

    isCanneled

    isCanneledboolean型對象,傳輸過程中,用戶點了取消按鈕后,該標(biāo)志位置trueTransFileManager會循環(huán)檢測isCanneled標(biāo)志,當(dāng)發(fā)現(xiàn)其為true后,它會關(guān)閉對應(yīng)的傳輸線程,而對方會檢測到傳輸錯誤,文件傳輸就停止了。

    isClosed

    isClosedboolean型對象,它表示當(dāng)傳輸過程已經(jīng)停止時,用戶點擊了關(guān)閉按鈕,TransFileManager檢測到isClosedtrue時,會在列表中去掉對應(yīng)的傳輸線程和TransFilePanel

    isConfirm

    isConfirmboolean型對象,它表示文件接收者是否確認(rèn)了文件接收后(包括同意和拒絕),TransFileManager檢測到isConfirmtrue時,會將確認(rèn)狀態(tài)發(fā)給文件發(fā)送者。

    jbtnCannel

    jbtnCannel是取消按鈕。

    jbtnOK

    jbtnOK是確定按鈕。

    jpgbFileTrans

    jpgbFileTrans是文件傳輸?shù)倪M度條。

    jtaFileTransStatus

    jtaFileTransStatus是一個文本框,用來顯示文件傳輸?shù)臓顟B(tài)。

    transFileLength

    transFileLength是一個長整型變量,用來表示已經(jīng)傳輸?shù)奈募L度。

    status

    status是一個整行變量,表示文件傳輸?shù)臓顟B(tài),所表示的狀態(tài)與SocketThread中的對應(yīng)。

    界面截圖


     

    3.7              算法介紹

    371 TransFileManager的循環(huán)監(jiān)聽

    TransFileManger類繼承了Thread類,實現(xiàn)多線程,避免循環(huán)監(jiān)聽時產(chǎn)生阻塞。

    以下是在每次循環(huán)中做的工作

    1、 得到傳輸線程(SocketThread)的數(shù)量和傳輸狀態(tài)顯示面板(TransFilePanel)的數(shù)量。

    2、 從傳輸線程列表中依次取出一個傳輸線程。

    3、 判斷當(dāng)前取出的線程是否有對應(yīng)的傳輸狀態(tài)顯示面板,如果有執(zhí)行5,如果沒有執(zhí)行4

    4、 增加傳輸狀態(tài)顯示面板,并且在主界面上增加選項卡。

    5、 判斷傳輸線程的狀態(tài),根據(jù)不同的狀態(tài)做不同的處理。

    6、 如果列表中的線程取完,執(zhí)行1,沒有取完執(zhí)行2

    程序流程圖:



     

    372 斷點續(xù)傳

    軟件支持?jǐn)帱c續(xù)傳的功能,該功能主要算法如下:

    1、 當(dāng)文件傳輸中途停止時,文件接收者程序為接收的文件創(chuàng)建一個以該文件名+.tmp為文件名的臨時文件,臨時文件與該文件保存在同一個路徑下。臨時文件中保存文件以傳輸?shù)淖止?jié)數(shù)和文件的大小。

    2、 當(dāng)文件接收者接收該文件時,如果有對應(yīng)的臨時文件,程序會檢測到該文件的臨時文件,讀取以傳輸?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、 進行文件傳輸。

    程序流程圖:




     

    3.7.3            本地端口的多連接監(jiān)聽

    Server類對象負責(zé)本地端口的監(jiān)聽,可以支持多了連接,具體數(shù)量由用戶設(shè)置。

    1、  用用戶設(shè)置的端口創(chuàng)建監(jiān)聽,等待連接。

    2、  當(dāng)有用戶連接上后,用該連接創(chuàng)建一個SocketThread傳輸線程,加入到線程列表。

    3、  如果停止監(jiān)聽則退出,否則執(zhí)行1

    程序流程圖:

    posted @ 2007-11-03 11:19 Rex Mao 閱讀(13598) | 評論 (5)編輯 收藏

    準(zhǔn)備開工


          經(jīng)過畢業(yè)后的休息,來到上海已經(jīng)快一個星期了,總體感覺一般,城市沒有傳說中那么現(xiàn)代,路上一樣有小廣告,一樣有人不走人行橫道,一樣有破破的樓房,地鐵站外一樣有黑車?yán)汀W蛱烊チ送鉃趴吹綆滋幐邩牵贿^怎么看也沒有電視上放的那樣有氣勢。南京路上老外還是比較多(老外的眼神很迷茫)。
          周一就要工作了,又要回到與代碼為伴的生活了,用鍵盤敲出以后美好的生活吧。
                                                                                                                                                         

    posted @ 2007-07-21 10:32 Rex Mao 閱讀(303) | 評論 (0)編輯 收藏

    XML的DOM解析器的java實現(xiàn)(三) 類設(shè)計

     
    類設(shè)計

        軟件中起關(guān)鍵作用的類為CharCollector字符收集器類、SimpleDOMParser解析內(nèi)核類和Manager中間層控制類。

    字符收集器類

    字符收集器類是軟件的底層類,它與XML文件交互,讀取文件中的字符信息,經(jīng)過處理,形成標(biāo)簽,文本,屬性等數(shù)據(jù)為上層提供服務(wù)。

     

    成員變量介紹:

    aReader:Reader對象,輸入流為文件輸入流,它將XML文件的字符數(shù)據(jù)以流的形式提供給類。

    成員方法介紹:

    comparedArray(): 輸入:兩個int型數(shù)組,輸出:boolean型,返回兩個數(shù)組是否相同。用于比較兩個數(shù)組是否相同,在方法中,對兩個數(shù)組的數(shù)逐一比較。

    hasMoreChars(): 輸入:無,輸出:boolean型,表示文件中是否還有字符,該方法用于確定文件中是否還有字符。

    peek():          輸入:int型數(shù)組。用于存儲窺探到的字符,輸出:無,該方法用于從文件中窺探數(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型,是窺探到的字符,該方法從文件中窺探一個字符數(shù)據(jù)。

    processCDATA(): 輸入:StringBuffer型,用于存放CDATA數(shù)據(jù),輸出:無,用于處理XML文件中的CDATA節(jié)點。得到的CDATA節(jié)點存放到StringBuffer對象中。

        算法簡述:

    預(yù)設(shè)兩個數(shù)組

    int[] cdataHead = {'<', '!', '[', 'C', 'D', 'A', 'T', 'A', '['};

    int[] cdataTail = {']', ']', '>'};

    窺探cdataHead長度的字符存在數(shù)組buf

    peek(buf);

    比較bufcdataHead數(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ù)據(jù),輸出:無,用語處理XML文件中的內(nèi)建實體類型。得到的實體存放到StringBuffer對象中。

    readTag(): 輸入:無,輸出:String型,是讀到的標(biāo)簽,從XML文件中讀取并整理成一個標(biāo)簽數(shù)據(jù)存放在String對象中。

        算法簡述:

    窺探一個字符,如果不是’<’,拋出異常。否則繼續(xù)執(zhí)行。

    int nextChar = peek();

    if (nextChar != '<') {

       throw new IOException("expect '<',but got '" + (char) nextChar +"'");

    }

    窺探一個字符aChar

    int aChar = peek();

    如果字符為’<’,進行CDATA節(jié)點處理

    if (aChar == '<') {

                    if (processCDATA(sb)) {

                        aChar = peek();

                        continue;

                    }

    }

     如果字符為’&’,進行內(nèi)建實體處理

    if (aChar == '&') {

                    if (processEntity(sb)) {

                        aChar = peek();

                        continue;

                    }

    }

     如果字符為’>’或文件結(jié)束,返回StringBuffer對象。

         如果是其它字符,加入到StringBuffer對象中。

    readText():   輸入:無,輸出:String型,是讀到的文本內(nèi)容,從XML文件中讀取并整理成一個文本數(shù)據(jù)存放在Sting對象中。

    skipOtherTag():   輸入:無,輸出:無,跳過一個不處理的標(biāo)簽。

    skipOtherTags(): 輸入:無,輸出:無,跳過多個不處理的標(biāo)簽。

    skipWhitespace():輸入:無,輸出:無,跳過空格。

    解析內(nèi)核類

        該類用于解析XML文件,包含parser()方法,是該類的核心方法。

     

    成員變量介紹:

    aCharCollector:CharCollector類對象,負責(zé)字符收集。

    currentNode: SimpleElement類對象,表示當(dāng)前處理的元素。

    Elements:     Stack類對象,用棧的存儲結(jié)構(gòu),表示元素之間的層次關(guān)系。

    成員方法介紹:

    Parser():     輸入:無,輸出:SimpleDocument類對象,是返回的整個文檔樹型結(jié)構(gòu)。

                   算法簡述:

    1、讀取一個標(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、從棧中彈出一個節(jié)點給currentNode,執(zhí)行1

    6、得到標(biāo)簽的名稱,屬性,文本內(nèi)容,將標(biāo)簽加入到DOM樹中,并且壓棧。

    執(zhí)行1

    算法的程序流程圖



    中間層管理類

    中間層管理類用于控制和協(xié)調(diào)解析器與用戶界面。

     

    成員變量介紹:

    isParsered: boolean型,判斷是否已經(jīng)解析過了。

    document: SimpleDocument型對象,表示整個XML文檔樹,也是解析器返回的。

    parser:       SimpleDOMParser型對象,表示解析器。

    成員方法介紹:

    getTreeRoot(): 輸入:無,輸出:DefaultMutableTreeNode型對象,是得到的樹的根節(jié)點,用于得到樹的根節(jié)點。

    parser():    輸入:無,輸出:無,用于執(zhí)行解析操作。

    setInputStream(): 輸入:InputStream型對象,是要設(shè)置的輸入流,輸出:無,用于設(shè)置解析源。

    setXMLFile()     輸入:File型對象,是要設(shè)置的XML文件,輸出:無,用于設(shè)置XML文件源。

    getTreeNode():     輸入:SimpleElement型對象,是要轉(zhuǎn)換的對象,輸出:DefaultMutableTreeNode型對象,是轉(zhuǎn)換后的對象,用

    于轉(zhuǎn)換相應(yīng)元素為樹的節(jié)點對象。

     

    posted @ 2007-05-31 11:32 Rex Mao 閱讀(1185) | 評論 (0)編輯 收藏

    XML的DOM解析器的java實現(xiàn)(二) 程序結(jié)構(gòu)設(shè)計

     

    結(jié)構(gòu)設(shè)計

    各個類的功能介紹

    NodeElementDocumentAttrW3CDOM規(guī)范要求實現(xiàn)的接口。還有其它接口未列出。

    SimpleNode 繼承Node接口,實現(xiàn)Node接口的基本功能。

     

    SimpleElement繼承NodeElement接口,對應(yīng)DOM樹中的標(biāo)準(zhǔn)節(jié)點,也就是XML文件中的一個標(biāo)簽。

     

    SimpleDocument 繼承NodeDocument接口,對應(yīng)整個DOM樹,它是解析器解析完成后,返回的對象。用戶可以使用該對象訪問整個DOM樹。

     

    SimpleAttr 繼承NodeAttr接口,對應(yīng)DOM樹中的屬性節(jié)點,用于存放屬性名稱和屬性值。

     

    CharCollector 字符收集器類,它直接與XML文件接觸,根據(jù)需要向調(diào)用者提供下一個標(biāo)簽或文本等數(shù)據(jù)。

     

    SimpleDOMParser 解析器的核心類,它使用CharCollector類,得到標(biāo)簽、文本等數(shù)據(jù)。使用SimpleElementSimpleAttr等類存放數(shù)據(jù),生成SimpleDocumnet對象返回給調(diào)用者。

     

    MainFrame 用戶界面類,它將解析結(jié)果展示給用戶,并且根據(jù)用戶的操作,與用戶進行交互。

     

    Manager 中間層管理類,它協(xié)調(diào)用戶界面(MainFrame)與解析器內(nèi)核(SimpleDOMParser)之間的關(guān)系,實現(xiàn)解析器的控制。

     

    內(nèi)部接口設(shè)計

    類名稱

    調(diào)用類

    調(diào)用功能

    SimpleDOMParser

    SimpleElement

    節(jié)點的存儲,查找,刪除。

    SimpleDOMParser

    SimpleAttr

    屬性節(jié)點的存儲,查找,刪除。

    SimpleDOMParser

    SimpleDocument

    生成DOM

    SimpleDomParser

    CharCollector

    字符收集,得到標(biāo)簽與文本等。

    Manager

    SimpleDOMParser

    解析XML文檔

    Manager

    MainFrame

    用戶界面的相關(guān)操作

     

    用例關(guān)系設(shè)計

    用例介紹

    用戶:          參與者, 即軟件的使用者。

    XML文件:       參與者,XML文件。

    鏈接的文件:    參與者,XML文件中鏈接的外部文件。

    選擇XML文件: 用戶通過文件選擇框選擇一個本地的XML文件。

    選擇URL地址: 用戶輸入一個有效的URL,指向網(wǎng)絡(luò)上的XML格式的網(wǎng)頁。

    解析XML文件: 用戶確定對XML文件進行解析,該項操作要發(fā)生在選擇XML文件或選擇URL地址之后。

    修改文件:        用戶對XML文件進行修改

    保存文件:        用戶通過文件選擇框,選擇位置保存XML文件。

    選擇DOM樹節(jié)點:用戶選擇解析后的DOM樹型結(jié)構(gòu)上的節(jié)點。

    解析器解析:     解析器對XML進行解析

    收集字符:        字符收集器負責(zé)處理XML的字符數(shù)據(jù)

    界面展示:        通過樹型結(jié)構(gòu)和圖表向用戶展示數(shù)據(jù)。

     

    字符收集器有限狀態(tài)機

    DFA M={S,Ts,Tp,Tq,Cp,Ep,Er,Q},{LT,RT,A,C,EC,,EOF,NL,NLRA},f,S,{Q}

     

    其中 字符集:

    LT={<}

    RT={/>}

    A={&amp,&lt,&gt,&apos,&qout}

    C={<!CDATA[[}

    EC={]]>}

    EOF代表文件結(jié)束

    NL代表不是<的字符

    NLRA 代表除去LT,RT,LTL,A,C的所有字符

     

    狀態(tài):

    S 開始狀態(tài)

    Ts:標(biāo)簽處理開始狀態(tài)

    Tp:標(biāo)簽處理狀態(tài)

    Tq:標(biāo)簽處理結(jié)束狀態(tài)

    CpCDATA節(jié)點處理狀態(tài)

    Ep:內(nèi)建實體處理狀態(tài)

    Er:錯誤狀態(tài)

    Q:結(jié)束狀態(tài)

     

    狀態(tài)轉(zhuǎn)換函數(shù):

     

    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

     

    posted @ 2007-05-27 13:10 Rex Mao 閱讀(1429) | 評論 (1)編輯 收藏

    java中怎樣把圖片存放在代碼中

     

    有時候不想把圖片資源放在目錄里,讓用戶看到,我用的方法是將圖片的像素矩陣存在代碼里。可能比較笨,具體做法是:

    MediaTracker mt = new MediaTracker(aFrame); //媒體跟蹤器

    Image img = Toolkit.getDefaultToolkit().createImage("畫刷.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] + ","); //打印

       }

     

    再在代碼中創(chuàng)建靜態(tài)對象

    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

     };//打印出來的矩陣

    private static MemoryImageSource misPen = new MemoryImageSource(16, 16,

          penPixels, 0, 16);

    public static Image imgPen = Toolkit.getDefaultToolkit().createImage(misPen);

    這樣就可以直接使用imgPen圖片了。

    posted @ 2007-05-26 10:15 Rex Mao 閱讀(1446) | 評論 (2)編輯 收藏

    xml的DOM解析器的java實現(xiàn) (一) DOM規(guī)范簡介

     

    這是我的畢業(yè)設(shè)計,本來以為挺簡單的,做了以后發(fā)現(xiàn)還是能學(xué)到點知識,發(fā)來給大家一起學(xué)習(xí)。

    DOM規(guī)范定義了一組接口,用戶通過這些接口來訪問DOM解析器返回的樹型結(jié)構(gòu)。DOM不同于SAX的事件驅(qū)動模式,它是將整個文檔解析完成后,形成一個樹型結(jié)構(gòu)放在內(nèi)存中。下面是DOM規(guī)范中的所有接口,灰色顯示的是本解析器實現(xiàn)的接口。

     

    DOMImplementation

    DOMImplementation接口允許代碼訪問DOM的具體實現(xiàn),以找出對各種特性的有效支持。其中的hasFeature(String feature, String version)方法可以測試具體的DOM實現(xiàn)是否支持某特性。

     

    NodeList

    NodeList對象是Node對象的一個簡單的有序集合。例如,可以用來存放一個節(jié)點的子節(jié)點。

     

    Node

    Node對象是DOM中所有節(jié)點的基對象。ElementAttrTextCDATASectionEntityReferenceEntityProcessingInstructionCommentDocumentDocumentTypeDocumentFragmentNotation對象都派生于Node對象。

     

    NamedNodeMap

    NamedNodeMap對象是可以通過猛成訪問的Node對象集合。可以用來存放節(jié)點的屬性。

     

    DOMException

    異常接口

     

    DocumentFragment

    DocumentFragment對象是文檔片段,是文檔(Document)對象的一個簡單的版本。它可以用來表示文檔的任意子樹。

     

    Document

    Document對象是能在DOM示例的主要對象。它代表整個的xml文檔,也是解析器返回的對象。

     

    Element

    Element對象包含文檔中的元素的信息。代表一個標(biāo)簽。

     

    Attr

    Attr是屬性對象,一個節(jié)點的屬性存在NamedNodeMap里。

     

    CharacterData

    CharacterData對象表示xml文件中的字符信息。

     

    DocumentType

    DocumentType對象表示文檔類型,也就是DTD聲明里的內(nèi)容。

     

    Notation

    Notation對象表示DTD聲明中的關(guān)于表示法的信息。

     

    Entity

    Entity對象包含DTD中有關(guān)實體的信息。

     

    EntityReference

    EntityReference對象包含對已解析文檔中的實體的引用信息。

     

    ProcessingInstruction

    ProcessingInstruction對象包含文檔中內(nèi)嵌的處理指令的信息。

     

    Text

    Text對象表示節(jié)點的文本數(shù)據(jù)。

     

    Comment

    Comment對象表示注釋。

     

    CDATASection

    CDATASection對象包含文本中未被解析塊的內(nèi)容。

    posted @ 2007-05-23 09:13 Rex Mao 閱讀(1087) | 評論 (1)編輯 收藏

    主站蜘蛛池模板: 亚洲综合国产精品第一页| 伊人久久国产免费观看视频| 亚洲视频一区二区| 免费观看黄网站在线播放| 日本三级在线观看免费| 羞羞视频免费网站入口| 亚洲校园春色另类激情| 亚洲av日韩综合一区在线观看| yy6080久久亚洲精品| 成人性生免费视频| 亚洲一区免费在线观看| 日本免费人成网ww555在线| 国产精品永久免费视频| 亚洲av色香蕉一区二区三区| 亚洲免费二区三区| 亚洲精品国产专区91在线| 国产成A人亚洲精V品无码| 精品国产香蕉伊思人在线在线亚洲一区二区 | 国产不卡免费视频| 成年女人毛片免费视频| 亚洲免费视频播放| 一级毛片免费观看| 久草免费福利视频| 免费的全黄一级录像带| 中文字幕在线免费看线人| 一区二区三区免费在线观看| 理论片在线观看免费| 国产成人亚洲精品蜜芽影院| 亚洲狠狠婷婷综合久久蜜芽| 亚洲色偷偷色噜噜狠狠99| 亚洲色一区二区三区四区| 亚洲自偷自偷在线成人网站传媒| 亚洲国产日韩在线一区| 亚洲狠狠狠一区二区三区| 亚洲天堂电影在线观看| 亚洲一级毛片免观看| 亚洲www在线观看| 亚洲人成人网站18禁| 亚洲国产精品成人AV在线| 亚洲妇女无套内射精| 老湿机一区午夜精品免费福利|