Rex Mao

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

          2007年4月23日 #

          關(guān)于留言

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

          另外,如果需要源程序,可聯(lián)系購(gòu)買(mǎi),也可提供程序擴(kuò)展開(kāi)發(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. 強(qiáng)制關(guān)閉用戶(hù)的連接

          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 --這里請(qǐng)用你的SELECT語(yǔ)句代替                                            
                                            ) A                                                                                                                                     
                               WHERE ROWNUM <= n                                                                                                              
                               )                                                                                                                                                      
                  WHERE RN >= m;                                                                                                                                      
              
          4. 重新編譯包 (package) 和 包體 (package body)
              此命令可以用于查看在SQLPLUS中創(chuàng)建的package的編譯錯(cuò)誤。

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

                      ALTER PACKAGE YOUR_PACKAGE                                                                                                 
                      COMPILE BODY;                                                                                                                                   

                  c) 查看錯(cuò)誤
                      SHOW ERR;                                                                                                                                             

          5. 解除鎖定的用戶(hù)

          SQL:
          SQL:
              ALERT USER USERNAME UNLOCK;


           

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

          JAVA文件傳輸程序

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

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

          3章      設(shè)計(jì)文檔

          31       任務(wù)概述

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

          311      開(kāi)發(fā)背景

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

          312       定義

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

          313       開(kāi)發(fā)工具

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

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

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

                 在文件傳輸時(shí),傳輸過(guò)程可以簡(jiǎn)單的分為4步,如圖

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

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

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

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


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


           

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

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

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

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

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

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


           

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

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

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

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

          331       傳輸包的格式


           

          其中傳輸包的類(lèi)型有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)文件的接收

          332       文件名包格式


           

          333      文件傳輸包格式

           

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

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


           

          其中CONFIRM_FLAG表示是否確認(rèn)文件接收,1表示接收,0表示不接收,當(dāng)接收時(shí),OFF表示文件傳輸?shù)钠鹗甲止?jié),用來(lái)實(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)開(kāi)始,根據(jù)文件傳輸?shù)牟煌闆r,在各個(gè)狀態(tài)間轉(zhuǎn)換,直到傳輸成功或傳輸失敗。

          FILE_TRANS_STATUS_FILENAME = 0x01

          文件名稱(chēng)傳輸狀態(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)失敗,失敗原因可能是對(duì)方取消了文件傳輸或網(wǎng)絡(luò)錯(cuò)誤




           

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

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


           

          類(lèi)功能介紹

          MainFrame

          MainFrame類(lèi)是軟件的主界面類(lèi),負(fù)責(zé)與用戶(hù)的交互。

          TransFileManager

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

          SocketThread

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

          Server

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

          TransFilePanel

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

          3.6        類(lèi)設(shè)計(jì)

          361       MainFrame

          該類(lèi)是視圖類(lèi),是軟件的主界面。

           

          成員變量:

          contentPane

          contentPaneJPanel類(lèi)的對(duì)象,是主界面的面板。

          jbtnSend

          jbtnSendJButton類(lèi)對(duì)象,點(diǎn)擊它將打開(kāi)文件傳輸對(duì)話框。

          jbtnSetting

          jbtnSettingJButton類(lèi)對(duì)象,點(diǎn)擊它將打開(kāi)設(shè)置對(duì)話框。

          jlblIP

          jlblIPJLable類(lèi)對(duì)象,它顯示本機(jī)的IP地址,方便文件的傳輸。

          jtpTransFile

          jtpTransFileJTabbedPane類(lèi)對(duì)象,是選項(xiàng)卡控件,用于顯示多個(gè)文件同時(shí)傳輸。

          tfm

          tfmTransFileManager類(lèi)對(duì)象,負(fù)責(zé)控制文件的傳輸。

          成員方法:

          jbtnSend_anctionPerformed()

          該方法為jbtnSend按鈕的點(diǎn)擊事件

          jbtnSetting_actionPerformed()

          該方法為jbtnSetting按鈕的點(diǎn)擊事件

          This_windowClosed()

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

          界面截圖:


           

          362       TransFileManager類(lèi)

          該類(lèi)負(fù)責(zé)傳輸過(guò)程中對(duì)各個(gè)傳輸線程的檢測(cè)與控制。


           

          成員變量:

          jtp

          jtp是選項(xiàng)卡控件對(duì)象,是MainFrame類(lèi)中jtpTransFile對(duì)象的一個(gè)引用。

          panelist

          paneListArrayList類(lèi)對(duì)象,它是一個(gè)鏈表結(jié)構(gòu),存儲(chǔ)使用的選項(xiàng)卡。

          running

          running是一個(gè)boolean型的對(duì)象,用來(lái)表示線程是否在執(zhí)行。

          s

          sServer類(lèi)的對(duì)象,用來(lái)堅(jiān)聽(tīng)本地端口,等待用戶(hù)的連接。

          threadList

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

          maxThreadNum

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

          port

          port是整型變量,表示使用的端口號(hào)。

          成員方法:

          close()

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

          sendFile()

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

          3.6.3           SocketThread類(lèi)

          SocketThread類(lèi)是文件傳輸?shù)牡讓又С诸?lèi),它提供文件傳輸?shù)姆?wù)。


           

          成員變量:

          sendBuf

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

          dis

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

          dos

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

          fDis

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

          raf

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

          running

          running是一個(gè)boolean型對(duì)象,用來(lái)表示線程是否在執(zhí)行。

          serverName

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

          errorMessage

          errorMessage是字符串型對(duì)象,表示出錯(cuò)的信息。

          fileName

          fileName是字符串型對(duì)象,表示文件名。

          fileSender

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

          IP

          IP是字符串型對(duì)象,用來(lái)存放目的機(jī)的IP地址。

          message

          message是字符串型對(duì)象,用來(lái)表示驗(yàn)證信息。

          port

          port是整型變量,表示連接的端口號(hào)。

          transFileLength

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

          成員方法:

          cancelTrans()

          該方法用于取消傳輸

          confirmReceiveFile()

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

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

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

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

          getFileTransMessage()

          該方法用于得到文件傳輸?shù)幕拘畔?。如:文件發(fā)送的目標(biāo),端口號(hào)等。

          getStatus()

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

          run()

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

          setError()

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

          stopThread()

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

          doPackage()

          打包方法,該方法中,根據(jù)線程所處的不同狀態(tài),對(duì)數(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()

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

          writeToSocket()

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

          3.6.3            TransFilePanel類(lèi)

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


           

          成員變量:

          fileName

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

          fileSender

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

          isCanneled

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

          isClosed

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

          isConfirm

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

          jbtnCannel

          jbtnCannel是取消按鈕。

          jbtnOK

          jbtnOK是確定按鈕。

          jpgbFileTrans

          jpgbFileTrans是文件傳輸?shù)倪M(jìn)度條。

          jtaFileTransStatus

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

          transFileLength

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

          status

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

          界面截圖


           

          3.7              算法介紹

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

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

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

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

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

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

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

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

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

          程序流程圖:



           

          372 斷點(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í),如果有對(duì)應(yīng)的臨時(shí)文件,程序會(huì)檢測(cè)到該文件的臨時(shí)文件,讀取以傳輸?shù)淖止?jié)數(shù)和文件大小,并且比較傳輸?shù)淖止?jié)數(shù)與未完成傳輸?shù)奈募笮∈欠裣嗟?,文件大小和發(fā)送來(lái)的文件大小是否相等,如果都相等,執(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)聽(tīng)

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

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

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

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

          程序流程圖:

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

          準(zhǔn)備開(kāi)工


                經(jīng)過(guò)畢業(yè)后的休息,來(lái)到上海已經(jīng)快一個(gè)星期了,總體感覺(jué)一般,城市沒(méi)有傳說(shuō)中那么現(xiàn)代,路上一樣有小廣告,一樣有人不走人行橫道,一樣有破破的樓房,地鐵站外一樣有黑車(chē)?yán)?。昨天去了外灘,才看到幾處高樓,不過(guò)怎么看也沒(méi)有電視上放的那樣有氣勢(shì)。南京路上老外還是比較多(老外的眼神很迷茫)。
                周一就要工作了,又要回到與代碼為伴的生活了,用鍵盤(pán)敲出以后美好的生活吧。
                                                                                                                                                               

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

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

           
          類(lèi)設(shè)計(jì)

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

          字符收集器類(lèi)

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

           

          成員變量介紹:

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

          成員方法介紹:

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

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

          peek():          輸入:int型數(shù)組。用于存儲(chǔ)窺探到的字符,輸出:無(wú),該方法用于從文件中窺探數(shù)組長(zhǎng)度的字符數(shù)據(jù)。窺探就是從文件中讀取數(shù)據(jù)后,將輸入流標(biāo)記回以前的位置,以免丟失數(shù)據(jù)。

                            算法簡(jiǎn)述:

          aReader上標(biāo)記數(shù)組的長(zhǎng)度

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

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

              算法簡(jiǎn)述:

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

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

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

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

          peek(buf);

          比較bufcdataHead數(shù)組的內(nèi)容是否相同,如果不同返回falase,如果相同繼續(xù)執(zhí)行。

          aReader跳過(guò)cdataHead的長(zhǎng)度,然后循環(huán)讀取直到窺探的字符數(shù)組與cdataTail相同,將中間的字符存放到StringBuffer對(duì)象中。

          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ù),輸出:無(wú),用語(yǔ)處理XML文件中的內(nèi)建實(shí)體類(lèi)型。得到的實(shí)體存放到StringBuffer對(duì)象中。

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

              算法簡(jiǎn)述:

          窺探一個(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對(duì)象。

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

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

          skipOtherTag():   輸入:無(wú),輸出:無(wú),跳過(guò)一個(gè)不處理的標(biāo)簽。

          skipOtherTags(): 輸入:無(wú),輸出:無(wú),跳過(guò)多個(gè)不處理的標(biāo)簽。

          skipWhitespace():輸入:無(wú),輸出:無(wú),跳過(guò)空格。

          解析內(nèi)核類(lèi)

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

           

          成員變量介紹:

          aCharCollector:CharCollector類(lèi)對(duì)象,負(fù)責(zé)字符收集。

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

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

          成員方法介紹:

          Parser():     輸入:無(wú),輸出:SimpleDocument類(lèi)對(duì)象,是返回的整個(gè)文檔樹(shù)型結(jié)構(gòu)。

                         算法簡(jiǎn)述:

          1、讀取一個(gè)標(biāo)簽

          2、判斷是開(kāi)始標(biāo)簽還是結(jié)束標(biāo)簽,如果是結(jié)束標(biāo)簽,轉(zhuǎn)入結(jié)束標(biāo)簽處理3

          如果是開(kāi)始標(biāo)簽,轉(zhuǎn)入開(kāi)始標(biāo)簽處理6

          3、得到標(biāo)簽的名稱(chēng),判斷是否與currentNode的名稱(chēng)相同,如果相同,執(zhí)行

          4,否則拋出異常

          4、判斷是否還有標(biāo)簽,如果有繼續(xù)執(zhí)行5,否則退出。

          5、從棧中彈出一個(gè)節(jié)點(diǎn)給currentNode,執(zhí)行1

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

          執(zhí)行1

          算法的程序流程圖



          中間層管理類(lèi)

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

           

          成員變量介紹:

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

          document: SimpleDocument型對(duì)象,表示整個(gè)XML文檔樹(shù),也是解析器返回的。

          parser:       SimpleDOMParser型對(duì)象,表示解析器。

          成員方法介紹:

          getTreeRoot(): 輸入:無(wú),輸出:DefaultMutableTreeNode型對(duì)象,是得到的樹(shù)的根節(jié)點(diǎn),用于得到樹(shù)的根節(jié)點(diǎn)。

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

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

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

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

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

           

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

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

           

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

          各個(gè)類(lèi)的功能介紹

          Node、Element、Document、AttrW3CDOM規(guī)范要求實(shí)現(xiàn)的接口。還有其它接口未列出。

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

           

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

           

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

           

          SimpleAttr 繼承NodeAttr接口,對(duì)應(yīng)DOM樹(shù)中的屬性節(jié)點(diǎn),用于存放屬性名稱(chēng)和屬性值。

           

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

           

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

           

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

           

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

           

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

          類(lèi)名稱(chēng)

          調(diào)用類(lèi)

          調(diào)用功能

          SimpleDOMParser

          SimpleElement

          節(jié)點(diǎn)的存儲(chǔ),查找,刪除。

          SimpleDOMParser

          SimpleAttr

          屬性節(jié)點(diǎn)的存儲(chǔ),查找,刪除。

          SimpleDOMParser

          SimpleDocument

          生成DOM樹(shù)

          SimpleDomParser

          CharCollector

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

          Manager

          SimpleDOMParser

          解析XML文檔

          Manager

          MainFrame

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

           

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

          用例介紹

          用戶(hù):          參與者, 即軟件的使用者。

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

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

          選擇XML文件: 用戶(hù)通過(guò)文件選擇框選擇一個(gè)本地的XML文件。

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

          解析XML文件: 用戶(hù)確定對(duì)XML文件進(jìn)行解析,該項(xiàng)操作要發(fā)生在選擇XML文件或選擇URL地址之后。

          修改文件:        用戶(hù)對(duì)XML文件進(jìn)行修改

          保存文件:        用戶(hù)通過(guò)文件選擇框,選擇位置保存XML文件。

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

          解析器解析:     解析器對(duì)XML進(jìn)行解析

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

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

           

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

          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 開(kāi)始狀態(tài)

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

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

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

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

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

          Er:錯(cuò)誤狀態(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 閱讀(1437) | 評(píng)論 (1)編輯 收藏

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

           

          有時(shí)候不想把圖片資源放在目錄里,讓用戶(hù)看到,我用的方法是將圖片的像素矩陣存在代碼里??赡鼙容^笨,具體做法是:

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

          Image img = Toolkit.getDefaultToolkit().createImage("畫(huà)刷.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)對(duì)象

          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

           };//打印出來(lái)的矩陣

          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 閱讀(1454) | 評(píng)論 (2)編輯 收藏

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

           

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

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

           

          DOMImplementation

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

           

          NodeList

          NodeList對(duì)象是Node對(duì)象的一個(gè)簡(jiǎn)單的有序集合。例如,可以用來(lái)存放一個(gè)節(jié)點(diǎn)的子節(jié)點(diǎn)。

           

          Node

          Node對(duì)象是DOM中所有節(jié)點(diǎn)的基對(duì)象。ElementAttrTextCDATASection、EntityReference、EntityProcessingInstruction、Comment、Document、DocumentType、DocumentFragmentNotation對(duì)象都派生于Node對(duì)象。

           

          NamedNodeMap

          NamedNodeMap對(duì)象是可以通過(guò)猛成訪問(wèn)的Node對(duì)象集合。可以用來(lái)存放節(jié)點(diǎn)的屬性。

           

          DOMException

          異常接口

           

          DocumentFragment

          DocumentFragment對(duì)象是文檔片段,是文檔(Document)對(duì)象的一個(gè)簡(jiǎn)單的版本。它可以用來(lái)表示文檔的任意子樹(shù)。

           

          Document

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

           

          Element

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

           

          Attr

          Attr是屬性對(duì)象,一個(gè)節(jié)點(diǎn)的屬性存在NamedNodeMap里。

           

          CharacterData

          CharacterData對(duì)象表示xml文件中的字符信息。

           

          DocumentType

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

           

          Notation

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

           

          Entity

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

           

          EntityReference

          EntityReference對(duì)象包含對(duì)已解析文檔中的實(shí)體的引用信息。

           

          ProcessingInstruction

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

           

          Text

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

           

          Comment

          Comment對(duì)象表示注釋。

           

          CDATASection

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

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

          java 調(diào)用本地文件

          好幾天沒(méi)有寫(xiě)了,今天在做畢業(yè)設(shè)計(jì)時(shí)遇到要打開(kāi)系統(tǒng)上的文件,而文件類(lèi)型事先是不可知的,所以不能用以前知道的那種方法,Runtime.getRuntime().exec("notepad c:/a.txt");在網(wǎng)上搜到一個(gè)類(lèi)BrowserLauncher,這個(gè)類(lèi)可以調(diào)用文件關(guān)聯(lián)打開(kāi)文件,好處在于它對(duì)不同的系統(tǒng)可以不同的對(duì)待,保持了java的跨平臺(tái)性,有興趣的可以用google搜BrowserLauncher,不要用baidu。
          我看了一下Windows XP/NT系統(tǒng)的調(diào)用,就是寫(xiě)成Runtime.getRuntime.exec("cmd /c start "+url);

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

          java畫(huà)圖程序技術(shù)小結(jié)(三) 畫(huà)圖的鼠標(biāo)事件處理

          畫(huà)圖的鼠標(biāo)事件處理是畫(huà)圖程序中比較復(fù)雜的內(nèi)容,這里只是簡(jiǎn)單介紹,有興趣的可以看程序。
                   Point p0,p1;//
          記錄拖拽畫(huà)圖的起點(diǎn)和終點(diǎn)
                   p0=new Point();
                   p1=new Point();
                   //
          鼠標(biāo)按下,主要記錄按下的點(diǎn)
                   void jPaneDraw_mousePressed(MouseEvent e) {
                      p0=new Point(e.getX(),e.getY());
          }
                   //
          鼠標(biāo)拖拽過(guò)程,根據(jù)不同的圖形,畫(huà)出拖拽過(guò)程的圖形,復(fù)雜圖形可以用矩形代替
                   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;
             }
                   ...//
          其它圖形
          }
          }
          //
          鼠標(biāo)抬起,根據(jù)p0p1生成對(duì)應(yīng)的圖形
          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 閱讀(2223) | 評(píng)論 (1)編輯 收藏

          java畫(huà)圖程序技術(shù)小結(jié)(二) 重繪與雙緩沖

          雙緩沖,我記得有兩種方法,一種是兩個(gè)圖象,一個(gè)前臺(tái)Graphics,一個(gè)后臺(tái)Graphics,畫(huà)圖時(shí)在后臺(tái)畫(huà),畫(huà)好了,再用前臺(tái)的Graphics畫(huà)后臺(tái)Graphics的圖片。另一種是有兩個(gè)或多個(gè)圖象,不分前后臺(tái),顯示一個(gè)圖象時(shí),另外的在畫(huà),圖象循環(huán)使用(c語(yǔ)言時(shí)用過(guò))。
                   給出第一種的java實(shí)現(xiàn)
                   a、  定義后臺(tái)圖象BufferedImage offScreenImg=offScreenImg = new BufferedImage(this.maxX, this.maxY,
                                               BufferedImage.TYPE_INT_RGB);

                   b、  得到后臺(tái)的Graphics實(shí)例

              Graphics2D offScreenG;

                  offScreenG = offScreenImg.createGraphics();

                   c、  覆蓋paintComponent方法

               public void paintComponent(Graphics g) {

                    super.paintComponent(g);

                  g.drawImage(offScreenImg, 0, 0, this.maxX, this.maxY, this);

                    }

                  繪制時(shí)用后臺(tái)Graphics,繪制好后,調(diào)用repaint(),將offScreenImg繪到面板上。


          posted @ 2007-04-23 21:47 Rex Mao 閱讀(4425) | 評(píng)論 (1)編輯 收藏

          java畫(huà)圖程序技術(shù)小結(jié)(一) 程序結(jié)構(gòu)問(wèn)題

                   這個(gè)軟件是我大二時(shí)的圖形學(xué)課程設(shè)計(jì),是個(gè)矢量圖形的繪制軟件。發(fā)來(lái)給初學(xué)者參考。
                   主要功能:
                   實(shí)現(xiàn)點(diǎn)、線段、折線、圓、橢圓、矩形、圓弧、多邊形、填充圖形、字符串等的定義和交互繪制。
                   實(shí)現(xiàn)線型、線寬、顏色的選擇。
                   實(shí)現(xiàn)畫(huà)布的定義及保存。


                   程序結(jié)構(gòu):

          程序的主要功能均由類(lèi)PaintPanel完成,該類(lèi)繼承自JtextArea。(用它是為了實(shí)現(xiàn)畫(huà)布的大小調(diào)整的滾動(dòng)條,以后介紹)

          PaintPanel中主要成員:

          ArrayList shape 保存當(dāng)前畫(huà)布上的圖形對(duì)象

          ArrayList undo  保存用于撤消操作的圖形對(duì)象  

          Color bgCol    背景顏色

          BufferedImage offScreenImg   后臺(tái)圖象

          Graphics2D offScreenG       后臺(tái)Graphics對(duì)象

          Clipboard cb;   剪切板(由系統(tǒng)剪切板實(shí)例化)

             程序中定義接口:CusShape,主要有一些操作圖形的基本方法,比如,繪制,位置控制,顏色控制(具體可看代碼)
             其他圖形均繼承java.awt中的對(duì)應(yīng)的類(lèi)(主要是使用其中的交叉判斷函數(shù)intersects,用于圖形的鼠標(biāo)選取),并實(shí)現(xiàn)Serializable,CusShape。
             圖形在程序中都以接口CusShape形式出現(xiàn),以畫(huà)的圖形存儲(chǔ)在ArrayList中。

             我是通過(guò)這個(gè)軟件的設(shè)計(jì)才明白多態(tài)的,以前都是理論上的,經(jīng)過(guò)實(shí)踐才知道面向?qū)ο蟮暮锰帯_@個(gè)軟件編寫(xiě)的時(shí)候我對(duì)java還不是很了解,所以有的結(jié)構(gòu)不是很合理,寫(xiě)出來(lái)就是給初學(xué)者做個(gè)參考,看到有很多同學(xué)都在找畫(huà)圖板的設(shè)計(jì),我會(huì)給出程序和簡(jiǎn)單的設(shè)計(jì)文檔。

          posted @ 2007-04-23 10:11 Rex Mao 閱讀(3936) | 評(píng)論 (4)編輯 收藏

          轉(zhuǎn)移了一些圖片

                   從以前的博客轉(zhuǎn)了一些圖片過(guò)來(lái),以前的一些技術(shù)小結(jié)也要轉(zhuǎn)過(guò)來(lái)。

          posted @ 2007-04-23 09:42 Rex Mao 閱讀(244) | 評(píng)論 (0)編輯 收藏

          主站蜘蛛池模板: 宝应县| 乾安县| 偃师市| 那曲县| 宜宾市| 铜陵市| 涿鹿县| 剑河县| 花莲县| 威海市| 公主岭市| 水城县| 门头沟区| 祁东县| 凌云县| 游戏| 甘孜| 苏尼特左旗| 扶沟县| 米脂县| 灵寿县| 南投县| 公主岭市| 安图县| 涿鹿县| 泾阳县| 太康县| 游戏| 城口县| 孟州市| 大厂| 清丰县| 横山县| 花垣县| 阿克陶县| 沅陵县| 同心县| 瓦房店市| 宕昌县| 邵武市| 宜宾县|