inode 譯成中文就是索引節(jié)點(diǎn)。每個(gè)存儲設(shè)備或存儲設(shè)備的分區(qū)(存儲設(shè)備是硬盤、軟盤、U盤 ... ... )被格式化為文件系統(tǒng)后,應(yīng)該有兩部份,一部份是inode,另一部份是Block,Block是用來存儲數(shù)據(jù)用的。而inode呢,就是用來存儲這些數(shù)據(jù)的信息,這些信息包括文件大小、屬主、歸屬的用戶組、讀寫權(quán)限等。inode為每個(gè)文件進(jìn)行信息索引,所以就有了inode的數(shù)值。操作系統(tǒng)根據(jù)指令,能通過inode值最快的找到相對應(yīng)的文件。
做個(gè)比喻,比如一本書,存儲設(shè)備或分區(qū)就相當(dāng)于這本書,Block相當(dāng)于書中的每一頁,inode 就相當(dāng)于這本書前面的目錄,一本書有很多的內(nèi)容,如果想查找某部份的內(nèi)容,我們可以先查目錄,通過目錄能最快的找到我們想要看的內(nèi)容。雖然不太恰當(dāng),但還是比較形象。
當(dāng)我們用ls 查看某個(gè)目錄或文件時(shí),如果加上-i 參數(shù),就可以看到inode節(jié)點(diǎn)了;比如我們前面所說的例子;
[root@localhost ~]# ls -li lsfile.sh
2408949 -rwxr-xr-x 1 root root 7 04-21 12:47 lsfile.sh
lsfile.sh 的inode值是 2408949 ; 查看一個(gè)文件或目錄的inode,要通過ls 命令的的 -i參數(shù)。
2.10 inode 相同的文件是硬鏈接文件;
在Linux 文件系統(tǒng)中,inode值相同的文件是硬鏈接文件,也就是說,不同的文件名,inode可能是相同的,一個(gè)inode值可以對應(yīng)多個(gè)文件。理解鏈接文件并不難,看看例子就會(huì)了。在Linux中,鏈接文件是通過ln工具來創(chuàng)建的。
2.11 創(chuàng)建硬鏈接,硬鏈接和源文件關(guān)系;
用ln 創(chuàng)建文件硬鏈接的語法:
# ln 源文件 目標(biāo)文件
下面我們舉一個(gè)例子,在這個(gè)例子中,我們要為sun.txt 創(chuàng)建其硬鏈接sun002.txt。然后看一下sun.txt和sun002.txt的屬性的變化;
[root@localhost ~]# ls -li sun.txt 注:查看sun.txt的屬性;
2408263 -rw-r--r-- 1 root root 29 04-22 21:02 sun.txt 注:這是sun.txt的屬性;
[root@localhost ~]# ln sun.txt sun002.txt 注:我們通過ln 來創(chuàng)建sun.txt的硬鏈接文件sun002.txt
[root@localhost ~]# ls -li sun* 注:我們列一下sun.txt 和sun002.txt
2408263 -rw-r--r-- 2 root root 29 04-22 21:02 sun002.txt
2408263 -rw-r--r-- 2 root root 29 04-22 21:02 sun.txt
我們可以看到sun.txt在沒有創(chuàng)建硬鏈接文件sun002.txt的時(shí)候,其鏈接個(gè)數(shù)是1(也就是-rw-r--r--后的那個(gè)數(shù)值),創(chuàng)建了硬鏈接sun002.txt創(chuàng)建后,這個(gè)值變成了2。也就是說,我們每次為sun.txt創(chuàng)建一個(gè)新的硬鏈接文件后,其硬鏈接個(gè)數(shù)都會(huì)增加1。
inode值相同的文件,他們的關(guān)系是互為硬鏈接的關(guān)系。當(dāng)我們修改其中一個(gè)文件的內(nèi)容時(shí),互為硬鏈接的文件的內(nèi)容也會(huì)跟著變化。如果我們刪除互為硬鏈接關(guān)系的某個(gè)文件時(shí),其它的文件并不受影響。比如我們把sun.txt刪除后,我們還是一樣能看到sun002.txt的內(nèi)容,并且sun02.txt仍是存在的。
可以這么理解,互為硬鏈接關(guān)系的文件,他們好象是克隆體,他們的屬性幾乎是完全一樣;
下面的例子,我們把sun.txt刪除,然后我們看一下sun002.txt 是不是能看到其內(nèi)容。
[root@localhost ~]# rm -rf sun.txt
[root@localhost ~]# more sun002.txt
注意:硬鏈接不能為目錄創(chuàng)建,只有文件才能創(chuàng)建硬鏈接。
2.12 軟鏈接的創(chuàng)建,及軟接與源文件的關(guān)系;
創(chuàng)建軟鏈接(也被稱為符號鏈接)的語法;
# ln -s 源文文件或目錄 目標(biāo)文件或目錄
軟鏈接也叫符號鏈接,他和硬鏈接有所不同,軟鏈接文件只是其源文件的一個(gè)標(biāo)記。當(dāng)我們刪除了源文件后,鏈接文件不能獨(dú)立存在,雖然仍保留文件名,但我們卻不能查看軟鏈接文件的內(nèi)容了。
[root@localhost ~]# ls -li linuxsir001.txt
2408274 -rw-r--r-- 1 root root 29 04-22 21:53 linuxsir001.txt
[root@localhost ~]# ln -s linuxsir001.txt linuxsir002.txt
[root@localhost ~]# ls -li linuxsir001.txt linuxsir002.txt
2408274 -rw-r--r-- 1 root root 29 04-22 21:53 linuxsir001.txt
2408795 lrwxrwxrwx 1 root root 15 04-22 21:54 linuxsir002.txt -> linuxsir001.txt
解釋
上面的例子,首先我們查看 linuxsir001.txt 的屬性,比如inode 、所屬文件種類、創(chuàng)建或修改時(shí)間等... ...我們來對比一下:
首先 對比一下節(jié)點(diǎn):兩個(gè)文件的節(jié)點(diǎn)不同;
其次 兩個(gè)文件的歸屬的種類不同 linuxsir001.txt是-,也就是普通文件,而linuxsir002.txt 是l,它是一個(gè)鏈接文件;
第三 兩個(gè)文件的讀寫權(quán)限不同 linuxsir001.txt 是rw-r--r-- ,而linuxsir002.txt的讀寫權(quán)限是 rwxrwxrwx
第三 兩者的硬鏈接個(gè)數(shù)相同;都是1
第四 兩文件的屬主和所歸屬的用戶組相同;
第五 修改(或訪問、創(chuàng)建)時(shí)間不同;
我們還注意到了linuxsir002.txt 后面有一個(gè)標(biāo)記 ->,這表示linuxsir002.txt 是linuxsir001.txt的軟鏈接文件。
值得我們注意的是:當(dāng)我們修改鏈接文件的內(nèi)容時(shí),就意味著我們在修改源文件的內(nèi)容。當(dāng)然源文件的屬性也會(huì)發(fā)生改變,鏈接文件的屬性并不會(huì)發(fā)生變化。當(dāng)我們把源文件刪除后,鏈接文件只存在一個(gè)文件名,因?yàn)槭チ嗽次募?,所以軟鏈接文件也就不存在了。這一點(diǎn)和硬鏈接是不同的;
[root@localhost ~]# rm -rf linuxsir001.txt 注:刪除linuxsir001.txt
[root@localhost ~]# ls -li linuxsir002.txt 注:查看linuxsir002 的屬性;
2408795 lrwxrwxrwx 1 root root 15 04-22 21:54 linuxsir002.txt -> linuxsir001.txt
[root@localhost ~]# more linuxsir002.txt 注:查看linuxsir002.txt的內(nèi)容;
linuxsir002.txt: 沒有那個(gè)文件或目錄 注:得到提示,linuxsir002.txt不存在。
上面的例子告訴我們,如果一個(gè)鏈接文件失去了源,就意味著他已經(jīng)不存在了;
我們可以看到軟鏈接文件,其實(shí)只是源文件的一個(gè)標(biāo)記,當(dāng)源文件失去時(shí),他也就是存在了。軟鏈接文件只是占用了inode來存儲軟鏈接文件屬性等信息,但文件存儲是指向源文件的。
軟件鏈接,可以為文件或目錄都適用。無論是軟鏈接還是硬鏈接,都可以用rm來刪除。rm工具是通用的。
參考資料:http://techcenter.dicder.com/2006/0908/content_185.htm 寫一些關(guān)于PL/SQL的語法,免得等到用到的時(shí)候還要去亂翻。
1。控制流程(if,while)
2。循環(huán)(for)
3。游標(biāo)(cursor)
4。異常處理(exception)
1??刂屏鞒蹋ǎ?br />
A.條件語句
IF <statement> THEN
?? PL/SQL
END IF;
IF <statement> THEN
?? PL/SQL
ELSE
?? PL/SQL
END IF;
IF
<statement> THEN
?? PL/SQL
ELSIF <statement> THEN
?? PL/SQL
END IF;
2。循環(huán)
A.simple loop
LOOP
?? SQL
?? EXIT WHEN <statement>;
END LOOP;
LOOP
?? SQL
?? IF
<statement>
THEN
?? EXIT;
?? END IF;
END LOOP;
B.While loop
WHILE <statement> LOOP
?? SQL
END LOOP;
C.For loop
FOR $counter in $low .. $high LOOP
?? SQL
END LOOP
3。游標(biāo)
在PL/SQL程序中定義的游標(biāo)叫做顯式游標(biāo)。
A.顯式游標(biāo)的處理由四個(gè)部分組成:
cursor $cursorname is $Query; --定義游標(biāo)
open $cursorname; --打開游標(biāo)
fetch $cursorname into $othervariable --把游標(biāo)中的東西取出
close $cursorname??? --關(guān)閉游標(biāo)
B.游標(biāo)屬性
%found?? ?? ?? 布爾型屬性,當(dāng)最近一次讀紀(jì)錄成功
時(shí)
,為true.
%nofound 失敗時(shí),為false.
%isopen
%rowcount?? ?? 返回已從游標(biāo)中讀取的記錄數(shù)。
C.參數(shù)化游標(biāo)
所有的SQL語句在上下文區(qū)內(nèi)部都是可執(zhí)行的,因此都有一個(gè)游標(biāo)指向上下文區(qū),此游標(biāo)就是所謂的SQL游標(biāo)。
與顯式游標(biāo)不同,SQL游標(biāo)不被程序打開和關(guān)閉。
4.異常處理概念
異常處理是用來處理正常執(zhí)行過程中未預(yù)料的事件。如果PL/SQL程序塊一旦產(chǎn)生異常而又沒有指出如何處理時(shí),程序會(huì)自動(dòng)終止。
異常處理部分放在PL/SQL的后半部分,結(jié)構(gòu)為:
EXCEPTION
?????? WHEN first_exception THEN <code to handle first exception>
?????? WHEN second_exception THEN <code to handle second exception>
?????? WHEN OTHERS THEN <
code to handle second exception
>? --OTHERS必須放在最后
異常分為預(yù)定義和用戶定義兩種。
用戶定義的異常是通過顯式使用RAISE語句來引發(fā)。如
DECLARE
? e_TooManyStudents EXCEPTION;? -- 類型為Exception,用于指示錯(cuò)誤條件
? v_CurrentStudents NUMBER(3);? -- HIS-101學(xué)生注冊當(dāng)前號
? v_MaxStudents NUMBER(3);????? -- HIS-101學(xué)生注冊允許的最大號
BEGIN
/* 找出注冊學(xué)生當(dāng)前號和允許的最大號 */
? SELECT current_students, max_students
??? INTO v_CurrentStudents, v_MaxStudents
??? FROM classes
??? WHERE department = 'HIS' AND course = 101;
? /* 檢查學(xué)生的號 */
? IF v_CurrentStudents > v_MaxStudents THEN
/* 太多的學(xué)生注冊,則觸發(fā)例外處理 */
? RAISE e_TooManyStudents;
? END IF;
EXCEPTION
? WHEN e_TooManyStudents THEN
??? /* 當(dāng)太多的學(xué)生注冊,就插入信息解釋發(fā)生過錯(cuò)誤 */
??? INSERT INTO log_table (info) VALUES ('History 101 has ' || v_CurrentStudents ||
????? 'students: max allowed is ' || v_MaxStudents);
END;
END;
用戶定義的的異常處理
可以使用RAISE_APPLICATION_ERROR來創(chuàng)建自己的錯(cuò)誤處理:
RAISE_APPLICATION_ERROR(error_number,error_message,[keep_errors]);
其中 error_number是從-20000到-20999之間的參數(shù); error_message是相應(yīng)的提示信息,小于512字節(jié)。如:
CREATE OR REPLACE PROCEDURE Register (
p_StudentID IN students.id%TYPE,
p_Department IN classes.department%TYPE,
p_Course IN classes.course%TYPE) AS
v_CurrentStudents NUMBER;? -- 班上學(xué)生的當(dāng)前號
v_MaxStudents NUMBER;????? -- 班上學(xué)生的最大號
BEGIN
/* 找出學(xué)生的當(dāng)前號和最大號 */
SELECT current_students, max_students
?INTO v_CurrentStudents, v_MaxStudents
FROM classes
WHERE course = p_Course
AND department = p_Department;
/*
確認(rèn)另外的學(xué)生是否有足夠的教室
*/
IF v_CurrentStudents + 1 > v_MaxStudents THEN
RAISE_APPLICATION_ERROR(-20000, 'Can''t add more students to ' ||
p_Department || ' ' || p_Course);
END IF;
/*
加一個(gè)學(xué)生在本班
*/
ClassPackage.AddStudent(p_StudentID, p_Department, p_Course);
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20001, p_Department || ' ' || p_Course ||
??? ?? ?? ' doesn''t exist!');
END Register;
???????????? 在《外部數(shù)據(jù)庫的連接原理》一講中我們說過,ODBC提供對多種數(shù)據(jù)庫的支持,如dBase、Access、MS?SQL?
????????????Server及Oracle,也就是說運(yùn)用ODBC數(shù)據(jù)源中所提供的連接代碼,我們可以實(shí)現(xiàn)對多種數(shù)據(jù)庫的連接。以連接Access數(shù)據(jù)庫為例,ODBC數(shù)據(jù)源連接文本的格式是:
???????????? “Driver={數(shù)據(jù)庫驅(qū)動(dòng)程序};Dbq=數(shù)據(jù)庫文件;”
???????????? 在以上連接文本中,如果數(shù)據(jù)庫跟程序在同一目錄下,或者用變量DefaultDir指定了數(shù)據(jù)庫所在目錄,則數(shù)據(jù)庫文件可以不用全路徑名,如下即可:
???????????? “ODBC;DBQ=MSAccess.mdb;Driver={Microsoft?Access?Driver?(*.mdb)};”
???????????? 如下也可:
???????????? “ODBC;DBQ=MSAccess.mdb;DefaultDir=d:\Downloads\e21;Driver={Microsoft?
????????????Access?Driver?(*.mdb)};”
???????????? 如果數(shù)據(jù)庫跟程序不在同一目錄下,或者沒有用變量DefaultDir指定數(shù)據(jù)庫所在目錄,則數(shù)據(jù)庫文件需要用全路徑名,如下:
???????????? “ODBC;DBQ=E:\Quake?III?Arena\MSAccess.mdb;Driver={Microsoft?Access?
????????????Driver?(*.mdb)};”
???????????? 以上所說的是連接Access數(shù)據(jù)庫的格式,那么連接其他數(shù)據(jù)庫的ODBC數(shù)據(jù)源連接文本又是怎樣的?連接不同類型的數(shù)據(jù)庫要使用不同的對應(yīng)驅(qū)動(dòng)程序,沒忘記吧!不同的驅(qū)動(dòng)程序當(dāng)然它們的參數(shù)組合也就不同了,每一種不同驅(qū)動(dòng)程序都有其特定的的參數(shù)形式:?
???????????? ⑴、MS?Access?ODBC?DSNless?連接:
???????????? ☆、參數(shù):Driver?設(shè)置值:{Microsoft?Access?Driver?(*.mdb)}
???????????? ☆、參數(shù):Dbq?設(shè)置值:實(shí)際路徑文件名稱
???????????? ☆、例句:
???????????? “Driver={Microsoft?Access?Driver?
????????????(*.mdb)};Dbq=c:\somepath\dbname.mdb;Uid=Admin;Pwd=pass;?”
???????????? ?、?、dBase?ODBC?DSNless?連接:?
???????????? ☆、參數(shù):Driver?設(shè)置值:{Microsoft?dBASE?Driver?(*.dbf)}
???????????? ☆、參數(shù):Dbq?設(shè)置值:實(shí)際路徑文件名稱
???????????? ☆、例句:
???????????? “Driver={Microsoft?dBASE?Driver?
????????????(*.dbf)};DriverID=277;Dbq=c:\somepath\dbname.dbf;?”
???????????? ?、?、Oracle?ODBC?DSNless?連接:
???????????? ☆、參數(shù):Driver?設(shè)置值:{Microsoft?ODBC?for?Oracle}
???????????? ☆、參數(shù):Dbq?設(shè)置值:實(shí)際路徑文件名稱
???????????? ☆、例句:
???????????? “Driver={Microsoft?ODBC?for?
????????????Oracle};Server=OracleServer.world;Uid=admin;Pwd=pass;?”
???????????? ⑷、MS?SQL?Server?DSNless?連接:?
???????????? ☆、參數(shù):Driver?設(shè)置值:{SQL?Server};
???????????? ☆、參數(shù):Server?設(shè)置值:服務(wù)器名稱
???????????? ☆、參數(shù):Database?設(shè)置值:數(shù)據(jù)表名稱
???????????? ☆、參數(shù):Uid?設(shè)置值:用戶名稱
???????????? ☆、參數(shù):Pwd?設(shè)置值:密碼
???????????? ☆、例句:
???????????? “Driver={SQL?
????????????Server};Server=servername;Database=dbname;Uid=sa;Pwd=pass;?”
???????????? ⑸、MS?Text?Driver?DSNless?連接:?
???????????? ☆、參數(shù):Driver?設(shè)置值:{Microsoft?Text?Driver?(*.txt;?*.csv)}
???????????? ☆、參數(shù):Dbq?設(shè)置值:實(shí)際路徑文件名稱
???????????? ☆、例句:
???????????? “Driver={Microsoft?Text?Driver?(*.txt;?
????????????*.csv)};Dbq=c:\somepath\;Extensions=asc,csv,tab,txt;Persist?Security?
????????????Info=False;?”
???????????? ⑹、Visual?Foxpro?DSNless?連接:
???????????? ☆、參數(shù):Driver?設(shè)置值:{Microsoft?Visual?FoxPro?Driver}
???????????? ☆、參數(shù):SourceType?設(shè)置值:DBC
???????????? ☆、參數(shù):SourceDB?設(shè)置值:實(shí)際路徑文件名稱?
???????????? ☆、例句:
???????????? “Driver={Microsoft?Visual?FoxPro?
????????????Driver};SourceType=DBC;SourceDB=c:\somepath\dbname.dbc;Exclusive=No;”?
???????????? ?、?、MySQL?DSNless?連接:
???????????? ☆、參數(shù):Driver?設(shè)置值:{mysql}
???????????? ☆、參數(shù):database?設(shè)置值:數(shù)據(jù)表名稱
???????????? ☆、參數(shù):uid?設(shè)置值:用戶名稱
???????????? ☆、參數(shù):pwd?設(shè)置值:密碼
???????????? ☆、例句:?
???????????? “driver={mysql};?
????????????database=yourdatabase;uid=username;pwd=password;option=16386”
????????????*******************************************************************
????????????SQL語言簡介?
???????????? 在上一講中我們介紹了連接外部數(shù)據(jù)庫的方法,那么連接之后怎樣對外部數(shù)據(jù)庫進(jìn)行讀取、顯示、增刪、更新、查詢等操作呢?這些操作需要通過外部數(shù)據(jù)庫等對象調(diào)用SQL指令才能完成。
???????????? ?、濉⑹裁词荢QL語言
???????????? SQL(Structure?Query?Languge,結(jié)構(gòu)化查詢語言)是一種數(shù)據(jù)庫專用的計(jì)算機(jī)語言,不管是Oracle、MS?
????????????SQL?
????????????、Access、MySQL或其他公司的數(shù)據(jù)庫,也不管數(shù)據(jù)庫建立在大型主機(jī)或個(gè)人計(jì)算機(jī)上,都可以使用SQL語言來訪問和修改數(shù)據(jù)庫的內(nèi)容。雖然不同公司的數(shù)據(jù)庫軟件多多少少會(huì)增加一些專屬的SQL語法,但大體上,它們還是遵循ASNI(美國國家標(biāo)準(zhǔn)協(xié)會(huì))制定的SQL標(biāo)準(zhǔn)。因?yàn)镾QL語言具有易學(xué)習(xí)及閱讀等特性,所以SQL逐漸被各種數(shù)據(jù)庫廠商采用,而成為一種共通的標(biāo)準(zhǔn)查詢語言。只要你學(xué)會(huì)SQL,即可操作各種數(shù)據(jù)庫如Visual?
????????????Foxpro、Access、dBase等等??傊?,SQL語言是各種數(shù)據(jù)庫都可以使用的數(shù)據(jù)庫查詢語言。
???????????? SQL語言不僅僅具有查詢數(shù)據(jù)庫的功能,而且可以對數(shù)據(jù)庫完成選取、增刪、更新與跳轉(zhuǎn)等各種操作。
???????????? ?、?、SQL語言的組成
???????????? SQL語言是由命令(函數(shù))、子句、運(yùn)算符、加總函數(shù)及通配符等組成,分述如下:
???????????? 1、命令
???????????? SQL的命令可分成數(shù)據(jù)定義語言與數(shù)據(jù)操作語言,數(shù)據(jù)定義語言可用來建立新的數(shù)據(jù)庫、數(shù)據(jù)表、字段及索引等,本教程不予介紹;另一為數(shù)據(jù)操作語言,可用來建立查詢表、排序、篩選數(shù)據(jù)、修改、增刪等動(dòng)作。數(shù)據(jù)定義語言命令常用的有選擇、添加、刪除和修改這四種:
???????????? ?、拧⒚睿篠ELECT
???????????? 中文意思:選擇
???????????? 說明:用于找出合乎條件的記錄
???????????? ?、啤⒚睿篒NSERT
???????????? 中文意思:插入
???????????? 說明:用于增加一筆記錄或合并兩個(gè)數(shù)據(jù)表
???????????? ⑶、命令:UPDATE
???????????? 中文意思:更新
???????????? 說明:用于更正合乎條件的記錄
???????????? ?、?、命令:DELETE
???????????? 中文意思:刪除
???????????? 說明:用于刪除合乎條件的記錄
???????????? 2、子句
???????????? 子句是用于設(shè)定命令要操作的對象(即參數(shù)),SQL所用的子句如下:
???????????? ?、?、子句:FROM?
???????????? 中文意思:數(shù)據(jù)表
???????????? 說明:用于指定數(shù)據(jù)表
???????????? ?、?、子句:WHERE
???????????? 中文意思:條件
???????????? 說明:用于設(shè)定條件
???????????? ?、?、GROUP?BY
???????????? 中文意思:分組(合并)
???????????? 說明:用于設(shè)定分組
???????????? ⑷、ORDER?BY
???????????? 中文意思:排序
???????????? 說明:用于設(shè)定輸出的順序及字段
???????????? 3、運(yùn)算符
???????????? 子句參數(shù)中的運(yùn)算符使子句構(gòu)成不同的語法格式,如“字段1='100'”、“字段1>'100'”等。運(yùn)算符又分邏輯運(yùn)算符與比較運(yùn)算符。
???????????? ◇邏輯運(yùn)算符如下:
???????????? ?、?、運(yùn)算符:AND
???????????? 中文意思:并且
???????????? 說明:邏輯且
???????????? ?、啤⑦\(yùn)算符:OR?
???????????? 中文意思:或者
???????????? 說明:邏輯非
???????????? ?、?、運(yùn)算符:NOT
???????????? 中文意思:取反
???????????? 說明:邏輯非或邏輯反
???????????? ◇比較運(yùn)算符如下:
???????????? ?、拧⑦\(yùn)算符:<?說明:小于
???????????? ?、啤⑦\(yùn)算符:≤?說明:小于等于
???????????? ?、?、運(yùn)算符:≥?說明:大于等于
???????????? ?、?、運(yùn)算符:>?說明:大于
???????????? ⑸、運(yùn)算符:=?說明:等于
???????????? ?、?、運(yùn)算符:<>?說明:不等于
???????????? ?、恕⑦\(yùn)算符:BETWEEN?說明:用于設(shè)定范圍?中文意思:在...之間
???????????? ?、獭⑦\(yùn)算符:LIKE?說明:用于通配設(shè)定?中文意思:如同
???????????? ?、?、運(yùn)算符:IN?說明:用于集合設(shè)定?中文意思:在...之內(nèi)
???????????? 4、加總函數(shù)
???????????? 加總函數(shù)常常運(yùn)用在命令的參數(shù)中,如:“SELECT?SUM(數(shù)學(xué)),AVG(數(shù)學(xué))?FROM?成績單”。
???????????? ⑴、加總函數(shù):AVG?
???????????? 中文意思:平均
???????????? 說明:用于求指定條件的平均?
???????????? ?、?、加總函數(shù):COUNT
???????????? 中文意思:數(shù)量
???????????? 說明:用于求指定的數(shù)量
???????????? ?、?、加總函數(shù):SUM
???????????? 中文意思:和
???????????? 說明:用于求指定條件的和
???????????? ⑷、加總函數(shù):MAX
???????????? 中文意思:最大值
???????????? 說明:用于求指定條件的最大值
???????????? ?、?、加總函數(shù):MIN
???????????? 中文意思:最小值
???????????? 說明:用于求指定條件的最小值
???????????? 5、通配符
???????????? ?、?、通配符:%?意義:任何長度的字符串(包括0)
???????????? ?、?、通配符:_?意義:下劃線表示任何一個(gè)字符
???????????? ⑶、通配符:[]?意義:中括號表示某個(gè)范圍內(nèi)的一個(gè)字符
???????????? 在下一講將說明SQL語言是怎樣把命令(函數(shù))、子句、運(yùn)算符、及加總函數(shù)等組合在一起的。
????????????*************************************************************************
????????????嵌入式SQL的應(yīng)用?
???????????? SQL語句可以單獨(dú)在數(shù)據(jù)庫系統(tǒng)本身中執(zhí)行,但如果運(yùn)用在其他編程工具所編制的程序中,一般不能單獨(dú)執(zhí)行,而要把SQL語句嵌入到高級語言(如易語言)中使用,通過高級語言的命令和方法來調(diào)用之,此時(shí)SQL稱為嵌入式SQL。調(diào)用SQL語句的程序稱為宿主程序,在易語言中一般是把SQL語句作為宿主程序的唯一參數(shù)來直接處理。嵌入式SQL在使用上有一些規(guī)定,在易語言中目前的版本規(guī)定如下:
???????????? ⑴、在程序中要區(qū)分SQL語句和宿主語言的語句。在易語言中好區(qū)分,因?yàn)镾QL語句形式是英文的,而易語言是中文的,但在實(shí)際應(yīng)用時(shí)仍然有可能會(huì)混亂,所以易語言要把SQL語句轉(zhuǎn)化為文本型才能調(diào)用,即嵌入式SQL語句兩邊要用雙引號來標(biāo)示。
???????????? ?、啤⒃试SSQL語句使用宿主程序的變量,但使用時(shí)要將宿主程序的變量跟外部數(shù)據(jù)庫中表格的字段名區(qū)別開來,區(qū)別方法如下:
???????????? ?、佟⒃谝渍Z言中要將變量類型轉(zhuǎn)化為文本型變量才能被SQL文本相加使用,比如下面的例子中有一個(gè)叫“數(shù)字1”的整數(shù)類型變量,插入到SQL文本中是這樣表達(dá):
???????????? 外部數(shù)據(jù)庫1.查詢?(“select?*?from?chj?where?”?+?組合框1.內(nèi)容?+?“=”?+?到文本?(數(shù)字1))
???????????? ②、包含字段名的SQL文本兩邊加雙引號,變量名不能在雙引號內(nèi),如上例。
???????????? ?、?、要將字段名跟字段值區(qū)別開來,區(qū)別方法如下:
???????????? ①、對于文本類型的字段,在其字段值兩邊要加上“'”號標(biāo)示其文本值,代表語法是:字段名稱=‘文本值’。如下:
???????????? 外部數(shù)據(jù)庫1.查詢?(“select?*?from?chj?where?姓名='山大王'”)
???????????? 又如下面“查找編輯框.內(nèi)容”中的字段值是文本型,嵌入式SQL語句如下:
???????????? 外部數(shù)據(jù)庫1.查詢?(“select?*?from?chj?where?姓名==”?+?“'”?+?查找編輯框.內(nèi)容?+?
“'”)
???????????? ?、?、對于數(shù)字類型的字段,在SQL語句中表示其字段值,兩邊不加符號標(biāo)示,代表語法是:字段名稱=數(shù)字值。如下兩例:
???????????? 外部數(shù)據(jù)庫1.查詢?(“select?*?from?chj?where?”?+?組合框1.內(nèi)容?+?“=”?+?查找編輯框.內(nèi)容)?
???????????? 外部數(shù)據(jù)庫1.查詢?(“select?*?from?chj?where?學(xué)號=17”)
???????????? ③、對于日期時(shí)間類型的字段,在其字段值兩邊要加上“#”號標(biāo)示其時(shí)間值,代表語法是:字段名稱=#時(shí)間值#。如下兩例:
???????????? 外部數(shù)據(jù)庫1.查詢?(“select?*?from?chj?where?入學(xué)時(shí)間?BETWEEN?#2001-01-01#?and?
????????????#2002-01-01#”)
???????????? 外部數(shù)據(jù)庫1.查詢?(“select?*?from?chj?where?”?+?組合框1.內(nèi)容?+?“=”?+?“#”?+?
????????????查找編輯框.內(nèi)容?+?“#”)
???????????? ?、?、也可以將SQL語句中的字段名(尤其是中文名)可用中括號括住,如:[字段名]。
????????????
???????????? ?、?、SQL語句要用半角輸入法輸入,否則可能會(huì)出錯(cuò)。
???????????? 那么在易語言中怎樣調(diào)用SQL語句呢?一般是在外部數(shù)據(jù)庫對象(控件)的方法中調(diào)用,試概括如下:
???????????? ?、?、對外部數(shù)據(jù)庫進(jìn)行查詢的方法。
???????????? 對外部數(shù)據(jù)庫的查詢就是在對外部數(shù)據(jù)庫不加編輯改動(dòng)的前提下,只通過記錄集來對數(shù)據(jù)庫進(jìn)行顯示、查詢、篩選、排序和記錄集的合并等操作。
???????????? 所有查詢類的方法起源于下面這個(gè)語句,其他查詢類語句是對這個(gè)語句的調(diào)用(將此語句作為唯一的參數(shù)),該語句如下:
???????????? 外部數(shù)據(jù)庫.查詢?(查詢類SQL語句)
???????????? 也可這樣表達(dá):
???????????? 外部數(shù)據(jù)庫.查詢?(“SELECT...FROM...[WHERE]...[GROUP?BY]...[ORDER?BY]...?”)
???????????? 該方法是對當(dāng)前被打開數(shù)據(jù)庫進(jìn)行數(shù)據(jù)查詢,返回的結(jié)果稱為“記錄集句柄”(即記錄集的標(biāo)記)。注意當(dāng)不再使用此記錄集時(shí),必須使用“關(guān)閉記錄集”將其關(guān)閉,如果失敗,返回0。在易語言中,將以上語句等同于記錄集句柄以作為其他查詢類語句的參數(shù)。為了使該參數(shù)在所有子程序中都能應(yīng)用,我們一般把它設(shè)置為整數(shù)型全局變量,并將其值設(shè)置如下:
???????????? 記錄集句柄=外部數(shù)據(jù)庫.查詢?(查詢類SQL語句)
???????????? 由于易語言要把SQL語句轉(zhuǎn)化為文本型才能調(diào)用,所以嵌入式SQL語句兩邊要有雙引號,例句:
???????????? 記錄集句柄?=?外部數(shù)據(jù)庫1.查詢?(“select?*?from?chj?”)
???????????? ※?“chj”是外部數(shù)據(jù)庫中一個(gè)表的名稱
???????????? 又如,欲得到排序的記錄集,應(yīng)象下面這樣賦值:
???????????? 記錄集句柄?=?外部數(shù)據(jù)庫1.查詢?(“SELECT?*?FROM?chj?ORDER?BY?語文?DESC”)
???????????? 現(xiàn)將外部數(shù)據(jù)庫控件中其他的查詢類方法列舉如下:
???????????? ①、外部數(shù)據(jù)庫.重新查詢?(記錄集句柄)?即:
???????????? 外部數(shù)據(jù)庫.重新查詢?(外部數(shù)據(jù)庫.查詢?(查詢類SQL語句))
???????????? 例句:外部數(shù)據(jù)庫1.重新查詢?(外部數(shù)據(jù)庫1.查詢?(“select?*?from?chj?”))?
???????????? ?、?、外部數(shù)據(jù)庫.首記錄前?(記錄集句柄)?即:
???????????? 外部數(shù)據(jù)庫.首記錄前?(外部數(shù)據(jù)庫.查詢?(查詢類SQL語句))
???????????? 例句:外部數(shù)據(jù)庫1.首記錄前?(記錄集句柄)
???????????? ?、?、外部數(shù)據(jù)庫.尾記錄后?(記錄集句柄)
???????????? ?、?、外部數(shù)據(jù)庫.到首記錄?(記錄集句柄)
???????????? ?、?、外部數(shù)據(jù)庫.到尾記錄?(記錄集句柄)
???????????? ⑥、外部數(shù)據(jù)庫.到前一記錄?(記錄集句柄)
???????????? ?、?、外部數(shù)據(jù)庫.到后一記錄?(記錄集句柄)
???????????? ?、唷⑼獠繑?shù)據(jù)庫.讀?(記錄集句柄,字段名稱或位置)
???????????? 例句:語文編輯框.內(nèi)容?=?到文本?(外部數(shù)據(jù)庫1.讀?(記錄集句柄,?“語文”))
???????????? ⑵、對外部數(shù)據(jù)庫進(jìn)行編輯的方法。
???????????? 所謂對外部數(shù)據(jù)庫的編輯,就是變更改動(dòng)外部數(shù)據(jù)庫本身,包括添加、更新、刪除等,對數(shù)據(jù)庫進(jìn)行編輯不必通過記錄集。所有非查詢類SQL語句都嵌入下面這個(gè)語句來執(zhí)行:
???????????? 外部數(shù)據(jù)庫.執(zhí)行?(非查詢類SQL語句)
???????????? ①、添加記錄,其語法如下:
???????????? 外部數(shù)據(jù)庫.執(zhí)行?(“insert?into?表名稱(字段1,字段2...)?values?(字段值1,字段值2...)?”)
???????????? 例句:
???????????? 外部數(shù)據(jù)庫1.執(zhí)行?(“INSERT?INTO?chj?”?+?“(學(xué)號,姓名,語文,數(shù)學(xué),英語)”?+?“?valueS?”?+?
????????????“(”?+?學(xué)號編輯框.內(nèi)容?+?“,'”?+?姓名編輯框.內(nèi)容?+?“','”?+?語文編輯框.內(nèi)容?+?“','”?+?
????????????數(shù)學(xué)編輯框.內(nèi)容?+?“','”?+?英語編輯框.內(nèi)容?+?“')”)
???????????? ?、?、更新記錄,其語法如下:
???????????? 外部數(shù)據(jù)庫.執(zhí)行?(“UPDATE?表名稱?SET?字段1=字段值1,字段2=字段值2...WHERE?條件式”)?
???????????? 例句:
???????????? 外部數(shù)據(jù)庫1.執(zhí)行?(“UPDATE?chj?SET?學(xué)號=”?+?“'”?+?學(xué)號編輯框.內(nèi)容?+?“',”?+?“姓名=”?
????????????+?“'”?+?姓名編輯框.內(nèi)容?+?“',”?+?“語文=”?+?“'”?+?語文編輯框.內(nèi)容?+?“',”?+?“數(shù)學(xué)=”?
????????????+?“'”?+?數(shù)學(xué)編輯框.內(nèi)容?+?“',”?+?“英語=”?+?“'”?+?英語編輯框.內(nèi)容?+?“'?”?+?“WHERE?
????????????姓名=”?+?“'”?+?姓名1?+?“'?”?+?“AND?語文=”?+?語文1?+?“AND?數(shù)學(xué)=”?+?數(shù)學(xué)1?+?“AND?
????????????英語=”?+?英語1?+?“AND?學(xué)號=”?+?學(xué)號1)
???????????? ?、?、刪除記錄,其語法如下:
???????????? 外部數(shù)據(jù)庫.執(zhí)行?(“DELETE?*?FROM?表名稱?WHERE?條件式”)
???????????? 例句:
???????????? 外部數(shù)據(jù)庫.執(zhí)行?(“外部數(shù)據(jù)庫1.執(zhí)行?(“DELETE?*?FROM?chj?”?+?“WHERE?姓名=”?+?“'”?+?
????????????姓名1?+?“'?”?+?“AND?語文=”?+?語文1?+?“AND?數(shù)學(xué)=”?+?數(shù)學(xué)1?+?“AND?英語=”?+?英語1?+?
????????????“AND?學(xué)號=”?+?學(xué)號1)”)
Java虛擬機(jī)
一、什么是Java虛擬機(jī)
Java虛擬機(jī)是一個(gè)想象中的機(jī)器,在實(shí)際的計(jì)算機(jī)上通過軟件模擬來實(shí)現(xiàn)。Java虛擬機(jī)有自己想象中的硬件,如處理器、堆棧、寄存器等,還具有相應(yīng)的指令系統(tǒng)。
1.為什么要使用Java虛擬機(jī)
Java語言的一個(gè)非常重要的特點(diǎn)就是與平臺的無關(guān)性。而使用Java虛擬機(jī)是實(shí)現(xiàn)這一特點(diǎn)的關(guān)鍵。一般的高級語言如果要在不同的平臺上運(yùn)行,至少需要編譯成不同的目標(biāo)代碼。而引入Java語言虛擬機(jī)后,Java語言在不同平臺上運(yùn)行時(shí)不需要重新編譯。Java語言使用模式Java虛擬機(jī)屏蔽了與具體平臺相關(guān)的信息,使得Java語言編譯程序只需生成在Java虛擬機(jī)上運(yùn)行的目標(biāo)代碼(字節(jié)碼),就可以在多種平臺上不加修改地運(yùn)行。Java虛擬機(jī)在執(zhí)行字節(jié)碼時(shí),把字節(jié)碼解釋成具體平臺上的機(jī)器指令執(zhí)行。
2.誰需要了解Java虛擬機(jī)
Java虛擬機(jī)是Java語言底層實(shí)現(xiàn)的基礎(chǔ),對Java語言感興趣的人都應(yīng)對Java虛擬機(jī)有個(gè)大概的了解。這有助于理解Java語言的一些性質(zhì),也有助于使用Java語言。對于要在特定平臺上實(shí)現(xiàn)Java虛擬機(jī)的軟件人員,Java語言的編譯器作者以及要用硬件芯片實(shí)現(xiàn)Java虛擬機(jī)的人來說,則必須深刻理解Java虛擬機(jī)的規(guī)范。另外,如果你想擴(kuò)展Java語言,或是把其它語言編譯成Java語言的字節(jié)碼,你也需要深入地了解Java虛擬機(jī)。
3.Java虛擬機(jī)支持的數(shù)據(jù)類型
Java虛擬機(jī)支持Java語言的基本數(shù)據(jù)類型如下:
byte://1字節(jié)有符號整數(shù)的補(bǔ)碼
short://2字節(jié)有符號整數(shù)的補(bǔ)碼
int://4字節(jié)有符號整數(shù)的補(bǔ)碼
long://8字節(jié)有符號整數(shù)的補(bǔ)碼
float://4字節(jié)IEEE754單精度浮點(diǎn)數(shù)
double://8字節(jié)IEEE754雙精度浮點(diǎn)數(shù)
char://2字節(jié)無符號Unicode字符
幾乎所有的Java類型檢查都是在編譯時(shí)完成的。上面列出的原始數(shù)據(jù)類型的數(shù)據(jù)在Java執(zhí)行時(shí)不需要用硬件標(biāo)記。操作這些原始數(shù)據(jù)類型數(shù)據(jù)的字節(jié)碼(指令)本身就已經(jīng)指出了操作數(shù)的數(shù)據(jù)類型,例如iadd、ladd、fadd和dadd指令都是把兩個(gè)數(shù)相加,其操作數(shù)類型別是int、long、float和double。虛擬機(jī)沒有給boolean(布爾)類型設(shè)置單獨(dú)的指令。boolean型的數(shù)據(jù)是由integer指令,包括integer返回來處理的。boolean型的數(shù)組則是用byte數(shù)組來處理的。虛擬機(jī)使用IEEE754格式的浮點(diǎn)數(shù)。不支持IEEE格式的較舊的計(jì)算機(jī),在運(yùn)行Java數(shù)值計(jì)算程序時(shí),可能會(huì)非常慢。
虛擬機(jī)支持的其它數(shù)據(jù)類型包括:
object//對一個(gè)Javaobject(對象)的4字節(jié)引用
returnAddress//4字節(jié),用于jsr/ret/jsr-w/ret-w指令
注:Java數(shù)組被當(dāng)作object處理。
虛擬機(jī)的規(guī)范對于object內(nèi)部的結(jié)構(gòu)沒有任何特殊的要求。在Sun公司的實(shí)現(xiàn)中,對object的引用是一個(gè)句柄,其中包含一對指針:一個(gè)指針指向該object的方法表,另一個(gè)指向該object的數(shù)據(jù)。用Java虛擬機(jī)的字節(jié)碼表示的程序應(yīng)該遵守類型規(guī)定。Java虛擬機(jī)的實(shí)現(xiàn)應(yīng)拒絕執(zhí)行違反了類型規(guī)定的字節(jié)碼程序。Java虛擬機(jī)由于字節(jié)碼定義的限制似乎只能運(yùn)行于32位地址空間的機(jī)器上。但是可以創(chuàng)建一個(gè)Java虛擬機(jī),它自動(dòng)地把字節(jié)碼轉(zhuǎn)換成64位的形式。從Java虛擬機(jī)支持的數(shù)據(jù)類型可以看出,Java對數(shù)據(jù)類型的內(nèi)部格式進(jìn)行了嚴(yán)格規(guī)定,這樣使得各種Java虛擬機(jī)的實(shí)現(xiàn)對數(shù)據(jù)的解釋是相同的,從而保證了Java的與平臺無關(guān)性和可
移植性。
二、Java虛擬機(jī)體系結(jié)構(gòu)
Java虛擬機(jī)由五個(gè)部分組成:一組指令集、一組寄存器、一個(gè)棧、一個(gè)無用單元收集堆(Garbage-collected-heap)、一個(gè)方法區(qū)域。這五部分是Java虛擬機(jī)的邏輯成份,不依賴任何實(shí)現(xiàn)技術(shù)或組織方式,但它們的功能必須在真實(shí)機(jī)器上以某種方式實(shí)現(xiàn)。
1.Java指令集
Java虛擬機(jī)支持大約248個(gè)字節(jié)碼。每個(gè)字節(jié)碼執(zhí)行一種基本的CPU運(yùn)算,例如,把一個(gè)整數(shù)加到寄存器,子程序轉(zhuǎn)移等。Java指令集相當(dāng)于Java程序的匯編語言。
Java指令集中的指令包含一個(gè)單字節(jié)的操作符,用于指定要執(zhí)行的操作,還有0個(gè)或多個(gè)操作數(shù),提供操作所需的參數(shù)或數(shù)據(jù)。許多指令沒有操作數(shù),僅由一個(gè)單字節(jié)的操作符構(gòu)成。
虛擬機(jī)的內(nèi)層循環(huán)的執(zhí)行過程如下:
do{
取一個(gè)操作符字節(jié);
根據(jù)操作符的值執(zhí)行一個(gè)動(dòng)作;
}while(程序未結(jié)束)
由于指令系統(tǒng)的簡單性,使得虛擬機(jī)執(zhí)行的過程十分簡單,從而有利于提高執(zhí)行的效率。指令中操作數(shù)的數(shù)量和大小是由操作符決定的。如果操作數(shù)比一個(gè)字節(jié)大,那么它存儲的順序是高位字節(jié)優(yōu)先。例如,一個(gè)16位的參數(shù)存放時(shí)占用兩個(gè)字節(jié),其值為:
第一個(gè)字節(jié)*256+第二個(gè)字節(jié)字節(jié)碼指令流一般只是字節(jié)對齊的。指令tabltch和lookup是例外,在這兩條指令內(nèi)部要求強(qiáng)制的4字節(jié)邊界對齊。
2.寄存器
Java虛擬機(jī)的寄存器用于保存機(jī)器的運(yùn)行狀態(tài),與微處理器中的某些專用寄存器類似。
Java虛擬機(jī)的寄存器有四種:
pc:Java程序計(jì)數(shù)器。
optop:指向操作數(shù)棧頂端的指針。
frame:指向當(dāng)前執(zhí)行方法的執(zhí)行環(huán)境的指針。
vars:指向當(dāng)前執(zhí)行方法的局部變量區(qū)第一個(gè)變量的指針。
Java虛擬機(jī)
Java虛擬機(jī)是棧式的,它不定義或使用寄存器來傳遞或接受參數(shù),其目的是為了保證指令集的簡潔性和實(shí)現(xiàn)時(shí)的高效性(特別是對于寄存器數(shù)目不多的處理器)。
所有寄存器都是32位的。
3.棧
Java虛擬機(jī)的棧有三個(gè)區(qū)域:局部變量區(qū)、運(yùn)行環(huán)境區(qū)、操作數(shù)區(qū)。
(1)局部變量區(qū) 每個(gè)Java方法使用一個(gè)固定大小的局部變量集。它們按照與vars寄存器的字偏移量來尋址。局部變量都是32位的。長整數(shù)和雙精度浮點(diǎn)數(shù)占據(jù)了兩個(gè)局部變量的空間,卻按照第一個(gè)局部變量的索引來尋址。(例如,一個(gè)具有索引n的局部變量,如果是一個(gè)雙精度浮點(diǎn)數(shù),那么它實(shí)際占據(jù)了索引n和n+1所代表的存儲空間。)虛擬機(jī)規(guī)范并不要求在局部變量中的64位的值是64位對齊的。虛擬機(jī)提供了把局部變量中的值裝載到操作數(shù)棧的指令,也提供了把操作數(shù)棧中的值寫入局部變量的指令。
(2)運(yùn)行環(huán)境區(qū) 在運(yùn)行環(huán)境中包含的信息用于動(dòng)態(tài)鏈接,正常的方法返回以及異常傳播。
·動(dòng)態(tài)鏈接
運(yùn)行環(huán)境包括對指向當(dāng)前類和當(dāng)前方法的解釋器符號表的指針,用于支持方法代碼的動(dòng)態(tài)鏈接。方法的class文件代碼在引用要調(diào)用的方法和要訪問的變量時(shí)使用符號。動(dòng)態(tài)鏈接把符號形式的方法調(diào)用翻譯成實(shí)際方法調(diào)用,裝載必要的類以解釋還沒有定義的符號,并把變量訪問翻譯成與這些變量運(yùn)行時(shí)的存儲結(jié)構(gòu)相應(yīng)的偏移地址。動(dòng)態(tài)鏈接方法和變量使得方法中使用的其它類的變化不會(huì)影響到本程序的代碼。
·正常的方法返回
如果當(dāng)前方法正常地結(jié)束了,在執(zhí)行了一條具有正確類型的返回指令時(shí),調(diào)用的方法會(huì)得到一個(gè)返回值。執(zhí)行環(huán)境在正常返回的情況下用于恢復(fù)調(diào)用者的寄存器,并把調(diào)用者的程序計(jì)數(shù)器增加一個(gè)恰當(dāng)?shù)臄?shù)值,以跳過已執(zhí)行過的方法調(diào)用指令,然后在調(diào)用者的執(zhí)行環(huán)境中繼續(xù)執(zhí)行下去。
·異常和錯(cuò)誤傳播
異常情況在Java中被稱作Error(錯(cuò)誤)或Exception(異常),是Throwable類的子類,在程序中的原因是:①動(dòng)態(tài)鏈接錯(cuò),如無法找到所需的class文件。②運(yùn)行時(shí)錯(cuò),如對一個(gè)空指針的引用
·程序使用了throw語句。
當(dāng)異常發(fā)生時(shí),Java虛擬機(jī)采取如下措施:
·檢查與當(dāng)前方法相聯(lián)系的catch子句表。每個(gè)catch子句包含其有效指令范圍,能夠處理的異常類型,以及處理異常的代碼塊地址。
·與異常相匹配的catch子句應(yīng)該符合下面的條件:造成異常的指令在其指令范圍之內(nèi),發(fā)生的異常類型是其能處理的異常類型的子類型。如果找到了匹配的catch子句,那么系統(tǒng)轉(zhuǎn)移到指定的異常處理塊處執(zhí)行;如果沒有找到異常處理塊,重復(fù)尋找匹配的catch子句的過程,直到當(dāng)前方法的所有嵌套的catch子句都被檢查過。
·由于虛擬機(jī)從第一個(gè)匹配的catch子句處繼續(xù)執(zhí)行,所以catch子句表中的順序是很重要的。因?yàn)镴ava代碼是結(jié)構(gòu)化的,因此總可以把某個(gè)方法的所有的異常處理器都按序排列到一個(gè)表中,對任意可能的程序計(jì)數(shù)器的值,都可以用線性的順序找到合適的異常處理塊,以處理在該程序計(jì)數(shù)器值下發(fā)生的異常情況。
·如果找不到匹配的catch子句,那么當(dāng)前方法得到一個(gè)"未截獲異常"的結(jié)果并返回到當(dāng)前方法的調(diào)用者,好像異常剛剛在其調(diào)用者中發(fā)生一樣。如果在調(diào)用者中仍然沒有找到相應(yīng)的異常處理塊,那么這種錯(cuò)誤傳播將被繼續(xù)下去。如果錯(cuò)誤被傳播到最頂層,那么系統(tǒng)將調(diào)用一個(gè)缺省的異常處理塊。
(3)操作數(shù)棧區(qū) 機(jī)器指令只從操作數(shù)棧中取操作數(shù),對它們進(jìn)行操作,并把結(jié)果返回到棧中。選擇棧結(jié)構(gòu)的原因是:在只有少量寄存器或非通用寄存器的機(jī)器(如Intel486)上,也能夠高效地模擬虛擬機(jī)的行為。操作數(shù)棧是32位的。它用于給方法傳遞參數(shù),并從方法接收結(jié)果,也用于支持操作的參數(shù),并保存操作的結(jié)果。例如,iadd指令將兩個(gè)整數(shù)相加。相加的兩個(gè)整數(shù)應(yīng)該是操作數(shù)棧頂?shù)膬蓚€(gè)字。這兩個(gè)字是由先前的指令壓進(jìn)堆棧的。這兩個(gè)整數(shù)將從堆棧彈出、相加,并把結(jié)果壓回到操作數(shù)棧中。
每個(gè)原始數(shù)據(jù)類型都有專門的指令對它們進(jìn)行必須的操作。每個(gè)操作數(shù)在棧中需要一個(gè)存儲位置,除了long和double型,它們需要兩個(gè)位置。操作數(shù)只能被適用于其類型的操作符所操作。例如,壓入兩個(gè)int類型的數(shù),如果把它們當(dāng)作是一個(gè)long類型的數(shù)則是非法的。在Sun的虛擬機(jī)實(shí)現(xiàn)中,這個(gè)限制由字節(jié)碼驗(yàn)證器強(qiáng)制實(shí)行。但是,有少數(shù)操作(操作符dupe和swap),用于對運(yùn)行時(shí)數(shù)據(jù)區(qū)進(jìn)行操作時(shí)是不考慮類型的。
4.無用單元收集堆
Java的堆是一個(gè)運(yùn)行時(shí)數(shù)據(jù)區(qū),類的實(shí)例(對象)從中分配空間。Java語言具有無用單元收集能力:它不給程序員顯式釋放對象的能力。Java不規(guī)定具體使用的無用單元收集算法,可以根據(jù)系統(tǒng)的需求使用各種各樣的算法。
5.方法區(qū)
方法區(qū)與傳統(tǒng)語言中的編譯后代碼或是Unix進(jìn)程中的正文段類似。它保存方法代碼(編譯后的java代碼)和符號表。在當(dāng)前的Java實(shí)現(xiàn)中,方法代碼不包括在無用單元收集堆中,但計(jì)劃在將來的版本中實(shí)現(xiàn)。每個(gè)類文件包含了一個(gè)Java類或一個(gè)Java界面的編譯后的代碼??梢哉f類文件是Java語言的執(zhí)行代碼文件。為了保證類文件的平臺無關(guān)性,Java虛擬機(jī)規(guī)范中對類文件的格式也作了詳細(xì)的說明。其具體細(xì)節(jié)請參考Sun公司的Java虛擬機(jī)規(guī)范。
Sun 提供的標(biāo)準(zhǔn) Java 開發(fā)包(JDK)沒有提供創(chuàng)建特定于平臺的可執(zhí)行文件的工具(一點(diǎn)都不吃驚,這是真的)。然而,其實(shí)有很多方法能夠幫助你實(shí)現(xiàn)這一想法。第三方工具
一種方法是使用第三方商業(yè)工具或免費(fèi)工具將 Java 應(yīng)用程序打包為一個(gè)可執(zhí)行文件。
下面是價(jià)格和特性都不同的兩個(gè)工具,但是在 Web 上還有其它幾個(gè)第三方工具可以免費(fèi)下載。
http://www.bysoft.se/sureshot/exej/
http://www.duckware.com/jexepack/
使用商業(yè)安裝程序(installer)
InstallAnywhere 是一個(gè)常用的安裝程序,它將管理應(yīng)用程序的安裝過程,并將應(yīng)用程序打包為可執(zhí)行程序。
使用 .jar
除了以上方法之外,還可以將應(yīng)用程序打包為一個(gè)可執(zhí)行的 .jar 文件,而不是一個(gè) .exe 文件。在這篇文章中我將不詳細(xì)介紹這種方法,你可以在這里找到一個(gè)非常棒的在線教程
你需要做的最重要的一件事是指定在 .jar 文件中哪個(gè)類是應(yīng)用程序的入口點(diǎn)。例如,對你的應(yīng)用程序來說就是具有一個(gè) public static void main(String[] args) 方法的引導(dǎo)類??梢栽?.jar 表示文件的 Main-Class 頭部信息中提供這些信息。這個(gè)頭部信息的通用形式為:Main-Class: classname,其中 classname 是應(yīng)用程序的入口點(diǎn)的類名稱。
使用 Java Webstart
Java Webstart 是標(biāo)準(zhǔn) Java 運(yùn)行時(shí)環(huán)境(JRE)的隱藏的寶物,自從版本 1.3 開始,JRE 就包含了 Java Webstart。它是一個(gè)簡單但功能強(qiáng)大且靈活的將應(yīng)用程序部署到任何平臺的方法。
Webstart 允許應(yīng)用程序的用戶從他們的瀏覽器、電子郵件或桌面啟動(dòng)和管理應(yīng)用程序。Java Webstart 的一個(gè)主要優(yōu)點(diǎn)是一旦應(yīng)用程序被安裝,在每次啟動(dòng)它時(shí),它都將會(huì)檢查用戶是否在運(yùn)行最新版本的應(yīng)用程序。如果不是,應(yīng)用程序?qū)⑼ㄟ^網(wǎng)絡(luò)裝載新版本到桌面然后執(zhí)行,因此解決了軟件傳播問題。
如果你的應(yīng)用程序已經(jīng)有很多用戶的話,這一點(diǎn)就尤其重要。還有很重要的一點(diǎn)是,它能夠檢查用戶的本地桌面環(huán)境,并能保證他們安裝了正確的 JRE 版本來運(yùn)行你的應(yīng)用程序。
Java Webstart 本身有一系列文章,所以我建議你訪問 Java Webstart Web 站點(diǎn)查看更多文檔和教程。
結(jié)束語
前兩種方法可能會(huì)滿足你對這個(gè)問題的需要,但是我強(qiáng)烈建議你仔細(xì)看一下 Java Webstart。它是 Java 標(biāo)準(zhǔn)的一部分,并且能夠在所有平臺下一致工作。我比較喜歡這個(gè)應(yīng)用程序打包方法。 摘要: Lucene In Action ch 6(I) 筆記 --自定義排序 ----- 2006-2-16?????? 使用 Lucene 來搜索內(nèi)容,搜索結(jié)果的顯示順序當(dāng)然是比較重要的.Lucene中Build-in的幾個(gè)排序定義在大多數(shù)情況下是不適合我們使用的.要適合自己的應(yīng)用程序的場景,就只能自定義排序功能,本節(jié)... 閱讀全文 摘要: Lucene In Action ch 5 筆記 --高級搜索技術(shù) ----- 2006-2-15 該章介紹了Lucene的一些高級技術(shù),如 結(jié)果排序,搜索多個(gè)Index,過慮技術(shù)....下面就看看這些高級技巧吧. I.Sorting search results ... 閱讀全文 摘要: Lucene In Action ch 4 筆記(I) -- Analysis ----- 2006-2-12 本章詳細(xì)的討論了 Lucene的分析處理過程和幾個(gè)Analyzer. 在indexing過程中要把需要indexing的text分析處理一下, 經(jīng)過處理和切詞 然后建立index. 而不通的Ana... 閱讀全文 摘要: 1. 實(shí)現(xiàn)一個(gè)簡單的search feature ?? 在本章中只限于討論簡單Lucene 搜索API, 有下面幾個(gè)相關(guān)的類: ?Lucene 基本搜索API: 類 ... 閱讀全文 摘要: Lucene In Action ch2 系統(tǒng)的講解了 indexing,下面就來看看吧. 1,indexing 的處理過程. ? 首先要把indexing的數(shù)據(jù)轉(zhuǎn)換為text,因?yàn)長ucene只能索引text,然后由Analysis來過慮text,把一些ch1中提到的所謂的stop words 過濾掉, 然后建... 閱讀全文
若人生是直線前進(jìn)的,
那么命中注定有若干的交點(diǎn),
認(rèn)識注定的人,
欣賞注定的風(fēng)景...
可人生還是有選擇的,
那么道路也就多了些分叉口,
錯(cuò)過注定的人,
錯(cuò)過注定的風(fēng)景...
若我曾經(jīng)再某個(gè)分叉路口選錯(cuò)了方向卻遇到了注定的人,該感謝上蒼賜予我的福氣吧!
可是人生又有了新的岔口,選擇有些艱難,但是面對幸福我很堅(jiān)定!
該怎么愛你
我聽 過你的微笑
就忘了 所有動(dòng)蕩
當(dāng)我靠過你的 那雙肩膀
也就忘了 塵土飛楊
我只是 一棵小草
孤單的 微不足道
當(dāng)你搬進(jìn)我的小小國度
我才相信 平凡的美好
該怎么愛你 我才不會(huì)忘
你的溫度 來過身旁
就算哪一天 失去了方向
愛過的 完整的 還在心上
該怎么愛你 才可以盼望
那種幸福 遠(yuǎn)遠(yuǎn)流長
就怕這時(shí)間 讓我趕不上
說一句 只一句 我曾到過天堂
我相信最燦爛的一秒
是守著你的眼光
不是熱烈擁抱
不是驚濤駭浪
我相信最美麗的風(fēng)光
是在彼此身旁
有另一雙肩膀
一起慢慢變老
| |||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
---|---|---|---|---|---|---|---|---|---|
26 | 27 | 28 | 29 | 30 | 1 | 2 | |||
3 | 4 | 5 | 6 | 7 | 8 | 9 | |||
10 | 11 | 12 | 13 | 14 | 15 | 16 | |||
17 | 18 | 19 | 20 | 21 | 22 | 23 | |||
24 | 25 | 26 | 27 | 28 | 29 | 30 | |||
31 | 1 | 2 | 3 | 4 | 5 | 6 |
歡迎探討,努力學(xué)習(xí)Java哈
常用鏈接
留言簿(3)
隨筆分類
- Java(11)
- JSP
- MyEclipse(1)
- Oracle 10g(3)
- Resin
- Spring
- SQL(4)
- Struts(1)
- Tomcat
- XML(2)
- 個(gè)人日志(1)
- 學(xué)習(xí)(5)
- 工作(1)
- 搜索引擎(7)
- 灌水(1)
- 貼圖
- 軟件工程
隨筆檔案
文章分類
文章檔案
Lansing's Download
Lansing's Link
我的博客
搜索
最新評論

- 1.?re: 關(guān)于ODBC數(shù)據(jù)源連接文本
- 評論內(nèi)容較長,點(diǎn)擊標(biāo)題查看
- --棱語明
- 2.?re: Oracle 10g TO_DATE() ora-01830 領(lǐng)悟共勉[未登錄]
- 評論內(nèi)容較長,點(diǎn)擊標(biāo)題查看
- --訪客
- 3.?re: Oracle 10g TO_DATE() ora-01830 領(lǐng)悟共勉
- 人才??!
- --歲月無聲
- 4.?re: Struts框架技術(shù)在J2EE中的研究和應(yīng)用[未登錄]
- dfetetgfgf
- --aa
- 5.?re: 關(guān)于ODBC數(shù)據(jù)源連接文本 [未登錄]
-
“坐在巷口的那對男女”呵呵 @blackbat
- --lansing