inode 譯成中文就是索引節(jié)點(diǎn)。每個(gè)存儲(chǔ)設(shè)備或存儲(chǔ)設(shè)備的分區(qū)(存儲(chǔ)設(shè)備是硬盤、軟盤、U盤 ... ... )被格式化為文件系統(tǒng)后,應(yīng)該有兩部份,一部份是inode,另一部份是Block,Block是用來存儲(chǔ)數(shù)據(jù)用的。而inode呢,就是用來存儲(chǔ)這些數(shù)據(jù)的信息,這些信息包括文件大小、屬主、歸屬的用戶組、讀寫權(quán)限等。inode為每個(gè)文件進(jìn)行信息索引,所以就有了inode的數(shù)值。操作系統(tǒng)根據(jù)指令,能通過inode值最快的找到相對(duì)應(yīng)的文件。
做個(gè)比喻,比如一本書,存儲(chǔ)設(shè)備或分區(qū)就相當(dāng)于這本書,Block相當(dāng)于書中的每一頁(yè),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值可以對(duì)應(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)建軟鏈接(也被稱為符號(hào)鏈接)的語法;
# ln -s 源文文件或目錄 目標(biāo)文件或目錄
軟鏈接也叫符號(hà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í)間等... ...我們來對(duì)比一下:
首先 對(duì)比一下節(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í),就意味著我們?cè)谛薷脑次募膬?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來存儲(chǔ)軟鏈接文件屬性等信息,但文件存儲(chǔ)是指向源文件的。
軟件鏈接,可以為文件或目錄都適用。無論是軟鏈接還是硬鏈接,都可以用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。控制流程()
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é)生注冊(cè)當(dāng)前號(hào)
? v_MaxStudents NUMBER(3);????? -- HIS-101學(xué)生注冊(cè)允許的最大號(hào)
BEGIN
/* 找出注冊(cè)學(xué)生當(dāng)前號(hào)和允許的最大號(hào) */
? SELECT current_students, max_students
??? INTO v_CurrentStudents, v_MaxStudents
??? FROM classes
??? WHERE department = 'HIS' AND course = 101;
? /* 檢查學(xué)生的號(hào) */
? IF v_CurrentStudents > v_MaxStudents THEN
/* 太多的學(xué)生注冊(cè),則觸發(fā)例外處理 */
? RAISE e_TooManyStudents;
? END IF;
EXCEPTION
? WHEN e_TooManyStudents THEN
??? /* 當(dāng)太多的學(xué)生注冊(cè),就插入信息解釋發(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)前號(hào)
v_MaxStudents NUMBER;????? -- 班上學(xué)生的最大號(hào)
BEGIN
/* 找出學(xué)生的當(dāng)前號(hào)和最大號(hào) */
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ù)庫(kù)的連接原理》一講中我們說過,ODBC提供對(duì)多種數(shù)據(jù)庫(kù)的支持,如dBase、Access、MS?SQL?
????????????Server及Oracle,也就是說運(yùn)用ODBC數(shù)據(jù)源中所提供的連接代碼,我們可以實(shí)現(xiàn)對(duì)多種數(shù)據(jù)庫(kù)的連接。以連接Access數(shù)據(jù)庫(kù)為例,ODBC數(shù)據(jù)源連接文本的格式是:
???????????? “Driver={數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序};Dbq=數(shù)據(jù)庫(kù)文件;”
???????????? 在以上連接文本中,如果數(shù)據(jù)庫(kù)跟程序在同一目錄下,或者用變量DefaultDir指定了數(shù)據(jù)庫(kù)所在目錄,則數(shù)據(jù)庫(kù)文件可以不用全路徑名,如下即可:
???????????? “ODBC;DBQ=MSAccess.mdb;Driver={Microsoft?Access?Driver?(*.mdb)};”
???????????? 如下也可:
???????????? “ODBC;DBQ=MSAccess.mdb;DefaultDir=d:\Downloads\e21;Driver={Microsoft?
????????????Access?Driver?(*.mdb)};”
???????????? 如果數(shù)據(jù)庫(kù)跟程序不在同一目錄下,或者沒有用變量DefaultDir指定數(shù)據(jù)庫(kù)所在目錄,則數(shù)據(jù)庫(kù)文件需要用全路徑名,如下:
???????????? “ODBC;DBQ=E:\Quake?III?Arena\MSAccess.mdb;Driver={Microsoft?Access?
????????????Driver?(*.mdb)};”
???????????? 以上所說的是連接Access數(shù)據(jù)庫(kù)的格式,那么連接其他數(shù)據(jù)庫(kù)的ODBC數(shù)據(jù)源連接文本又是怎樣的?連接不同類型的數(shù)據(jù)庫(kù)要使用不同的對(duì)應(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語言簡(jiǎn)介?
???????????? 在上一講中我們介紹了連接外部數(shù)據(jù)庫(kù)的方法,那么連接之后怎樣對(duì)外部數(shù)據(jù)庫(kù)進(jìn)行讀取、顯示、增刪、更新、查詢等操作呢?這些操作需要通過外部數(shù)據(jù)庫(kù)等對(duì)象調(diào)用SQL指令才能完成。
???????????? ㈠、什么是SQL語言
???????????? SQL(Structure?Query?Languge,結(jié)構(gòu)化查詢語言)是一種數(shù)據(jù)庫(kù)專用的計(jì)算機(jī)語言,不管是Oracle、MS?
????????????SQL?
????????????、Access、MySQL或其他公司的數(shù)據(jù)庫(kù),也不管數(shù)據(jù)庫(kù)建立在大型主機(jī)或個(gè)人計(jì)算機(jī)上,都可以使用SQL語言來訪問和修改數(shù)據(jù)庫(kù)的內(nèi)容。雖然不同公司的數(shù)據(jù)庫(kù)軟件多多少少會(huì)增加一些專屬的SQL語法,但大體上,它們還是遵循ASNI(美國(guó)國(guó)家標(biāo)準(zhǔn)協(xié)會(huì))制定的SQL標(biāo)準(zhǔn)。因?yàn)镾QL語言具有易學(xué)習(xí)及閱讀等特性,所以SQL逐漸被各種數(shù)據(jù)庫(kù)廠商采用,而成為一種共通的標(biāo)準(zhǔn)查詢語言。只要你學(xué)會(huì)SQL,即可操作各種數(shù)據(jù)庫(kù)如Visual?
????????????Foxpro、Access、dBase等等。總之,SQL語言是各種數(shù)據(jù)庫(kù)都可以使用的數(shù)據(jù)庫(kù)查詢語言。
???????????? SQL語言不僅僅具有查詢數(shù)據(jù)庫(kù)的功能,而且可以對(duì)數(shù)據(jù)庫(kù)完成選取、增刪、更新與跳轉(zhuǎn)等各種操作。
???????????? ㈡、SQL語言的組成
???????????? SQL語言是由命令(函數(shù))、子句、運(yùn)算符、加總函數(shù)及通配符等組成,分述如下:
???????????? 1、命令
???????????? SQL的命令可分成數(shù)據(jù)定義語言與數(shù)據(jù)操作語言,數(shù)據(jù)定義語言可用來建立新的數(shù)據(jù)庫(kù)、數(shù)據(jù)表、字段及索引等,本教程不予介紹;另一為數(shù)據(jù)操作語言,可用來建立查詢表、排序、篩選數(shù)據(jù)、修改、增刪等動(dòng)作。數(shù)據(jù)定義語言命令常用的有選擇、添加、刪除和修改這四種:
???????????? ⑴、命令:SELECT
???????????? 中文意思:選擇
???????????? 說明:用于找出合乎條件的記錄
???????????? ⑵、命令:INSERT
???????????? 中文意思:插入
???????????? 說明:用于增加一筆記錄或合并兩個(gè)數(shù)據(jù)表
???????????? ⑶、命令:UPDATE
???????????? 中文意思:更新
???????????? 說明:用于更正合乎條件的記錄
???????????? ⑷、命令:DELETE
???????????? 中文意思:刪除
???????????? 說明:用于刪除合乎條件的記錄
???????????? 2、子句
???????????? 子句是用于設(shè)定命令要操作的對(duì)象(即參數(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?成績(jī)單”。
???????????? ⑴、加總函數(shù):AVG?
???????????? 中文意思:平均
???????????? 說明:用于求指定條件的平均?
???????????? ⑵、加總函數(shù):COUNT
???????????? 中文意思:數(shù)量
???????????? 說明:用于求指定的數(shù)量
???????????? ⑶、加總函數(shù):SUM
???????????? 中文意思:和
???????????? 說明:用于求指定條件的和
???????????? ⑷、加總函數(shù):MAX
???????????? 中文意思:最大值
???????????? 說明:用于求指定條件的最大值
???????????? ⑸、加總函數(shù):MIN
???????????? 中文意思:最小值
???????????? 說明:用于求指定條件的最小值
???????????? 5、通配符
???????????? ⑴、通配符:%?意義:任何長(zhǎng)度的字符串(包括0)
???????????? ⑵、通配符:_?意義:下劃線表示任何一個(gè)字符
???????????? ⑶、通配符:[]?意義:中括號(hào)表示某個(gè)范圍內(nèi)的一個(gè)字符
???????????? 在下一講將說明SQL語言是怎樣把命令(函數(shù))、子句、運(yùn)算符、及加總函數(shù)等組合在一起的。
????????????*************************************************************************
????????????嵌入式SQL的應(yīng)用?
???????????? SQL語句可以單獨(dú)在數(shù)據(jù)庫(kù)系統(tǒng)本身中執(zhí)行,但如果運(yùn)用在其他編程工具所編制的程序中,一般不能單獨(dú)執(zhí)行,而要把SQL語句嵌入到高級(jí)語言(如易語言)中使用,通過高級(jí)語言的命令和方法來調(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語句兩邊要用雙引號(hào)來標(biāo)示。
???????????? ⑵、允許SQL語句使用宿主程序的變量,但使用時(shí)要將宿主程序的變量跟外部數(shù)據(jù)庫(kù)中表格的字段名區(qū)別開來,區(qū)別方法如下:
???????????? ①、在易語言中要將變量類型轉(zhuǎn)化為文本型變量才能被SQL文本相加使用,比如下面的例子中有一個(gè)叫“數(shù)字1”的整數(shù)類型變量,插入到SQL文本中是這樣表達(dá):
???????????? 外部數(shù)據(jù)庫(kù)1.查詢?(“select?*?from?chj?where?”?+?組合框1.內(nèi)容?+?“=”?+?到文本?(數(shù)字1))
???????????? ②、包含字段名的SQL文本兩邊加雙引號(hào),變量名不能在雙引號(hào)內(nèi),如上例。
???????????? ⑶、要將字段名跟字段值區(qū)別開來,區(qū)別方法如下:
???????????? ①、對(duì)于文本類型的字段,在其字段值兩邊要加上“'”號(hào)標(biāo)示其文本值,代表語法是:字段名稱=‘文本值’。如下:
???????????? 外部數(shù)據(jù)庫(kù)1.查詢?(“select?*?from?chj?where?姓名='山大王'”)
???????????? 又如下面“查找編輯框.內(nèi)容”中的字段值是文本型,嵌入式SQL語句如下:
???????????? 外部數(shù)據(jù)庫(kù)1.查詢?(“select?*?from?chj?where?姓名==”?+?“'”?+?查找編輯框.內(nèi)容?+?
“'”)
???????????? ②、對(duì)于數(shù)字類型的字段,在SQL語句中表示其字段值,兩邊不加符號(hào)標(biāo)示,代表語法是:字段名稱=數(shù)字值。如下兩例:
???????????? 外部數(shù)據(jù)庫(kù)1.查詢?(“select?*?from?chj?where?”?+?組合框1.內(nèi)容?+?“=”?+?查找編輯框.內(nèi)容)?
???????????? 外部數(shù)據(jù)庫(kù)1.查詢?(“select?*?from?chj?where?學(xué)號(hào)=17”)
???????????? ③、對(duì)于日期時(shí)間類型的字段,在其字段值兩邊要加上“#”號(hào)標(biāo)示其時(shí)間值,代表語法是:字段名稱=#時(shí)間值#。如下兩例:
???????????? 外部數(shù)據(jù)庫(kù)1.查詢?(“select?*?from?chj?where?入學(xué)時(shí)間?BETWEEN?#2001-01-01#?and?
????????????#2002-01-01#”)
???????????? 外部數(shù)據(jù)庫(kù)1.查詢?(“select?*?from?chj?where?”?+?組合框1.內(nèi)容?+?“=”?+?“#”?+?
????????????查找編輯框.內(nèi)容?+?“#”)
???????????? ④、也可以將SQL語句中的字段名(尤其是中文名)可用中括號(hào)括住,如:[字段名]。
????????????
???????????? ⑷、SQL語句要用半角輸入法輸入,否則可能會(huì)出錯(cuò)。
???????????? 那么在易語言中怎樣調(diào)用SQL語句呢?一般是在外部數(shù)據(jù)庫(kù)對(duì)象(控件)的方法中調(diào)用,試概括如下:
???????????? ⑴、對(duì)外部數(shù)據(jù)庫(kù)進(jìn)行查詢的方法。
???????????? 對(duì)外部數(shù)據(jù)庫(kù)的查詢就是在對(duì)外部數(shù)據(jù)庫(kù)不加編輯改動(dòng)的前提下,只通過記錄集來對(duì)數(shù)據(jù)庫(kù)進(jìn)行顯示、查詢、篩選、排序和記錄集的合并等操作。
???????????? 所有查詢類的方法起源于下面這個(gè)語句,其他查詢類語句是對(duì)這個(gè)語句的調(diào)用(將此語句作為唯一的參數(shù)),該語句如下:
???????????? 外部數(shù)據(jù)庫(kù).查詢?(查詢類SQL語句)
???????????? 也可這樣表達(dá):
???????????? 外部數(shù)據(jù)庫(kù).查詢?(“SELECT...FROM...[WHERE]...[GROUP?BY]...[ORDER?BY]...?”)
???????????? 該方法是對(duì)當(dāng)前被打開數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)查詢,返回的結(jié)果稱為“記錄集句柄”(即記錄集的標(biāo)記)。注意當(dāng)不再使用此記錄集時(shí),必須使用“關(guān)閉記錄集”將其關(guān)閉,如果失敗,返回0。在易語言中,將以上語句等同于記錄集句柄以作為其他查詢類語句的參數(shù)。為了使該參數(shù)在所有子程序中都能應(yīng)用,我們一般把它設(shè)置為整數(shù)型全局變量,并將其值設(shè)置如下:
???????????? 記錄集句柄=外部數(shù)據(jù)庫(kù).查詢?(查詢類SQL語句)
???????????? 由于易語言要把SQL語句轉(zhuǎn)化為文本型才能調(diào)用,所以嵌入式SQL語句兩邊要有雙引號(hào),例句:
???????????? 記錄集句柄?=?外部數(shù)據(jù)庫(kù)1.查詢?(“select?*?from?chj?”)
???????????? ※?“chj”是外部數(shù)據(jù)庫(kù)中一個(gè)表的名稱
???????????? 又如,欲得到排序的記錄集,應(yīng)象下面這樣賦值:
???????????? 記錄集句柄?=?外部數(shù)據(jù)庫(kù)1.查詢?(“SELECT?*?FROM?chj?ORDER?BY?語文?DESC”)
???????????? 現(xiàn)將外部數(shù)據(jù)庫(kù)控件中其他的查詢類方法列舉如下:
???????????? ①、外部數(shù)據(jù)庫(kù).重新查詢?(記錄集句柄)?即:
???????????? 外部數(shù)據(jù)庫(kù).重新查詢?(外部數(shù)據(jù)庫(kù).查詢?(查詢類SQL語句))
???????????? 例句:外部數(shù)據(jù)庫(kù)1.重新查詢?(外部數(shù)據(jù)庫(kù)1.查詢?(“select?*?from?chj?”))?
???????????? ②、外部數(shù)據(jù)庫(kù).首記錄前?(記錄集句柄)?即:
???????????? 外部數(shù)據(jù)庫(kù).首記錄前?(外部數(shù)據(jù)庫(kù).查詢?(查詢類SQL語句))
???????????? 例句:外部數(shù)據(jù)庫(kù)1.首記錄前?(記錄集句柄)
???????????? ③、外部數(shù)據(jù)庫(kù).尾記錄后?(記錄集句柄)
???????????? ④、外部數(shù)據(jù)庫(kù).到首記錄?(記錄集句柄)
???????????? ⑤、外部數(shù)據(jù)庫(kù).到尾記錄?(記錄集句柄)
???????????? ⑥、外部數(shù)據(jù)庫(kù).到前一記錄?(記錄集句柄)
???????????? ⑦、外部數(shù)據(jù)庫(kù).到后一記錄?(記錄集句柄)
???????????? ⑧、外部數(shù)據(jù)庫(kù).讀?(記錄集句柄,字段名稱或位置)
???????????? 例句:語文編輯框.內(nèi)容?=?到文本?(外部數(shù)據(jù)庫(kù)1.讀?(記錄集句柄,?“語文”))
???????????? ⑵、對(duì)外部數(shù)據(jù)庫(kù)進(jìn)行編輯的方法。
???????????? 所謂對(duì)外部數(shù)據(jù)庫(kù)的編輯,就是變更改動(dòng)外部數(shù)據(jù)庫(kù)本身,包括添加、更新、刪除等,對(duì)數(shù)據(jù)庫(kù)進(jìn)行編輯不必通過記錄集。所有非查詢類SQL語句都嵌入下面這個(gè)語句來執(zhí)行:
???????????? 外部數(shù)據(jù)庫(kù).執(zhí)行?(非查詢類SQL語句)
???????????? ①、添加記錄,其語法如下:
???????????? 外部數(shù)據(jù)庫(kù).執(zhí)行?(“insert?into?表名稱(字段1,字段2...)?values?(字段值1,字段值2...)?”)
???????????? 例句:
???????????? 外部數(shù)據(jù)庫(kù)1.執(zhí)行?(“INSERT?INTO?chj?”?+?“(學(xué)號(hào),姓名,語文,數(shù)學(xué),英語)”?+?“?valueS?”?+?
????????????“(”?+?學(xué)號(hào)編輯框.內(nèi)容?+?“,'”?+?姓名編輯框.內(nèi)容?+?“','”?+?語文編輯框.內(nèi)容?+?“','”?+?
????????????數(shù)學(xué)編輯框.內(nèi)容?+?“','”?+?英語編輯框.內(nèi)容?+?“')”)
???????????? ②、更新記錄,其語法如下:
???????????? 外部數(shù)據(jù)庫(kù).執(zhí)行?(“UPDATE?表名稱?SET?字段1=字段值1,字段2=字段值2...WHERE?條件式”)?
???????????? 例句:
???????????? 外部數(shù)據(jù)庫(kù)1.執(zhí)行?(“UPDATE?chj?SET?學(xué)號(hào)=”?+?“'”?+?學(xué)號(hào)編輯框.內(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é)號(hào)=”?+?學(xué)號(hào)1)
???????????? ③、刪除記錄,其語法如下:
???????????? 外部數(shù)據(jù)庫(kù).執(zhí)行?(“DELETE?*?FROM?表名稱?WHERE?條件式”)
???????????? 例句:
???????????? 外部數(shù)據(jù)庫(kù).執(zhí)行?(“外部數(shù)據(jù)庫(kù)1.執(zhí)行?(“DELETE?*?FROM?chj?”?+?“WHERE?姓名=”?+?“'”?+?
????????????姓名1?+?“'?”?+?“AND?語文=”?+?語文1?+?“AND?數(shù)學(xué)=”?+?數(shù)學(xué)1?+?“AND?英語=”?+?英語1?+?
????????????“AND?學(xué)號(hào)=”?+?學(xué)號(hào)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)就是與平臺(tái)的無關(guān)性。而使用Java虛擬機(jī)是實(shí)現(xiàn)這一特點(diǎn)的關(guān)鍵。一般的高級(jí)語言如果要在不同的平臺(tái)上運(yùn)行,至少需要編譯成不同的目標(biāo)代碼。而引入Java語言虛擬機(jī)后,Java語言在不同平臺(tái)上運(yùn)行時(shí)不需要重新編譯。Java語言使用模式Java虛擬機(jī)屏蔽了與具體平臺(tái)相關(guān)的信息,使得Java語言編譯程序只需生成在Java虛擬機(jī)上運(yùn)行的目標(biāo)代碼(字節(jié)碼),就可以在多種平臺(tái)上不加修改地運(yùn)行。Java虛擬機(jī)在執(zhí)行字節(jié)碼時(shí),把字節(jié)碼解釋成具體平臺(tái)上的機(jī)器指令執(zhí)行。
2.誰需要了解Java虛擬機(jī)
Java虛擬機(jī)是Java語言底層實(shí)現(xiàn)的基礎(chǔ),對(duì)Java語言感興趣的人都應(yīng)對(duì)Java虛擬機(jī)有個(gè)大概的了解。這有助于理解Java語言的一些性質(zhì),也有助于使用Java語言。對(duì)于要在特定平臺(tái)上實(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é)有符號(hào)整數(shù)的補(bǔ)碼
short://2字節(jié)有符號(hào)整數(shù)的補(bǔ)碼
int://4字節(jié)有符號(hào)整數(shù)的補(bǔ)碼
long://8字節(jié)有符號(hào)整數(shù)的補(bǔ)碼
float://4字節(jié)IEEE754單精度浮點(diǎn)數(shù)
double://8字節(jié)IEEE754雙精度浮點(diǎn)數(shù)
char://2字節(jié)無符號(hào)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//對(duì)一個(gè)Javaobject(對(duì)象)的4字節(jié)引用
returnAddress//4字節(jié),用于jsr/ret/jsr-w/ret-w指令
注:Java數(shù)組被當(dāng)作object處理。
虛擬機(jī)的規(guī)范對(duì)于object內(nèi)部的結(jié)構(gòu)沒有任何特殊的要求。在Sun公司的實(shí)現(xiàn)中,對(duì)object的引用是一個(gè)句柄,其中包含一對(duì)指針:一個(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對(duì)數(shù)據(jù)類型的內(nèi)部格式進(jìn)行了嚴(yán)格規(guī)定,這樣使得各種Java虛擬機(jī)的實(shí)現(xiàn)對(duì)數(shù)據(jù)的解釋是相同的,從而保證了Java的與平臺(tái)無關(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)的簡(jiǎn)單性,使得虛擬機(jī)執(zhí)行的過程十分簡(jiǎn)單,從而有利于提高執(zhí)行的效率。指令中操作數(shù)的數(shù)量和大小是由操作符決定的。如果操作數(shù)比一個(gè)字節(jié)大,那么它存儲(chǔ)的順序是高位字節(jié)優(yōu)先。例如,一個(gè)16位的參數(shù)存放時(shí)占用兩個(gè)字節(jié),其值為:
第一個(gè)字節(jié)*256+第二個(gè)字節(jié)字節(jié)碼指令流一般只是字節(jié)對(duì)齊的。指令tabltch和lookup是例外,在這兩條指令內(nèi)部要求強(qiáng)制的4字節(jié)邊界對(duì)齊。
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ù),其目的是為了保證指令集的簡(jiǎn)潔性和實(shí)現(xiàn)時(shí)的高效性(特別是對(duì)于寄存器數(shù)目不多的處理器)。
所有寄存器都是32位的。
3.棧
Java虛擬機(jī)的棧有三個(gè)區(qū)域:局部變量區(qū)、運(yùn)行環(huán)境區(qū)、操作數(shù)區(qū)。
(1)局部變量區(qū) 每個(gè)Java方法使用一個(gè)固定大小的局部變量集。它們按照與vars寄存器的字偏移量來尋址。局部變量都是32位的。長(zhǎng)整數(shù)和雙精度浮點(diǎn)數(shù)占據(jù)了兩個(gè)局部變量的空間,卻按照第一個(gè)局部變量的索引來尋址。(例如,一個(gè)具有索引n的局部變量,如果是一個(gè)雙精度浮點(diǎn)數(shù),那么它實(shí)際占據(jù)了索引n和n+1所代表的存儲(chǔ)空間。)虛擬機(jī)規(guī)范并不要求在局部變量中的64位的值是64位對(duì)齊的。虛擬機(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)境包括對(duì)指向當(dāng)前類和當(dāng)前方法的解釋器符號(hào)表的指針,用于支持方法代碼的動(dòng)態(tài)鏈接。方法的class文件代碼在引用要調(diào)用的方法和要訪問的變量時(shí)使用符號(hào)。動(dòng)態(tài)鏈接把符號(hào)形式的方法調(diào)用翻譯成實(shí)際方法調(diào)用,裝載必要的類以解釋還沒有定義的符號(hào),并把變量訪問翻譯成與這些變量運(yùn)行時(shí)的存儲(chǔ)結(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ò),如對(duì)一個(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è)表中,對(duì)任意可能的程序計(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ù),對(duì)它們進(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ù)類型都有專門的指令對(duì)它們進(jìn)行必須的操作。每個(gè)操作數(shù)在棧中需要一個(gè)存儲(chǔ)位置,除了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),用于對(duì)運(yùn)行時(shí)數(shù)據(jù)區(qū)進(jìn)行操作時(shí)是不考慮類型的。
4.無用單元收集堆
Java的堆是一個(gè)運(yùn)行時(shí)數(shù)據(jù)區(qū),類的實(shí)例(對(duì)象)從中分配空間。Java語言具有無用單元收集能力:它不給程序員顯式釋放對(duì)象的能力。Java不規(guī)定具體使用的無用單元收集算法,可以根據(jù)系統(tǒng)的需求使用各種各樣的算法。
5.方法區(qū)
方法區(qū)與傳統(tǒng)語言中的編譯后代碼或是Unix進(jìn)程中的正文段類似。它保存方法代碼(編譯后的java代碼)和符號(hào)表。在當(dāng)前的Java實(shí)現(xiàn)中,方法代碼不包括在無用單元收集堆中,但計(jì)劃在將來的版本中實(shí)現(xiàn)。每個(gè)類文件包含了一個(gè)Java類或一個(gè)Java界面的編譯后的代碼。可以說類文件是Java語言的執(zhí)行代碼文件。為了保證類文件的平臺(tái)無關(guān)性,Java虛擬機(jī)規(guī)范中對(duì)類文件的格式也作了詳細(xì)的說明。其具體細(xì)節(jié)請(qǐng)參考Sun公司的Java虛擬機(jī)規(guī)范。
Sun 提供的標(biāo)準(zhǔn) Java 開發(fā)包(JDK)沒有提供創(chuàng)建特定于平臺(tái)的可執(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)。例如,對(duì)你的應(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è)簡(jiǎn)單但功能強(qiáng)大且靈活的將應(yīng)用程序部署到任何平臺(tái)的方法。
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ì)滿足你對(duì)這個(gè)問題的需要,但是我強(qiáng)烈建議你仔細(xì)看一下 Java Webstart。它是 Java 標(biāo)準(zhǔn)的一部分,并且能夠在所有平臺(tái)下一致工作。我比較喜歡這個(gè)應(yīng)用程序打包方法。
| |||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
---|---|---|---|---|---|---|---|---|---|
31 | 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 | 7 | 8 | 9 | 10 |
歡迎探討,努力學(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
我的博客
搜索
最新評(píng)論

- 1.?re: 關(guān)于ODBC數(shù)據(jù)源連接文本
- 評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
- --棱語明
- 2.?re: Oracle 10g TO_DATE() ora-01830 領(lǐng)悟共勉[未登錄]
- 評(píng)論內(nèi)容較長(zhǎng),點(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ù)源連接文本 [未登錄]
-
“坐在巷口的那對(duì)男女”呵呵 @blackbat
- --lansing