Rex Mao

          分享java技術與生活

          2008年5月24日 #

          關于留言

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

          另外,如果需要源程序,可聯系購買,也可提供程序擴展開發。

          謝謝。

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

          2008年5月17日 #

          Oracle SQLPLUS 常用命令小結(一)


          1. 顯示當前連接。

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


          2. 強制關閉用戶的連接

          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)中得到的結果。


          3. 從返回的結果中選擇第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中創建的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 閱讀(3116) | 評論 (2)編輯 收藏

          2007年11月3日 #

          JAVA文件傳輸程序

          這個是我做的另一個畢業設計,使用的最基本的socket通信實現文件傳輸,使用該程序可同時給多個人發送不同的文件并支持斷點續傳。
          由于只為畢業設計而寫的,只實現了功能,沒有在速度上優化,發上來只為給要做類似程序的朋友做個參考。以下是畢業論文中的節選。

          源代碼已經上傳了。

          3章      設計文檔

          31       任務概述

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

          311      開發背景

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

          312       定義

                 P2P:即peer-to-peer,可以理解為點對點,或對等傳輸的意思。

          313       開發工具

                 開發采用JAVA語言,開發工具為jbuilder 2005

          32       文件傳輸業務流程

          321       通訊順序關系

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

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

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

          3、              發送者開始發送文件數據包,直到最后一個文件數據包,發送者在最后一個文件數據包上加上標記。

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


          322       文件發送端的詳細業務流程


           

          圖中顯示了發送文件時的詳細業務流程。

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

          2、發送者收到確認包,判斷是否接收文件,如果不接收,則傳輸結束,如果接收,則打開要發送的文件,設置起始傳輸字節。

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

          4、發送完最后一個文件片段時,文件傳輸結束。

          323       文件接收者詳細業務流程


           

          1、 從一打開軟件開始,監聽線程就會啟動,這時用戶就扮演者文件接收者的角色,當有文件發送者發來請求時,監聽線程建立與發送者的連接,并創建傳輸線程,接收者得到發送者傳來的文件信息和驗證消息,用戶還能得到發送者的IP地址,用戶根據這些信息決定是否接收文件,并發送確認包給發送者,確認包里包含了是否接收的標志,和開始傳輸的起始字節。

          2、 接收者開始接收數據包,解包,寫入文件中,直到最后一個文件片段,關閉文件,文件傳輸結束。

          33       軟件的傳輸協議設計

                 為了更好的控制文件傳輸的流程,開發設計了文件傳輸協議,該協議屬于應用層協議,為了不使傳輸過程過于復雜,協議盡量簡單設計。主要的內容是傳輸包的格式。

          331       傳輸包的格式


           

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

          PACKAGE_TYPE_FILENAME = 0x01

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

          PACKAGE_TYPE_CONTEXT = 0x02

          文件內容包,該包用于傳輸文件內容

          PACKAGE_TYPE_CONFIRMRECEIVE = 0x03

          文件傳輸確認包,該包用于文件接收者向發送者確認文件的接收

          332       文件名包格式


           

          333      文件傳輸包格式

           

          其中MORE_DATA用于確認是否是文件片段的最后一個包,以結束文件的傳輸。0表示沒有數據,1表示還有數據。

          3. 34      文件接受確認包格式


           

          其中CONFIRM_FLAG表示是否確認文件接收,1表示接收,0表示不接收,當接收時,OFF表示文件傳輸的起始字節,用來實現斷點續傳。

          3.4       文件傳輸的狀態機

          文件傳輸線程的地層其實就是一個狀態轉換機,線程具有幾個狀態,線程從文件名傳輸狀態開始,根據文件傳輸的不同情況,在各個狀態間轉換,直到傳輸成功或傳輸失敗。

          FILE_TRANS_STATUS_FILENAME = 0x01

          文件名稱傳輸狀態,文件傳輸剛建立連接時,傳輸狀態處于文件名傳輸狀態

          FILE_TRANS_STATUS_CONTEXT = 0x02

          文件內容傳輸轉臺,在傳輸文件內容時,傳輸狀態屬于該狀態

          FILE_TRANS_STATUS_WAITFORCONFIRM = 0x03

          等待確認狀態,文件發送者,發送完文件信息和驗證消息后,處于該狀態,文件接收者接收到文件信息和驗證消息后處于該狀態

          FILE_TRANS_STATUS_SUCCESS = 0x04

          文件傳輸成功狀態,表示文件已成功傳輸完畢

          FILE_TRANS_STATUS_FAIL = 0x05

          文件傳輸失敗狀態,表示文件傳輸已經失敗,失敗原因可能是對方取消了文件傳輸或網絡錯誤




           

          3.5        結構設計

          軟件主要由MainFrame,TransFileManager,SocketThread,Server,TransFilePanel五個類構成圖 表示了這幾個類之間的關系。


           

          類功能介紹

          MainFrame

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

          TransFileManager

          TransFileManager類是文件傳輸的控制類,負責管理文件的傳輸,它維護一個傳輸線程(SocketThread)的列表,每個線程都表示一個正在傳輸的任務。TransFileManager類定時的掃描各個線程的狀態,根據不同狀態做出不同處理,如計算傳輸速度,顯示傳輸進度等。

          SocketThread

          SocketThread類是文件傳輸線程類,它負責底層的具體傳輸工作,包括打包與解包,并且轉換自己的狀態,完成文件的傳輸。

          Server

          Server類是為TransFileManager類使用的,它負責本地端口的監聽,一旦有用戶連接,TransFileManager就創建一個傳輸線程,放入線程列表。而它繼續監聽端口。

          TransFilePanel

          TransFilePanel是一個面板,它用有按鈕、進度條,標簽等用來顯示文件的傳輸狀態。

          3.6        類設計

          361       MainFrame

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

           

          成員變量:

          contentPane

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

          jbtnSend

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

          jbtnSetting

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

          jlblIP

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

          jtpTransFile

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

          tfm

          tfmTransFileManager類對象,負責控制文件的傳輸。

          成員方法:

          jbtnSend_anctionPerformed()

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

          jbtnSetting_actionPerformed()

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

          This_windowClosed()

          該方法為窗口關閉事件

          界面截圖:


           

          362       TransFileManager

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


           

          成員變量:

          jtp

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

          panelist

          paneListArrayList類對象,它是一個鏈表結構,存儲使用的選項卡。

          running

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

          s

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

          threadList

          threadListArrayList類對象,它是一個鏈表結構,存儲使用的傳輸線程。

          maxThreadNum

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

          port

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

          成員方法:

          close()

          該方法用于關閉文件傳輸的控制。

          sendFile()

          該方法用于建立一個文件發送,要求輸入參數為,目標IP,端口號,要發送的文件和驗證消息。

          3.6.3           SocketThread

          SocketThread類是文件傳輸的底層支持類,它提供文件傳輸的服務。


           

          成員變量:

          sendBuf

          sendBuf是一個字節型數據,它是文件發送和接收時的緩沖區。

          dis

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

          dos

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

          fDis

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

          raf

          rafRandomAccessFile型對象,該對象允許設置輸出流的位置,以支持斷點續傳。

          running

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

          serverName

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

          errorMessage

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

          fileName

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

          fileSender

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

          IP

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

          message

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

          port

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

          transFileLength

          transFileLength是長整型變量,表示已經傳輸的文件長度,TransFileManager可以用它來計算傳輸進度和傳輸速度

          成員方法:

          cancelTrans()

          該方法用于取消傳輸

          confirmReceiveFile()

          該方法用于確認傳輸文件

          參數flag用來表示是否同意傳輸

          參數fileName用來表示保存的文件

          參數off用來表示起始傳輸字節

          getFileTransMessage()

          該方法用于得到文件傳輸的基本信息。如:文件發送的目標,端口號等。

          getStatus()

          該方法返回一個整型變量,表示當前線程的傳輸狀態。

          run()

          線程的執行方法,該方法中循環執行發送或接收方法,完成文件的發送或接收。

          setError()

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

          stopThread()

          該方法用于停止線程的執行。

          doPackage()

          打包方法,該方法中,根據線程所處的不同狀態,對數據加入不同的包頭和其他信息,進行打包。

          readFromFile()

          該方法從要發送的文件中讀取一個整型數。

          readFromSocket()

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

          receiveFile()

          該方法為接收文件的方法,是線程循環中,文件接收者執行的方法。

          sendFile()

          該方法為發送文件方法,是線程循環中,文件發送者執行的方法。

          writeToFile()

          該方法寫一個字節數據的數據到保存的文件中。

          writeToSocket()

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

          3.6.3            TransFilePanel

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


           

          成員變量:

          fileName

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

          fileSender

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

          isCanneled

          isCanneledboolean型對象,傳輸過程中,用戶點了取消按鈕后,該標志位置trueTransFileManager會循環檢測isCanneled標志,當發現其為true后,它會關閉對應的傳輸線程,而對方會檢測到傳輸錯誤,文件傳輸就停止了。

          isClosed

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

          isConfirm

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

          jbtnCannel

          jbtnCannel是取消按鈕。

          jbtnOK

          jbtnOK是確定按鈕。

          jpgbFileTrans

          jpgbFileTrans是文件傳輸的進度條。

          jtaFileTransStatus

          jtaFileTransStatus是一個文本框,用來顯示文件傳輸的狀態。

          transFileLength

          transFileLength是一個長整型變量,用來表示已經傳輸的文件長度。

          status

          status是一個整行變量,表示文件傳輸的狀態,所表示的狀態與SocketThread中的對應。

          界面截圖


           

          3.7              算法介紹

          371 TransFileManager的循環監聽

          TransFileManger類繼承了Thread類,實現多線程,避免循環監聽時產生阻塞。

          以下是在每次循環中做的工作

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

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

          3、 判斷當前取出的線程是否有對應的傳輸狀態顯示面板,如果有執行5,如果沒有執行4

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

          5、 判斷傳輸線程的狀態,根據不同的狀態做不同的處理。

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

          程序流程圖:



           

          372 斷點續傳

          軟件支持斷點續傳的功能,該功能主要算法如下:

          1、 當文件傳輸中途停止時,文件接收者程序為接收的文件創建一個以該文件名+.tmp為文件名的臨時文件,臨時文件與該文件保存在同一個路徑下。臨時文件中保存文件以傳輸的字節數和文件的大小。

          2、 當文件接收者接收該文件時,如果有對應的臨時文件,程序會檢測到該文件的臨時文件,讀取以傳輸的字節數和文件大小,并且比較傳輸的字節數與未完成傳輸的文件大小是否相等,文件大小和發送來的文件大小是否相等,如果都相等,執行3,否則執行4

          3、 將文件的輸出流設置到應該繼續傳輸的位置,并將起始傳輸字節數發給發送者,執行5

          4、 如果有未完成的傳輸文件,將其刪除,執行5

          5、 進行文件傳輸。

          程序流程圖:




           

          3.7.3            本地端口的多連接監聽

          Server類對象負責本地端口的監聽,可以支持多了連接,具體數量由用戶設置。

          1、  用用戶設置的端口創建監聽,等待連接。

          2、  當有用戶連接上后,用該連接創建一個SocketThread傳輸線程,加入到線程列表。

          3、  如果停止監聽則退出,否則執行1

          程序流程圖:

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

          2007年7月21日 #

          準備開工


                經過畢業后的休息,來到上海已經快一個星期了,總體感覺一般,城市沒有傳說中那么現代,路上一樣有小廣告,一樣有人不走人行橫道,一樣有破破的樓房,地鐵站外一樣有黑車拉客。昨天去了外灘,才看到幾處高樓,不過怎么看也沒有電視上放的那樣有氣勢。南京路上老外還是比較多(老外的眼神很迷茫)。
                周一就要工作了,又要回到與代碼為伴的生活了,用鍵盤敲出以后美好的生活吧。
                                                                                                                                                               

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

          2007年5月31日 #

          XML的DOM解析器的java實現(三) 類設計

           
          類設計

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

          字符收集器類

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

           

          成員變量介紹:

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

          成員方法介紹:

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

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

          peek():          輸入:int型數組。用于存儲窺探到的字符,輸出:無,該方法用于從文件中窺探數組長度的字符數據。窺探就是從文件中讀取數據后,將輸入流標記回以前的位置,以免丟失數據。

                            算法簡述:

          aReader上標記數組的長度

          aReader.mark(buffer.length);

          2、將數據依次讀入數組

          for (int i = 0; i < buffer.length; i++) {

                      buffer[i] = aReader.read();

                  }

          恢復aReader

          aReader.reset();

          peek():    輸入:無,輸出:int型,是窺探到的字符,該方法從文件中窺探一個字符數據。

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

              算法簡述:

          預設兩個數組

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

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

          窺探cdataHead長度的字符存在數組buf

          peek(buf);

          比較bufcdataHead數組的內容是否相同,如果不同返回falase,如果相同繼續執行。

          aReader跳過cdataHead的長度,然后循環讀取直到窺探的字符數組與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型,用于存放實體數據,輸出:無,用語處理XML文件中的內建實體類型。得到的實體存放到StringBuffer對象中。

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

              算法簡述:

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

          int nextChar = peek();

          if (nextChar != '<') {

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

          }

          窺探一個字符aChar

          int aChar = peek();

          如果字符為’<’,進行CDATA節點處理

          if (aChar == '<') {

                          if (processCDATA(sb)) {

                              aChar = peek();

                              continue;

                          }

          }

           如果字符為’&’,進行內建實體處理

          if (aChar == '&') {

                          if (processEntity(sb)) {

                              aChar = peek();

                              continue;

                          }

          }

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

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

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

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

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

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

          解析內核類

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

           

          成員變量介紹:

          aCharCollector:CharCollector類對象,負責字符收集。

          currentNode: SimpleElement類對象,表示當前處理的元素。

          Elements:     Stack類對象,用棧的存儲結構,表示元素之間的層次關系。

          成員方法介紹:

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

                         算法簡述:

          1、讀取一個標簽

          2、判斷是開始標簽還是結束標簽,如果是結束標簽,轉入結束標簽處理3

          如果是開始標簽,轉入開始標簽處理6

          3、得到標簽的名稱,判斷是否與currentNode的名稱相同,如果相同,執行

          4,否則拋出異常

          4、判斷是否還有標簽,如果有繼續執行5,否則退出。

          5、從棧中彈出一個節點給currentNode,執行1

          6、得到標簽的名稱,屬性,文本內容,將標簽加入到DOM樹中,并且壓棧。

          執行1

          算法的程序流程圖



          中間層管理類

          中間層管理類用于控制和協調解析器與用戶界面。

           

          成員變量介紹:

          isParsered: boolean型,判斷是否已經解析過了。

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

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

          成員方法介紹:

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

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

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

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

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

          于轉換相應元素為樹的節點對象。

           

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

          2007年5月27日 #

          XML的DOM解析器的java實現(二) 程序結構設計

           

          結構設計

          各個類的功能介紹

          NodeElementDocumentAttrW3CDOM規范要求實現的接口。還有其它接口未列出。

          SimpleNode 繼承Node接口,實現Node接口的基本功能。

           

          SimpleElement繼承NodeElement接口,對應DOM樹中的標準節點,也就是XML文件中的一個標簽。

           

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

           

          SimpleAttr 繼承NodeAttr接口,對應DOM樹中的屬性節點,用于存放屬性名稱和屬性值。

           

          CharCollector 字符收集器類,它直接與XML文件接觸,根據需要向調用者提供下一個標簽或文本等數據。

           

          SimpleDOMParser 解析器的核心類,它使用CharCollector類,得到標簽、文本等數據。使用SimpleElementSimpleAttr等類存放數據,生成SimpleDocumnet對象返回給調用者。

           

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

           

          Manager 中間層管理類,它協調用戶界面(MainFrame)與解析器內核(SimpleDOMParser)之間的關系,實現解析器的控制。

           

          內部接口設計

          類名稱

          調用類

          調用功能

          SimpleDOMParser

          SimpleElement

          節點的存儲,查找,刪除。

          SimpleDOMParser

          SimpleAttr

          屬性節點的存儲,查找,刪除。

          SimpleDOMParser

          SimpleDocument

          生成DOM

          SimpleDomParser

          CharCollector

          字符收集,得到標簽與文本等。

          Manager

          SimpleDOMParser

          解析XML文檔

          Manager

          MainFrame

          用戶界面的相關操作

           

          用例關系設計

          用例介紹

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

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

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

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

          選擇URL地址: 用戶輸入一個有效的URL,指向網絡上的XML格式的網頁。

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

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

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

          選擇DOM樹節點:用戶選擇解析后的DOM樹型結構上的節點。

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

          收集字符:        字符收集器負責處理XML的字符數據

          界面展示:        通過樹型結構和圖表向用戶展示數據。

           

          字符收集器有限狀態機

          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代表文件結束

          NL代表不是<的字符

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

           

          狀態:

          S 開始狀態

          Ts:標簽處理開始狀態

          Tp:標簽處理狀態

          Tq:標簽處理結束狀態

          CpCDATA節點處理狀態

          Ep:內建實體處理狀態

          Er:錯誤狀態

          Q:結束狀態

           

          狀態轉換函數:

           

          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 閱讀(1428) | 評論 (1)編輯 收藏

          2007年5月26日 #

          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] + ","); //打印

             }

           

          再在代碼中創建靜態對象

          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 閱讀(1443) | 評論 (2)編輯 收藏

          2007年5月23日 #

          xml的DOM解析器的java實現 (一) DOM規范簡介

           

          這是我的畢業設計,本來以為挺簡單的,做了以后發現還是能學到點知識,發來給大家一起學習。

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

           

          DOMImplementation

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

           

          NodeList

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

           

          Node

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

           

          NamedNodeMap

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

           

          DOMException

          異常接口

           

          DocumentFragment

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

           

          Document

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

           

          Element

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

           

          Attr

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

           

          CharacterData

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

           

          DocumentType

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

           

          Notation

          Notation對象表示DTD聲明中的關于表示法的信息。

           

          Entity

          Entity對象包含DTD中有關實體的信息。

           

          EntityReference

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

           

          ProcessingInstruction

          ProcessingInstruction對象包含文檔中內嵌的處理指令的信息。

           

          Text

          Text對象表示節點的文本數據。

           

          Comment

          Comment對象表示注釋。

           

          CDATASection

          CDATASection對象包含文本中未被解析塊的內容。

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

          2007年5月15日 #

          java 調用本地文件

          好幾天沒有寫了,今天在做畢業設計時遇到要打開系統上的文件,而文件類型事先是不可知的,所以不能用以前知道的那種方法,Runtime.getRuntime().exec("notepad c:/a.txt");在網上搜到一個類BrowserLauncher,這個類可以調用文件關聯打開文件,好處在于它對不同的系統可以不同的對待,保持了java的跨平臺性,有興趣的可以用google搜BrowserLauncher,不要用baidu。
          我看了一下Windows XP/NT系統的調用,就是寫成Runtime.getRuntime.exec("cmd /c start "+url);

          posted @ 2007-05-15 09:45 Rex Mao 閱讀(909) | 評論 (3)編輯 收藏

          2007年4月24日 #

          java畫圖程序技術小結(三) 畫圖的鼠標事件處理

          畫圖的鼠標事件處理是畫圖程序中比較復雜的內容,這里只是簡單介紹,有興趣的可以看程序。
                   Point p0,p1;//
          記錄拖拽畫圖的起點和終點
                   p0=new Point();
                   p1=new Point();
                   //
          鼠標按下,主要記錄按下的點
                   void jPaneDraw_mousePressed(MouseEvent e) {
                      p0=new Point(e.getX(),e.getY());
          }
                   //
          鼠標拖拽過程,根據不同的圖形,畫出拖拽過程的圖形,復雜圖形可以用矩形代替
                   void jPaneDraw_mouseDragged(MouseEvent e) {
                   switch(toolMode){
                   case 0:{ //
          直線
                 p1.x = e.getX();
                  p1.y = e.getY();
                  g.setColor(col);
                  g.drawLine(p0.x, p0.y, p1.x, p1.y);
                  jPaneDraw.repaint();
                  break;
             }
                   ...//
          其它圖形
          }
          }
          //
          鼠標抬起,根據p0p1生成對應的圖形
          void jPaneDraw_mouseReleased(MouseEvent e) {
             switch(toolMode){
          case 0:{ //
          直線
                   CusLine2D aCusShape = new CusLine2D(p0.x, p0.y, p1.x, p1.y); //
          建立圖形
                   ...//
          將圖形加入到圖形列表
                   break;
          }
                   ...//
          其它圖形
          }
                   jPaneDraw.repaint();
          }

          posted @ 2007-04-24 17:07 Rex Mao 閱讀(2213) | 評論 (1)編輯 收藏

          僅列出標題  下一頁
          主站蜘蛛池模板: 富源县| 永吉县| 汾阳市| 鲁甸县| 潜江市| 莒南县| 大丰市| 昌都县| 准格尔旗| 竹山县| 博客| 怀柔区| 襄城县| 商南县| 盱眙县| 辽宁省| 定州市| 伊金霍洛旗| 陇川县| 兴义市| 玉林市| 富民县| 龙川县| 来安县| 柳林县| 平乡县| 增城市| 富阳市| 宣武区| 梅州市| 南投县| 珠海市| 布尔津县| 吴川市| 泽普县| 定远县| 上思县| 六枝特区| 唐山市| 通化县| 瑞安市|