P. 1
All_Java02

All_Java02

|Views: 323|Likes:
Published by Phong Ziggy

More info:

Published by: Phong Ziggy on Mar 21, 2011
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

08/21/2011

pdf

text

original

Sections

  • Ch ng 1: CÁC KHÁI NI M C B N
  • BÀI 1. LÀM QUEN V I JAVA
  • I. L ch s java
  • II. Java em là ai
  • II. M t s c tr ng c a java
  • III. Các ki u ng d ng Java
  • IV. Máy o Java (JVM-Java Virtual Machine)
  • BÀI 2 N N T NG C A JAVA
  • I. T p ký t dùng trong java
  • II. T khoá c a Java
  • III. nh danh (tên)
  • IV. C u trúc m t ch ng trình java
  • V. Ch ng trình JAVA u tiên
  • VI. Chú thích trongch ng trình
  • VII. Ki u d li u
  • VII. M t s phép toán trên ki u d li u nguyên thu
  • IX. Toán t chuy n ki u
  • X. Các hàm toán h c
  • XI. Các phép toán trên ki u kí t
  • BÀI 3. U KHI N LU NG CH NG TRÌNH
  • I.C u trúc r nhánh
  • II. C u trúc l p while và do-while
  • III. C u trúc for
  • IV. L nh break và continue
  • Ch ng 2: L P TRÌNH H NG I T NG
  • BÀI 1. NH NGH A L P
  • I. Khai báo l p
  • II. Chi ti t v khai báo m t ph ng th c
  • III. T khoá this
  • IV. T khoá super
  • V. S d ng l p
  • VI. i u khi n vi c truy c p n các thành viên c a m t l p
  • BÀI 2. KH I U VÀ D N D P
  • I. Ph ng th c t o d ng (constructor)
  • II. Kh i kh i u vô danh và kh i kh i u t nh
  • III. D n d p: k t thúc và thu rác
  • BÀI 3. CÁC THÀNH PH N T NH
  • I. Thu c tính t nh
  • BÀI 4. N P CH NG PH NG TH C
  • I. Khái ni m v ph ng th c b i t i
  • II. Yêu c u c a các ph ng th c b i t i
  • BÀI 5. K TH A (INHERITANCE)
  • I. L p c s và l p d n xu t
  • II. Cách xây d ng l p d n xu t
  • } III. Th a k các thu c tính
  • IV. Th a k ph ng th c
  • V. Kh i u l p c s
  • VI. Ghi è ph ngth c ( Override )
  • VI. Thành ph n protected
  • VII. T khoá final
  • BÀI 6. L P C S TR U T NG
  • BÀI 7. A HÌNH THÁI
  • BÀI 8. GIAO DI N, L P TRONG, GÓI
  • I. Giao di n
  • II. L p trong
  • Bài 9. M NG, XÂU KÝ T , T P H P
  • I. M ng
  • II. Xâu ký t
  • III.L p StringTokenizer
  • IV. M t s l p c b n c a Java
  • V. Các l p t p h p
  • Ch ng 3: X LÝ NGO I L
  • I. M c ích c a vi c x lý ngo i l
  • II. Mô hình s lý ngo i l c a java
  • III. c t ngo i l
  • III. Ném ra ngo i l
  • IV. B t ngo i l
  • Ch ng 4: L P TRÌNH A TUY N
  • I. Các ki n th c liên quan
  • II. L p trình a tuy n trong Java
  • Ch ng 5: NH P XU T (Input/Output)
  • I. L p lu ng
  • II. L p File
  • Ch ng 6: L P TRÌNH HO AWT
  • I. Gi i thi u v h th ng ho c a Java
  • II. Trình qu n lý hi n th trong Java
  • III. X lý s ki n trong Java
  • Ch ng 7 L P TRÌNH C S D LI U
  • II. Các k u trình u khi n JDBC
  • III. Các l p trong JDBC API dùng truy c p CSDL
  • IV. K t n i CSDL v i JDBC
  • V. T ng tác v i CSDL
  • VI. Qu n lý giao d ch
  • Ch ng 8: L P TRÌNH SOCKET
  • II. Kh o sát m t s l p trong gói java.net
  • 2. L p URL và URI
  • 3. L p Socket
  • 4. L p ServerSocket
  • 5. L p DatagramSocket
  • 6. L p DatagramPacket
  • III. TCP Socket
  • Ch ng 9: JAVA MAIL
  • I. Các khái ni m MAIL
  • II. G i mail v i th vi n có s n c a java
  • III. Gi i thi u java mail API
  • III. G i mail
  • IV. Nh n mail
  • V. Xoá mail
  • 1. Xoá mail
  • I. RMI và l p trình phân tán i t ng
  • II. G i ph ng th c t xa và các v n phát sinh
  • III. Vai trò c a các l p trung gian
  • IV. Cài t i t ng phân tán
  • Ch ng 11: JAVA JSP (JAVA SERVLET)
  • Ch ng 12: EJB (ENTERPRISE JAVA BEANS)
  • I. T ng quan v JavaBean
  • II. Xây d ng thành ph n JavaBean
  • III. Tìm hi u Instrospector
  • IV. óng gói JavaBean

Trang 1

Tr - ê n g ®¹ i h ä c s- ph ¹ m k ü t h uËt h - ng y ª n
k h o a c « n g n g h Ö t h « n g t i n
---------------ooo------------------
§ Ò c - ¬ n g bµ i g i ¶ n g Ja v a
Nhóm biên soan: 1. Hoàng Trong Thê
2. Nguyên Duy Tân
Trang 2
MUC LUC
Chuong 1: CÁC KHÁI NIEM CO BAN.................................................................. 5
BÀI 1. LÀM QUEN VÓI JAVA................................................................................... 5
I. Lich su java ........................................................................................................... 5
II. Java em là ai ......................................................................................................... 5
II. Môt sô dác trung cua java ..................................................................................... 5
III. Các kiêu ung dung Java........................................................................................ 7
IV. Máy ao Java (JVM-Java Virtual Machine) .......................................................... 7
BÀI 2 NEN TANG CUA JAVA ................................................................................ 9
I. Tâp ký tu dùng trong java ...................................................................................... 9
II. Tu khoá cua Java .................................................................................................. 9
III. Dinh danh (tên) ................................................................................................. 10
IV. Câu trúc môt chuong trình java ......................................................................... 10
V. Chuong trình JAVA dâu tiên .............................................................................. 12
VI. Chú thích trong chuong trình ............................................................................ 14
VII. Kiêu du liêu ..................................................................................................... 15
VII. Môt sô phép toán trên kiêu du liêu nguyên thuy ............................................... 17
IX. Toán tu chuyên kiêu .......................................................................................... 23
X. Các hàm toán hoc ............................................................................................... 24
XI. Các phép toán trên kiêu kí tu ............................................................................. 26
BÀI 3. DIEU KHIEN LUONG CHUONG TRÌNH .................................................... 27
I. Câu trúc rë nhánh ................................................................................................. 27
II. Câu trúc láp while và do-while ........................................................................... 30
III. Câu trúc for ....................................................................................................... 32
IV. Lênh break và continue ..................................................................................... 34
Chuong 2: LAP TRÌNH HUÓNG DOI TUONG ......................................................... 37
BÀI 1. DINH NGHÌA LÓP ....................................................................................... 38
I. Khai báo lop ........................................................................................................ 38
II. Chi tiêt vê khai báo môt phuong thuc ................................................................. 40
III. Tu khoá this ...................................................................................................... 43
IV. Tu khoá super ................................................................................................... 43
V. Su dung lop ........................................................................................................ 44
VI. Diêu khiên viêc truy câp dên các thành viên cua môt lop .................................. 44
BÀI 2. KHOI DAU VÀ DON DEP ............................................................................ 47
I. Phuong thuc tao dung (constructor) ..................................................................... 47
II. Khôi khoi dâu vô danh và khôi khoi dâu tinh ...................................................... 49
III. Don dep: kêt thúc và thu rác .............................................................................. 51
BÀI 3. CÁC THÀNH PHAN TÌNH ........................................................................... 52
I. Thuôc tính tinh .................................................................................................... 52
II. Phuong thuc tinh ................................................................................................ 52
BÀI 4. NAP CHONG PHUONG THUC .................................................................. 53
I. Khái niêm vê phuong thuc bôi tai ........................................................................ 53
Trang 3
II. Yêu câu cua các phuong thuc bôi tai ................................................................... 53
BÀI 5. KE THUA (INHERITANCE) ........................................................................ 54
I. Lop co so và lop dân xuât .................................................................................... 54
II. Cách xây dung lop dân xuât ................................................................................ 54
III. Thua kê các thuôc tính ...................................................................................... 54
IV. Thua kê phuong thuc ........................................................................................ 54
V. Khoi dâu lop co so ............................................................................................. 54
VI. Ghi dè phuong thuc ( Override ) ....................................................................... 56
VI. Thành phân protected ........................................................................................ 56
VII. Tu khoá final ................................................................................................... 56
BÀI 6. LÓP CO SO TRUU TUONG ......................................................................... 61
BÀI 7. DA HÌNH THÁI ............................................................................................ 62
BÀI 8. GIAO DIEN, LÓP TRONG, GÓI ................................................................... 63
I. Giao diên ............................................................................................................. 63
II. Lop trong ............................................................................................................ 65
Bài 9. MANG, XÂU KÝ TU, TAP HOP ................................................................... 67
I. Mang ................................................................................................................... 67
II. Xâu ký tu ............................................................................................................ 70
III. Lop StringTokenizer ......................................................................................... 75
IV. Môt sô lop co ban cua Java ............................................................................... 77
V. Các lop tâp hop .................................................................................................. 83
Chuong 3: XU LÝ NGOAI LE ............................................................................ 92
I. Muc dích cua viêc xu lý ngoai lê .......................................................................... 92
II. Mô hình su lý ngoai lê cua java .......................................................................... 92
III. Dác ta ngoai lê ................................................................................................... 93
III. Ném ra ngoai lê ................................................................................................. 93
IV. Bát ngoai lê ....................................................................................................... 93
V. Khôi ‘finally’ ...................................................................................................... 95
VI. Môt sô lop ngoai lê chuân cua Java ................................................................... 96
Chuong 4: LAP TRÌNH DA TUYEN ........................................................................ 97
I. Các kiên thuc liên quan ........................................................................................ 97
II. Lâp trình da tuyên trong Java .............................................................................. 98
Chuong 5: NHAP XUAT (Input/Output) ............................................................... 104
I. Lop luông .......................................................................................................... 105
II. Lop File ............................................................................................................ 113
Chuong 6: LAP TRÌNH DO HOA AWT ................................................................ 120
I. Gioi thiêu vê hê thông dô hoa cua Java .............................................................. 120
II. Trình quan lý hiên thi trong Java ...................................................................... 124
III. Xu lý su kiên trong Java .................................................................................. 125
Chuong 7 LAP TRÌNH CO SO DÙ LIEU .............................................................. 143
I. Tông quan 143
II. Các kêu trình diêu khiên JDBC......................................................................... 143
Trang 4
III. Các lop trong JDBC API dùng dê truy câp CSDL ........................................... 146
IV. Kêt nôi CSDL voi JDBC ................................................................................. 147
V. Tuong tác voi CSDL ........................................................................................ 152
VI. Quan lý giao dich ............................................................................................ 160
Chuong 8: LAP TRÌNH SOCKET .............................................................................. 164
I. Các kiên thuc liên quan ...................................................................................... 164
II. Khao sát môt sô lop trong gói java.net .............................................................. 164
2. Lop URL và URI .............................................................................................. 171
3. Lop Socket........................................................................................................ 176
4. Lop ServerSocket.............................................................................................. 182
5. Lop DatagramSocket ......................................................................................... 185
6. Lop DatagramPacket ......................................................................................... 185
III. TCP Socket ..................................................................................................... 185
Chuong 9: JAVA MAIL .............................................................................................. 205
I. Các khái niêm MAIL ......................................................................................... 205
II. Gui mail voi thu viên có sán cua java ............................................................... 206
III. Gioi thiêu java mail API .................................................................................. 207
III. Gui mail .......................................................................................................... 212
IV. Nhân mail ....................................................................................................... 215
V. Xoá mail ........................................................................................................... 221
Chuong 10: LAP TRÌNH PHÂN TÁN VÓI ................................................................. 222
JAVA RMI ( REMOTE METHOD INVOKE)............................................................. 222
I. RMI và lâp trình phân tán dôi tuong .................................................................. 222
II. Goi phuong thuc tu xa và các vân dê phát sinh ................................................. 223
III. Vai trò cua các lop trung gian .......................................................................... 223
IV. Cài dát dôi tuong phân tán .............................................................................. 224
Chuong 11: JAVA JSP (JAVA SERVLET) ................................................................. 233
Chuong 12: EJB (ENTERPRISE JAVA BEANS) ........................................................ 234
I. Tông quan vê JavaBean ..................................................................................... 234
II. Xây dung thành phân JavaBean ........................................................................ 234
III. Tìm hiêu Instrospector ..................................................................................... 247
IV. Dóng gói JavaBean ......................................................................................... 249
Trang 5
Chuong 1: CÁC KHÁI NIEM CO BAN
BÀI 1. LÀM QUEN VÓI JAVA
I. Lich su java
Java là môt ngôn ngu lâp trình duoc Sun Microsystems gioi thiêu vào tháng 6 nám
1995. Tu dó, nó dã tro thành môt công cu lâp trình cua các lâp trình viên chuyên nghiêp.
Java duoc xây dung trên nên tang cua C và C++. Do vây nó su dung các cú pháp cua C và
các dác trung huong dôi tuong cua C++.
Ban dâu Java duoc thiêt kê dê làm ngôn ngu viêt chuong trình cho các san phâm
diên tu dân dung nhu dâu video, tivi, diên thoai, máy nhán tin.. . Tuy nhiên voi su mãnh
më cua Java dã khiên nó nôi tiêng dên muc vuot ra ngoài su tuong tuong cua các nhà thiêt
kê ra nó.
Java khoi thuy tên là Oak- là cây sôi moc o phía sau ván phòng cua nhà thiêt kê
chính ông Jame Gosling, sau này ông thây ráng dã có ngôn ngu lâp trình tên Oak rôi, do
vây nhóm thiêt kê quyêt dinh dôi tên, “Java” là cái tên duoc chon, Java là tên cua môt
quán cafe mà nhóm thiêt kê java hay dên dó uông.
II. Java em là ai
Java là ngôn ngu lâp trình huong dôi tuong, do vây không thê dùng Java dê viêt
môt chuong trình huong chuc náng. Java có thê giai quyêt hâu hêt các công viêc mà các
ngôn ngu khác có thê làm duoc.
Java là ngôn ngu vua biên dich vua thông dich. Dâu tiên mã nguôn duoc biên dich
báng công cu JAVAC dê chuyên thành dang ByteCode. Sau dó duoc thuc thi trên tung
loai máy cu thê nho chuong trình thông dich JAVA. Muc tiêu cua các nhà thiêt kê Java là
cho phép nguoi lâp trình viêt chuong trình môt lân nhung có thê chay trên bât cu phân
cung cu thê, thê nên khâu hiêu cua các nhà thiêt kê Java là “Write One, Run Any Where”.
Ngày nay, Java duoc su dung rông rãi dê viêt chuong trình chay trên Internet. Nó là
ngôn ngu lâp trình huong dôi tuong dôc lâp thiêt bi, không phu thuôc vào hê diêu hành.
Java không chi dùng dê viêt các ung dung chay don le hay trong mang mà còn dê xây
dung các trình diêu khiên thiêt bi cho diên thoai di dông, PDA, …
II. Môt sô dàc trung cua java
1.Don gian
Nhung nguoi thiêt kê mong muôn phát triên môt ngôn ngu dê hoc và quen thuôc
voi da sô nguoi lâp trình. Java tua nhu C++, nhung dã luoc bo di các dác trung phuc tap,
không cân thiêt cua C và C++ nhu: thao tác con tro, thao tác dinh nghia chông toán tu
(operator overloading),… Java không su dung lênh “goto” cung nhu file header (.h). Câu
trúc “struct” và “union” cung duoc loai bo khoi Java. Nên có nguoi bao Java là “C++--“,
ngu ý bao java là C++ nhung dã bo di nhung thu phuc tap, không cân thiêt.
2. Huóng dôi tuong
Có thê nói java là ngôn ngu lâp trình hoàn toàn huong dôi tuong, tât cac trong java
dêu là su vât, dâu dâu cung là su vât.
3. Dôc lâp vói hê nên
Muc tiêu chính cua các nhà thiêt kê java là dôc lâp voi hê nên hay còn goi là dôc
lâp phân cung và hê diêu hành. Dây là kha náng môt chuong trình duoc viêt tai môt máy
nhung có thê chay duoc bât ky dâu
Trang 6
Tính dôc lâp voi phân cung duoc hiêu theo nghia môt chuong trình Java nêu chay
dúng trên phân cung cua môt ho máy nào dó thì nó cung chay dúng trên tât ca các ho máy
khác. Môt chuong trình chi chay dúng trên môt sô ho máy cu thê duoc goi là phu thuôc
vào phân cung.
Tính dôc lâp voi hê diêu hành duoc hiêu theo nghia môt chuong trình Java có thê
chay duoc trên tât ca các hê diêu hành. Môt chuong trình chi chay duoc trên môt sô hê
diêu hành duoc goi là phu thuôc vào hê diêu hành.
Các chuong trình viêt báng java có thê chay trên hâu hêt các hê nên mà không cân
phai thay dôi gì, diêu này dã duoc nhung nguoi lâp trình dát cho nó môt khâu hiêu :viêt
môt lân, chay moi noi', diêu này là không thê có voi các ngôn ngu lâp trình khác.
Dôi voi các chuong trình viêt báng C, C++ hoác môt ngôn ngu nào khác, trình biên
dich së chuyên tâp lênh thành mã máy (machine code), hay lênh cua bô vi xu lý. Nhung
lênh này phu thuôc vào CPU hiên tai trên máy ban. Nên khi muôn chay trên loai CPU
khác, chúng ta phai biên dich lai chuong trình.
4. Manh mê
Java là ngôn ngu yêu câu chát chë vê kiêu du liêu, viêc ép kiêu tu dông bua bãi cua
C, C++ nay duoc han chê trong Java, diêu này làm chuong trình rõ ràng, sáng sua, ít lôi
hon.Java kiêm tra lúc biên dich và ca trong thoi gian thông dich vì vây Java loai bo môt
môt sô loai lôi lâp trình nhât dinh.Java không su dung con tro và các phép toán con tro.
Java kiêm tra tât ca các truy nhâp dên mang, chuôi khi thuc thi dê dam bao ráng các truy
nhâp dó không ra ngoài gioi han kích thuoc.
Trong các môi truong lâp trình truyên thông, lâp trình viên phai tu mình câp phát
bô nho. Truoc khi chuong trình kêt thúc thì phai tu giai phóng bô nho dã câp. Vân dê nay
sinh khi lâp trình viên quên giai phóng bô nho dã xin câp truoc dó. Trong chuong trình
Java, lâp trình viên không phai bân tâm dên viêc câp phát bô nho. Qúa trình câp phát, giai
phóng duoc thuc hiên tu dông, nho dich vu thu nhát nhung dôi tuong không còn su dung
nua (garbage collection).
Co chê bây lôi cua Java giúp don gian hóa qúa trình xu lý lôi và hôi phuc sau lôi.
5. Hô tro lâp trình da tuyên
Dây là tính náng cho phép viêt môt chuong trình có nhiêu doan mã lênh duoc chay
song song voi nhau. Voi java ta có thê viêt các chuong trình có kha náng chay song song
môt cách dê dàng, hon thê nua viêc dông bô tài nguyên dùng chung trong Java cung rât
dong gian. Diêu này là không thê có dôi voi môt sô ngôn ngu lâp trình khác nhu C/C++,
pascal …
6. Phân tán
Java hô tro dây du các mô hình tính toán phân tán: mô hình client/server, goi thu
tuc tu xa…
7. Hô tro internet
Muc tiêu quan trong cua các nhà thiêt kê java là tao diêu kiên cho các nhà phát triên
ung dung có thê viêt các chuong trình ung dung internet và web môt cách dê dàng, voi
java ta có thê viêt các chuong trình su dung các giao thuc TCP, UDP môt cách dê dàng, vê
lâp trình web phía máy khách java có công nghê java applet, vê lâp trình web phía máy
khách java có công nghê servlet/JSP, vê lâp trình phân tán java có công nghê RMI,
CORBA, EJB, Web Service.
Trang 7
8. Thông dich
Các chuong trình java cân duoc thông dich truoc khi chay, môt chuong trình java
duoc biên dich thành mã byte code mã dôc lâp voi hê nên, chuong trình thông dich java së
ánh xa mã byte code này lên môi nên cu thê, diêu này khiên java châm chap di phân nào.
III. Các kiêu úng dung Java
Voi Java ta có thê xây dung các kiêu ung dung sau:
1. Úng dung Applets
Applet là chuong trình Java duoc tao ra dê su dung trên Internet thông qua các trình
duyêt hô tro Java nhu IE hay Netscape. Applet duoc nhúng bên trong trang Web. Khi
trang Web hiên thi trong trình duyêt, Applet së duoc tai vê và thuc thi tai trình duyêt.
2. Úng dung dòng lênh (console)
Các chuong trình này chay tu dâu nhác lênh và không su dung giao diên dô hoa.
Các thông tin nhâp xuât duoc thê hiên tai dâu nhác lênh.
3. Úng dung dô hoa
Dây là các chuong trình Java chay dôc lâp cho phép nguoi dùng tuong tác qua giao
diên dô hoa.
4. JSP/Servlet
Java thích hop dê phát triên ung dung nhiêu lop. Applet là chuong trình dô hoa
chay trên trình duyêt tai máy tram. O các ung dung Web, máy tram gui yêu câu toi máy
chu. Máy chu xu lý và gui kêt qua tro lai máy tram. Các Java API chay trên máy chu chiu
trách nhiêm xu lý tai máy chu và tra loi các yêu câu cua máy tram. Các Java API chay trên
máy chu này mo rông kha náng cua các ung dung Java API chuân. Các ung dung trên máy
chu này duoc goi là các JSP/Servlet. hoác Applet tai máy chu. Xu lý Form cua HTML là
cách su dung don gian nhât cua JSP/Servlet. Chúng còn có thê duoc dùng dê xu lý du liêu,
thuc thi các giao dich và thuong duoc thuc thi thông qua máy chu Web.
5. Úng dung co so dû liêu
Các ung dung này su dung JDBC API dê kêt nôi toi co so du liêu. Chúng có thê là
Applet hay ung dung, nhung Applet bi gioi han boi tính bao mât.
6. Úng dung mang
Java là môt ngôn ngu rât thích hop cho viêc xây dung các ung dung mang. Voi thu
viên Socket ban có thê lâp trình voi hai giao thuc: UDP và TCP.
7. Úng dung nhiêu tâng
Voi Java ban có thê xây dung phân tán nhiêu tâng voi nhiêu hô tro khác nhau nhu:
RMI, CORBA, EJB, Web Service
8. Úng dung cho các thiêt bi di dông
Hiên nay phân lon các thiêt bi di dông nhu: Diên thoai di dông, máy tro giúp cá
nhân… dêu hô tro Java. Thê nên ban có thê xây dung các ung dung chay trên các thiêt bi
di dông này. Dây là môt kiêu ung dung khá hâp dãn, boi vì các thiêt bi di dông này ngày
càng phô biên và nhu câu có các ung dung chay trên dó, dác biêt là các ung dung mang
tính chât giai trí nhu game
IV. Máy ao Java (JVM-Java Virtual Machine)
Máy ao là môt phân mêm mô phong môt máy tính thât (máy tính ao). Nó có tâp
hop các lênh logic dê xác dinh các hoat dông cua máy tính và có môt hê diêu hành ao.
Nguoi ta có thê xem nó nhu môt máy tính thât (máy tính có phân cung ao, hê diêu hành
Trang 8
ao). Nó thiêt lâp các lop truu tuong cho: Phân cung bên duoi, hê diêu hành, mã dã biên
dich.
Trình biên dich chuyên mã nguôn thành tâp các lênh cua máy ao mà không phu thuôc
vào phân cung và hê diêu hành cu thê. Trình thông dich trên môi máy së chuyên tâp lênh
này thành chuong trình thuc thi. Máy ao tao ra môt môi truong bên trong dê thuc thi các
lênh báng cách:
Ø Nap các file .class
Ø Quan lý bô nho
Ø Don “rác”
Viêc không nhât quán cua phân cung làm cho máy ao phai su dung ngán xêp dê luu tru
các thông tin sau:
Ø Các “Frame” chua các trang thái cua các phuong thuc.
Ø Các toán hang cua mã bytecode.
Ø Các tham sô truyên cho phuong thuc.
Ø Các biên cuc bô.
Khi JVM thuc thi mã, môt thanh ghi cuc bô có tên “Program Counter” duoc su dung.
Thanh ghi này tro toi lênh dang thuc hiên. Khi cân thiêt, có thê thay dôi nôi dung thanh
ghi dê dôi huong thuc thi cua chuong trình. Trong truong hop thông thuong thì tung lênh
môt nôi tiêp nhau së duoc thuc thi.
Môt khái niêm thông dung khác trong Java là trình biên dich “Just In Time-JIT”. Các
trình duyêt thông dung nhu Netscape hay IE dêu có JIT bên trong dê táng tôc dô thuc thi
chuong trình Java. Muc dích chính cua JIT là chuyên tâp lênh bytecode thành mã máy cu
thê cho tung loai CPU. Các lênh này së duoc luu tru và su dung môi khi goi dên.
Trang 9
BÀI 2 NÈN TÀNG CÙA JAVA
I. Tâp ký tu dùng trong java
Moi ngôn ngu nói chung, ngôn ngu lâp trình nói riêng dêu phai xây dung trên môt
tâp hop chu cái (hay còn goi là bang chu cái), các kí tu duoc nhóm lai theo môt cách nào
dó dê tao thành các tu, các tu lai duoc nhóm lai thành các câu (trong ngôn ngu lâp trình
goi là câu lênh), môt chuong trình máy tính tính là môt tâp các câu lênh duoc bô trí theo
môt trât tu mà nguoi viêt ra chúng sáp dát
Ngôn ngu java duoc duoc xây dung trên bang chu cái unicode, do vây ta có thê
dùng các kí tu unicode dê dát tên cho các dinh danh.
II. Tù khoá cua Java
Môi ngôn ngu lâp trình có môt tâp các tu khoá, nguoi lâp trình phai su dung tu
khoá theo dúng nghia mà nguoi thiêt kê ngôn ngu dã dê ra, ta không thê dinh nghia lai
nghia cua các tu khoá, nhu su dung nó dê dát tên biên, hàm..
Sau dây là môt sô tù khoá thuòng gáp:
Tù khóa Mô ta
abstract Su dung dê khai báo lop, phuong thuc truu tuong
boolean Kiêu du liêu logic
break Duoc su dung dê kêt thúc vòng láp hoác câu trúc switch
byte kiêu du liêu sô nguyên
case duoc su dung trong lên switch
cast Chua duoc su dung (dê dành cho tuong lai)
catch duoc su dung trong xu lý ngoai lê
char kiêu du liêu ký tu
class Dùng dê khai báo lop
const Chua duoc dùng
continue duoc dùng trong vòng láp dê bát dâu môt vòng láp moi
default duoc su dung trong lênh switch
do duoc dùng trong vòng láp diêu kiên sau
double kiêu du liêu sô thuc
else kha náng lua chon thu hai trong câu lênh if
extends chi ráng môt lop duoc kê thua tu môt lop khác
false Gía tri logic
final Dùng dê khai báo háng sô, phuong thuc không thê ghi dè, hoác lop không
thê kê thua
finally phân cuôi cua khôi xu lý ngoai lê
float kiêu sô thuc
for Câu lênh láp
goto Chua duoc dùng
if Câu lênh lua chon
implements chi ráng môt lop triên khai tu môt giao diên
import Khai báo su dung thu viên
instanceof kiêm tra môt dôi tuong có phai là môt thê hiên cua lop hay không
interface su dung dê khai báo giao diên
long kiêu sô nguyên
native Khai báo phuong thuc duoc viêt báng ngông ngu biên dich C++
new tao môt dôi tuong moi
Trang 10
null môt dôi tuong không tôn tai
package Dùng dê khai báo môt gói
private dác ta truy xuât
protected dác ta truy xuât
public dác ta truy xuât
return Quay tu phuong thuc vê chô goi nó
short kiêu sô nguyên
static Dùng dê khai báo biên, thuôc tính tinh
super Truy xuât dên lop cha
switch lênh lua chon
synchronized môt phuong thuc dôc quyên truy xuât trên môt dôi tuong
this Ám chi chính lop dó
throw Ném ra ngoai lê
throws Khai báo phuong thuc ném ra ngoai lê
true Giá tri logic
try su dung dê bát ngoai lê
void Dùng dê khai báo môt phuong thuc không tra vê giá tri
while Dùng trong câu trúc láp
III. Dinh danh (tên)
Tên dùng dê xác dinh duy nhât môt dai luong trong chuong trình. Trong java tên duoc
dát theo quy tác sau:
- Không trùng voi tu khoá
- Không bát dâu báng môt sô, tên phai bát dâu báng kí tu hoác bát dâu báng kí $,_
- Không chua dâu cách, các kí tu toán hoc nhu +, -, *,/, %..
- Không trùng voi môt dinh danh khác trong cùng môt pham vi
Chú ý:
- Tên nên dát sao cho có thê mô ta duoc dôi tuong trong thuc tê
- Giông nhu C/C++, java có phân biêt chu hoa chu thuong
- Trong java ta có thê dát tên voi dô dài tuy ý
- Ta có thê su dung các kí tu tiêng viêt dê dát tên
Quy uóc vê dát tên trong java
Ta nên dát tên biên, háng, lop, phuong thuc sao cho nghia cua chúng rõ ràng, dê hiêu,
khoa hoc và mang tính uoc lê quôc tê. Do java có phân biêt chu hoa, chu thuong nên ta
phai cân thân và chú ý.
Sau dây là quy uoc dát tên trong java (chú ý dây chi là quy uoc do vây không bát buôc
phai tuân theo quy uoc này):
- Dôi voi biên và phuong thuc thì tên bao gio cung bát dâu báng ký tu thuong, nêu tên
có nhiêu tu thì ghép lai thì: ghép tât ca các tu thành môt, ghi tu dâu tiên chu thuong,
viêt hoa kí tu dâu tiên cua môi tu theo sau trong tên, ví du area, radius, readInteger…
- Dôi voi tên lop, giao diên ta viêt hoa các kí tu dâu tiên cua môi tu trong tên, ví du lop
WhileTest, Circle
- Tên háng bao gio cung viêt hoa, nêu tên gôm nhiêu tu thì chúng duoc nôi voi hau boi
kí tu ghach duoi ‘_’, ví du PI, MAX_VALUE
IV. Câu trúc môt chuong trình java
- Môi ung dung Java bao gôm môt hoác nhiêu don vi biên dich (môi don vi biên dich
là môt têp tin có phân mo rông Java)
- Môi don vi biên dich bao gôm môt hoác nhiêu lop
Trang 11
- Môi ung dung dôc lâp phai có duy nhât môt phuong thuc main (diêm bát dâu cua ung
dung)
- Môi don vi biên dich có nhiêu nhât môt lop duoc khai báo là public, nêu nhu trong
don vi biên dich có lop public thì tên cua don vi biên dich phai trùng voi tên cua lop
public (giông hêt nhau ca ký tu hoa lân ký tu thuong)
- Bên trong thân cua môi lop ta khai báo các thuôc tính, phuong thuc cua lop dó, Java
là ngôn ngu huong dôi tuong, do vây mã lênh phai nám trong lop nào dó. Môi lênh dêu
duoc kêt thúc báng dâu châm phay “;”.
- Trong ngôn ngu Java, lop là môt don vi mâu có chua du liêu và mã lênh liên quan dên
- môt thuc thê nào dó. Khi xây dung môt lop, thuc chât ban dang tao ra môt môt kiêu du
liêu. Kiêu du liêu moi này duoc su dung dê xác dinh các biên mà ta thuong goi là “dôi
tuong”. Dôi tuong là các thê hiên (instance) cua lop. Tât ca các dôi tuong dêu thuôc vê
môt lop có chung dác tính và hành vi. Môi lop xác dinh môt thuc thê, trong khi dó môi
dôi tuong là môt thê hiên thuc su.
- Khi ban khai báo môt lop, ban cân xác dinh du liêu và các phuong thuc cua lop dó.
Vê co ban môt lop duoc khai báo nhu sau:
/ / Nhâp khâu các t hu viên
i mpor t t hu_viên;
/ / Xây dung các lóp
publ i c cl ass cl sMai n{
.
publ i c st at i c voi d mai n( St r i ng ar gs[ ] )
{
/ / diêm bât dâu cúa chuong t rình
}
.
}
cl ass l p1
{
.
}
cl ass l p2
{
.
}
Môt don vi bi ên dich là môt t êp
t in . j ava
Trang 12
Cú pháp:
class classname
{ var_datatype variablename;
...........
<met_datatype> methodname (parameter_list){...........}
............
}
Trong dó:
class - Tu khoá xác dinh lop
classname - Tên cua lop
var_datatype - kiêu du liêu cua biên
variablename - Tên cua biên
met_datatype - Kiêu du liêu tra vê cua phuong thuc
methodname - Tên cua phuong thuc
parameter_list – Các tham sô duoc cua phuong thuc
- Ban còn có thê dinh nghia môt lop bên trong môt lop khác. Dây là lop xêp lông nhau,
các thê hiên (instance) cua lop này tôn tai bên trong thê hiên cua môt lop che phu chúng.
Nó chi phôi viêc truy nhâp dên các thành phân cua lop bao phu chúng. Có hai loai lop
trong dó là lop trong tinh “static” và lop trong không tinh “non static”
+ Lop trong tinh (static)
Lop trong tinh duoc dinh nghia voi tu khoá “static”. Lop trong tinh có thê truy nhâp
vào các thành phân tinh cua lop phu nó.
+ Lop trong không tinh (non static)
Lop bên trong (không phai là lop trong tinh) có thê truy nhâp tât ca các thành phân cua
lop bao nó, song không thê nguoc lai.
V. Chuong trình JAVA dâu tiên
Dê có thê biên dich và chay các chuong trình java ta phai cài
- JRE (Java Runtime Enviroment) môi truong thuc thi cua java, nó bao gôm: JVM (Java
Virtual Machine) máy ao java vì các chuong trình java duoc thông dich và chay trên
máy ao java và tâp các thu viên cân thiêt dê chay các ung dung java.
- Bô công cu biên dich và thông dich JDK cua Sun Microsystem
Sau khi cài dát JDK (gia su thu muc cài dát là C:\JDK1.4) ta së nhân duoc môt câu trúc
thu muc nhu sau:
- Dê biên dich môt chuong trình java sang mã byte code ta dùng lênh
C:\JDK1.4\BIN\javac TênTêp.java
- Dê thông dich và chay chuong trình ta su dung lênh
Trang 13
C:\JDK1.4\BIN\java TênTêp
Dê biên dich và chay chuong trình Java don gian ta nên thiêt dát hai biên môi truong
“paht” và “classpath” nhu sau:
- Dôi voi dòng WinNT:
+ R-Click vào My Computerà chon Propertiesà chon Advancedà Enviroment
Variables
+ Trong phân System variables chon new dê thêm biên môi truong moi, trong hôp
thoai hiên ra gõ “classpath” vào ô Variable Name và
“.;C:\jdk1.4\lib\tools.jar;C:\jdk1.4\lib\dt.jar;C:\jdk1.4\jre\lib\rt.jar” trong ô variable
value (chú ý không gõ dâu “ vào, muc dích dê cho dê nhìn mà thôi)
+ Cung trong phân System variables tìm dên phân path trong danh sáchà chon edit
dê sua lai giá tri hiên có, trong ô value ta thêm vào cuôi “;C:\jdk1.4\bin”
Công viêc dát các biên môi truong dã xong, dê thây duoc tác dung cua các biên môi
truong ta cân phai khoi dông lai máy
- Dôi voi dòng Win9X:
Mo têp C:\Autoexec.bat sau dó thêm vào hai dòng sau:
+classpath=.;C:\jdk1.4\lib\tools.jar;C:\jdk1.4\lib\dt.jar;C:\jdk1.4\jre\lib\rt.jar
+ path=…;c:\jdk1.4\bin
Khoi dông lai máy dê thây duoc tác dung cua các biên môi truong này
Ví du dâu tiên: chuong trình Hello World (chuong trình khi chay së in ra màn hình loi
chào Hello World)
Các buoc:
Trang 14
- Mo môt chuong trình soan thao ván ban hô tro asciii, nhu notepad, wordpad,
EditPlus… và gõ vào các dòng sau:
public class HelloWorld {
public static void main(String[] args){
System.out.println("Hello World");
}
}
- Ghi lai voi cái tên C:\HelloWorld.java (chú ý tên têp phai trùng voi tên lop, kê ca chu
hoa chu thuong, phân mo rông là java)
- Mo cua sô DOS Prompt
+ Chuyên vào thu muc C:\
+ Gõ lênh javac HelloWorld.java dê biên dich chuong trình, nêu viêc biên dich
thành công (chuong trình không có lôi cú pháp) thì ta së thu duoc têp
HelloWorld.class trong cùng thu muc, nêu trong chuong trình còn lôi cú pháp
thì trong buoc này ta së nhân duoc môt thông báo lôi và lúc này têp
HelloWorld.class cung không duoc tao ra
+ Gõ lênh java HelloWorld (chú ý không gõ phân mo rông) dê chay chuong trình
HelloWorld.
Sau khi thông dich và chay ta nhân duoc
VI. Chú thích trong chuong trình
Trong java ta có 3 cách dê ghi chú thích
Cách 1: su dung cáp /* và */ ý nghia cua cáp chú thích này giông nhu cua C, C++
Cách 2: su dung cáp // ý nghia cua cáp chú thích này giông nhu cua C, C++
Cách 3: su dung cáp /** và */, dây là kiêu chú thích tài liêu (không có trong C/C++), nó
dùng dê tao ra tài liêu chú thích cho chuong trình.
Voi cách thu nhât và cách ba ta có thê viêt chú thích trên nhiêu dòng, voi cách chú thích
hai ta chi có thê chú thích trên môt dòng.
Chú ý: Trong java ta có thê dát chú thích o dâu?, câu tra loi là: o dâu có thê dát duoc môt
dâu cách thì o dó có thê dát chú thích.
Trang 15
VII. Kiêu dü liêu
1. Các kiêu dû liêu nguyên thuv
Tù khoá Mô ta Kích cõ Tôi thiêu Tôi da Lóp bao
(kiêu sô nguyên)
byte sô nguyên môt byte 8 bit -128 127 Byte
short sô nguyên ngán 16 bit -2
15
2
15
-1 Short
int sô nguyên 32 bit -2
31
2
31
-1 Integer
long sô nguyên dài 64 bit -2
63
-2
63
-1 Long
(kiêu sô thuc)
float kiêu thuc voi dô chính
xác don
32 bit IEEE754 IEEE75
4
Float
double Double-precision
floating point
64 bit IEEE754 IEEE75
4
Double
(kiêu khác)
char kiêu kí tu 16 bit Unicode 0 Unicode
2
16
-1
Character
boolean kiêu logic true hoác false - - Boolean
void - - - - Void
Dác diêm cua các biên có kiêu nguyên thuy là vùng nho cua chúng duoc câp phát o phân
stack. Do vây viêc truy xuât vào môt biên kiêu nguyên thuy rât nhanh.
2. Kiêu tham chiêu
Trong Java có 3 kiêu du liêu tham chiêu
Kiêu dü liêu Mô ta
Mang (Array) Tâp hop các du liêu cùng kiêu.
Lop (Class) Là su cài dát mô ta vê môt dôi tuong trong bài toán.
Giao diên
(Interface)
Là môt lop thuân truu tuong duoc tao ra cho phép cài dát
da thua kê trong Java.
Dác diêm cua các biên kiêu tham chiêu là nó chua dia chi cua dôi tuong mà nó tro
dên.
Kêu nguyên t huý
kiêu logi c boolean Kiêu sô
Kiêu sô t huc
Kiêu kí t u
Ki êu sô
boolean
char byt e short i nt long
float
doubl
e
Trang 16
Vùng nho cua biên tham chiêu duoc câp phát o vùng nho stack còn vùng nho cua
dôi tuong duoc câp phát o vùng nho heap. Viêc truy xât vào vùng nho heap châm hon truy
xât vào vùng nho stack tuy nhiên java có co chê cho phép truy câp vào vùng nho heap voi
tôc dô xâp xi báng tôc dô truy câp vào vùng nho stack.
VIII. Khai báo biên
1. Khai báo biên
Tuong tu ngôn ngu C/C++, dê khai báo biên trong java ta su dung cú pháp sau:
type name [=InitValue];
trong dó:
- type là kiêu du liêu cua biên
- name là tên cua biên, tên biên là môt xâu kí tu duoc dát theo quy tác dát tên cua java
- InitValue là giá tri khoi tao cho biên, dây là phân tuy chon, nêu bo qua phân này thì giá
tri ban dâu cua biên duoc khoi tao giá tri mác dinh
Chú ý:
- Nêu cân khai báo nhiêu biên có cùng môt kiêu du liêu ta có thê dát các khai báo các biên
trên môt dòng, các biên này duoc phân cách nhau boi dâu phay
- Java së xu lý các biên không duoc khoi dâu giá tri nhu sau:
+ Dôi voi thuôc tính (biên duoc khai báo trong pham vi cua lop) thì Java së tu dông
khoi gán giá tri cho các biên theo quy tác sau:
+ giá tri 0 cho kiêu du liêu sô
+ false cho kiêu logic
+ kí tu null (mã 0) cho kí tu
+ giá tri null cho kiêu dôi tuong
+ Dôi voi các biên cuc bô thì biên không duoc khoi gán giá tri mác dinh, tuy nhiên
Java së báo lôi nêu ta su dung môt biên chua duoc nhân giá tri
2. Pham vi biên
Môi biên duoc khai báo ra có môt pham vi hoat dông, pham vi cua biên là noi mà
biên có thê duoc truy câp, diêu này xác dinh ca tính thây duoc và thoi gian sông cua biên.
Biên t ham chiêu Ðôi t uong
Trang 17
Ø Biên pham vi lop là biên duoc khai báo bên trong lop nhung bên ngoài các phuong
thuc và hàm tao, tuy nhiên viêc khai báo phai xuât hiên truoc khi biên duoc su dung
Ø Biên pham vi cuc bô là biên duoc khai báo bên trong môt khôi, pham vi cua biên tính
tu diêm biên duoc khai báo cho dên cuôi khôi mà biên duoc khai báo
Ví du:
{
int i=1; // chi có i sán sàng su dung
{
int j=10; // ca i và j dêu sán sàng
}
// chi có i sán sàng
// j không sán sàng vì nám ngoài pham vi
}
Chú ý: Ta không thê làm diêu sau cho dù nó có thê trong C/C++
{
int i=1;
{ int i=10;// không duoc phép vì dã có môt biên cùng tên voi nó }
}
Nhung nguoi thiêt kê java cho ráng diêu dó có thê gây lân lôn, do vây ho dã quyêt
dinh không cho phép che giâu môt biên o pham vi lon hon.
Chú ý: thoi gian sông cua các dôi tuong không tuân theo quy luât thoi gian sông cua các
biên kiêu nguyên thuy.
VII. Môt sô phép toán trên kiêu dü liêu nguyên thuy
1. Phép gán
Cú pháp Biên=BiêuThúc;
Phép gán duoc thuc hiên báng toán tu ‘=’, nó có nghia là “ hãy tính toán giá tri biêu
thuc bên phai dâu gán, sau dó dua giá tri dó vào ô nho có tên nám o bên trái dâu gán’
Chú ý:
+ Câu lênh gán gôm môt dâu ‘=’
+ Kiêu cua biêu thuc bên phai dâu gán phai tuong thích voi kiêu du liêu cua biên
+ Trong java ta có thê thuc hiên môt dây gán nhu sau:
i = j = 10; // ca i và j dêu có giá tri 10
Trang 18
2. Toán tu toán hoc
Ngôn ngu java cung có các phép toán sô hoc nhu các ngôn ngu khác: + ( phép công), - (
phép tru ), * ( phép nhân ),/ ( phép chia ), % ( phép toán chia lây phân nguyên)
Ta mô ta tóm tát các phép toán sô hoc qua bang tông kêt sau:
Phép toán Su dung Mô ta
+ op1 + op2 Công op1 voiop2
- op1 - op2 Tru op1 cho op2
* op1 * op2 Nhân op1 voi op2
/ op1/ op2 chia op1 cho op2
% op1 % op2 Tính phân du cua phép chia op1 cho op2
3. Toán tu táng, giam
Giông nhu ngôn ngu C/C++, java cung có phép toán táng, giam, ta có thê mô ta
tóm tát qua các báng sau:
Phép toán Su dung Mô ta
++ op++
Táng op lên 1 don vi, giá tri cua op duoc táng lên truoc khi biêu
thuc chua nó duoc tính
++ ++op
Táng op lên 1 don vi, giá tri cua op duoc táng lên sau khi biêu thuc
chua nó duoc tính
-- op--
Giam op xuông1 don vi, giá tri cua op duoc giam xuông truoc khi
biêu thuc chua nó duoc tính
-- --op
Giam op xuông1 don vi, giá tri cua op duoc giam xuông sau khi
biêu thuc chua nó duoc tính
Chú ý: nêu toán tu táng truóc, táng sau(giam truóc, giam sau) dúng môt mình(không
nám trong biêu thuc ) thì chúng hoat dông nhu nhau, chúng chi khác nhau khi chúng nám
trong biêu thuc
4. Phép toán quan hê
Phép toán quan hê bao gio cung cho kêt qua boolean, phép toán quan hê së so sánh
2 giá tri, nó xác dinh môi quan hê giua chúng, ví du! = së tra vê true nêu 2 toán hang là
khác nhau.
Ta tóm tát các phép toán qua bang sau:
Phép toán Su dung Nhân vê giá tri true khi
> op1 > op2 op1 lon hon op2
>= op1 >= op2 op1 lon hon hoác báng op2
< op1 < op2 op1 nho hon op2
<= op1 <= op2 op1 nho hon hoác báng op2
== op1 == op2 op1 báng op2
!= op1! = op2 op1 khác op2
Ví du: Su dung các phép toán quan hê
public class RelationalDemo {
public static void main(String[] args) {
// a few numbers
Trang 19
int i = 37;
int j = 42;
int k = 42;
System.out.println("Variable values...");
System.out.println(" i = " + i);
System.out.println(" j = " + j);
System.out.println(" k = " + k);
//greater than
System.out.println("Greater than...");
System.out.println(" i > j = " + (i > j)); // false
System.out.println(" j > i = " + (j > i));// true
System.out.println(" k > j = " + (k > j));// false, they are equal
//greater than or equal to
System.out.println("Greater than or equal to...");
System.out.println(" i >= j = " + (i >= j));// false
System.out.println(" j >= i = " + (j >= i));// true
System.out.println(" k >= j = " + (k >= j));// true
//less than
System.out.println("Less than...");
System.out.println(" i < j = " + (i < j));// true
System.out.println(" j < i = " + (j < i));// false
System.out.println(" k < j = " + (k < j));// false
//less than or equal to
System.out.println("Less than or equal to...");
System.out.println(" i <= j = " + (i <= j));// true
System.out.println(" j <= i = " + (j <= i));// false
System.out.println(" k <= j = " + (k <= j));// true
//equal to
System.out.println("Equal to...");
System.out.println(" i == j = " + (i == j));// false
System.out.println(" k == j = " + (k == j));// true
//not equal to
System.out.println("Not equal to...");
System.out.println(" i! = j = " + (i! = j));// true
System.out.println(" k! = j = " + (k! = j));// false
}
}
Dây là dâu ra cua chuong trình
Variable values...
i = 37
j = 42
k = 42
Greater than...
i > j = false
j > i = true
k > j = false
Greater than or equal to...
i >= j = false
j >= i = true
k >= j = true
Less than...
Trang 20
i < j = true
j < i = false
k < j = false
Less than or equal to...
i <= j = true
j <= i = false
k <= j = true
Equal to...
i == j = false
k == j = true
Not equal to...
i! = j = true
k! = j = false
5. Phép toán logic
Java hô tro 6 phép toán logic duoc chi ra trong bang sau:
Phép toán Su dung Nhân vê giá tri true khi
&& op1 && op2
Ca op1 và op2 dêu là true, giá tri cua op2 chi duoc tính
khi op1 là true
|| op1 || op2
Hoác op1 hoác op2 là true, giá tri cua op2 chi duoc tính
khi op1 là false
! ! op op là false
& op1 & op2
Ca op1 và op2 dêu là true, giá tri cua op2 luôn duoc tính
kê ca khi op1 là false
| op1 | op2
Hoác op1 hoác op2 là true, giá tri cua op2 luôn luôn duoc
tính kê ca khi op1 là true
^ op1 ^ op2 Nêu op1 khác op2
Nhân xét:
+ Phép toán && ( & ) chi nhân giá tri true khi và chi khi ca hai toán hang dêu là true
+ Phép toán || ( | ) chi nhân giá tri false khi và chi khi ca hai toán hang là false
+ Phép toán ^ chi nhân giá tri true khi và chi khi hai toán hang khác nhau
6. phép toán thao tác trên bit
6.1. Phép toán dich bit
Ta së mô ta phép toán dich chuyên qua bang sau:
Phép toán Su dung Kêt qua
>> op1 >> op2
Dich chuyên op1 sang phai op2 bit, op2 bit phía bên phai së
duoc diên báng các bít 0
<< op1 << op2
Dich chuyên op1 sang trái op2 bit(giu nguyên dâu cua op1),
op2 bit nám bên trái së duoc diên báng các bít 0
>>> op1>>> op2 Dich chuyên op1 sang phai op2 bit, op2 bit
Sau dây là hình minh hoa phép toán dich bít
Trang 21
Ví du:
13>>1=6 vì 13=11012 do vây khi dich phai môt bit ta së duoc 1102=6
5<<1=10 vì 5=1012 do vây khi dich trái 1 bit ta së duoc 10102=10
5<<2=100 vì 5=1012 do vây khi dich trái 2 bit ta së duoc 101002=100
Nhân xét: phép toán dich trái môt bit chính là phép nhân vói 2, còn dich phai chính là
phép chia cho 2
6.2. Phép toán logic trên bit
Các phép toán thao tác bit cho phép ta thao tác trên tung bit riêng le trong môt kiêu du liêu
thích hop, các phép toán thao tác bit thuc hiên dai sô boolean trên các bit tuong ung cua 2
toán hang dê tao ra kêt qua
Ta tóm tát các phép toán trong bang sau:
Phép toán Su dung Thuc hiên
& op1 & op2 Thuc hiên phép and các bit tuong ung cua op1 voi op2
| op1 | op2 Thuc hiên phép or các bit tuong ung cua op1 voi op2
^ op1 ^ op2 Thuc hiên phép xor các bit tuong ung cua op1 voi op2
~ ~op2 Thuc hiên phép lât not các bit cua op2
Bang giá tri chân lý cua các phép toán dái sô boolean:
Trang 22
Phép AND
op1 op2 Result
0 0 0
0 1 0
1 0 0
1 1 1
Phép XOR
op1 op2 Result
0 0 0
0 1 1
1 0 1
1 1 0 op1 op2 Result
0 0 0
0 1 1
1 0 1
1 1 1
Ví du:
1101// 13
& 1100// 12
------
1100// 12
1101// 13
| 1100// 12
------
1101// 13
1101// 13
^ 1100// 12
------
0001// 1
! 10101=01010
7. Toán tu gán tát
Giông nhu C/C++ java cung có toán tu gán, ta tóm tát các toán tu gán qua bang
sau:
Phép gán Su dung Tuong duong
+= op1 += op2 op1 = op1 + op2
-= op1 -= op2 op1 = op1 - op2
*= op1 *= op2 op1 = op1 * op2
/= op1/ = op2 op1 = op1/ op2
%= op1 %= op2 op1 = op1 % op2
Phép NOT
op1 Result
0 1
1 0
Trang 23
&= op1 &= op2 op1 = op1 & op2
|= op1 |= op2 op1 = op1 | op2
^= op1 ^= op2 op1 = op1 ^ op2
<<= op1 <<= op2 op1 = op1 << op2
>>= op1 >>= op2 op1 = op1 >> op2
>>>= op1 >>>= op2 op1 = op1 >>> op2
8. Thú tu uu tiên cua các phép toán
Thu tu uu tiên cua các phép toán xác dinh trình tu tính toán giá tri cua môt biêu thuc, java
có nhung quy tác riêng dê xác dinh trình tu tính toán cua biêu thuc, ta phai nho quy tác
sau:
Ø Các phép toán môt ngôi bao gio cung duoc thuc hiên truoc tiên
Ø Trong môt biêu thuc có nhiêu phép toán thì phép toán nào có dô uu tiên cao hon së
duoc thuc hiên truoc phép toán có dô uu tiên thâp
Ø Trong môt biêu thuc có nhiêu phép toán có dô uu tiên ngang nhau thì chúng së duoc
tính theo trình tu tu trái qua phai
Ta có bang tóm tát thu tu uu tiên cua các phép toán trong bang sau:
postfix operators []. (params) expr++ expr--
unary operators ++expr --expr +expr -expr ~!
creation or cast new (type)expr
multiplicative */ %
additive + -
shift << >> >>>
relational < > <= >= instanceof
equality ==! =
Bitwise AND &
Bitwise exclusive OR ^
Bitwise inclusive OR |
Logical AND &&
Logical OR ||
Conditional ?:
Assignment = += -= *=/ = %= &= ^= |= <<= >>= >>>=
Trong bang trên thu tu uu tiên cua các phép toán duoc giam tu trên xuông duoi,
trên cùng môt hàng thì chúng có dô uu tiên ngang nhau.
• Toán tu dây
Không giông nhu C/C++, trong java chô duy nhât mà ta có thê dát toán tu dây là bên trong
cáp ngoác tròn cua câu trúc for( së duoc mô ta chi tiêt trong chuong sau )
IX. Toán tu chuyên kiêu
9.1 Chuyên dôi kiêu không tuòng minh
Viêc chuyên dôi kiêu thuong duoc diên ra môt cách tu dông trong truong hop biêu
thuc gôm nhiêu toán hang có kiêu du liêu khác nhau. Diêu này dôi khi làm cho ban khá
ngac nhiên vì nhân duoc môt kêt qua không theo ý muôn. Ví du ta xét doan trình sau:
int two=2, three=3;
Trang 24
float result=1.5 +three/two;
kêt qua nhân duoc cua result là 2.5. Diêu mà ban mong muôn là 3.0 chu không phai là 2.5.
Kêt qua 2.5 nhân duoc là do three và two là hai giá tri nguyên nên kêt qua cua phép chia
three/two cho ta môt giá tri nguyên bàng 1 chu không phai là 1.5. Dê nói ráng kêt qua cua
phép chia three/two là môt giá tri thuc chu không phai là môt giá tri nguyên thì môt trong
hai toán hang cua phép chia này phai là môt sô thuc. Do vây ta cân phai chuyên kiêu cua
môt trong hai toán hang này hoác ca hai thành sô thuc. Dê nhân duoc kêt qua dúng trong
truong hop này ban cân viêt nhu sau:
float result=1.5 + (float) three/two; hoác
float result=1.5 + three/ (float)two; hoác
float result=1.5 +(float)three/(float)two;
Lý do mà ta viêt nhu trên là nêu trong môt phép toán có su tham gia cua nhiêu toán hang
có kiêu khác nhau thì java së chuyên kiêu tu dông cho các toán hang môt cách tu dông
theo quy tác sau:
byte -> short -> int -> long -> float -> double
9.2. Chuyên dôi kiêu tuòng minh
Dê chuyên dôi kiêu môt cách tuong minh ta su dung cú pháp sau:
(type) biêu_thúc;
khi gáp câu lênh này java së tính toán giá tri cua biêu thuc sau dó chuyên dôi kiêu giá tri
cua biêu thuc thành kiêu type.
Ví du:
(int) 2.5 * 2 = 4
(int) 2.5 * 2.5 = 5
(int)(2.5 * 2.5) = 6
1+(float)5/2=1+5/(float)2=1+(float)5/(float)2=3.5
Chú ý:
- Phép toán chuyên kiêu là phép toán có dô uu tiên cao, nên (int)3.5*2≠(int)(3.4*2)
- Cân chú ý khi chuyên môt biêu thuc kiêu du liêu có miên giá tri lon sang môt kiêu
có miên giá tri nho hon. Trong truong hop này có thê ban së bi mât thông tin.
X. Các hàm toán hoc
Các hàm toán hoc nhu sin, cos, sqrt duoc java viêt sán trong lop Math. Lop này nám trong
gói java.lang (gói mác dinh) do vây ban không cân phai thêm câu lênh import o dâu
chuong trình dê có thê su dung lop này. Các hàm này duoc viêt là các phuong thuc tinh do
vây ta không cân phai tao ra thê hiên cua lop Math.
Bang sau liêt kê môt sô phuong thuc tinh trong lop Math:
Tên phuong thúc Mô ta ý nghia Kiêu tham sô Kiêu tra vê
sin(arg) tính sin cua arg arg là môt biêu thuc kiêu
double thê hiên môt cung
theo radians
double
cos(arg) tính cos cua arg arg là môt biêu thuc kiêu
double thê hiên môt cung
theo radians
double
tan(arg) tính tang cua arg arg là môt biêu thuc kiêu
double thê hiên môt cung
theo radians
double
asin(arg) tính sin-1 (arcsin) arg là môt biêu thuc kiêu double trong hê
Trang 25
arg double thê hiên môt cung
theo radians
radians
acos(arg) tính cos-1
(arccosin) cua arg
arg là môt biêu thuc kiêu
double thê hiên môt cung
theo radians
double trong hê
radians
atan(arg) tính tan-1
(arctang) cua arg
arg là môt biêu thuc kiêu
double thê hiên môt cung
theo radians
double trong hê
radians
atan2 (arg1,arg2) tính tan-1
(arctang) cua
arg1/arg2
arg1,arg2 là các biêu thuc
kiêu double thê hiên môt
cung theo radians
double trong hê
radians
abs(arg) tính tri tuyêt dôi
cua arg
arg là môt biêu thuc kiêu
int, long, float, hoác double
The same type as
the argument
max (arg1,arg2) Nhân vê giá tri lon
trong hai tham sô
arg1, arg2 là môt biêu thuc
kiêu int, long, float, hoác
double
Nhân vê kiêu
cùng kiùu voi
tham sô
min (arg1,arg2) Nhân vê giá tri
nho trong hai tham

arg1, arg2 lµ mét biùu thøc
kiùu int, long, float, hoÆc
double
Nhân vê kiêu
cùng kiùu voi
tham sô
ceil(arg) Nhân vê giá tri
nguyên nho hon
hoác báng arg
arg là biêu thuc kiêu float
hoác double
double
floor(arg) Nhân vê giá tri
nguyên lon hon
hoác báng arg
arg là biêu thuc kiêu float
hoác double
double
round(arg) Tra vê giá tri
nguyên gân arg
nhât, giá tri này
chính là giá tri cua
arg sau khi dã làm
tròn
arg là biêu thuc kiêu float
hoác double
Nhân vê kiêu int
nêu arg kiêu float,
nhân vê kiùu long
nêu arg kiêu
double
rint(arg) Giông nhu
round(arg)
arg là biêu thuc kiêu double double
sqrt(arg) tính cán bâc hai
cua arg
arg là biêu thuc kiêu double double
pow (arg1,arg2) tính arg1arg2 Ca arg1 và arg2 là các biêu
thuc kiêu double
double
exp(arg) tính earg arg là biêu thuc kiêu double double
log(arg) tính logarithmo sô
e cua arg
arg là biêu thuc kiêu double double
random() Nhân vê môt sô
gia ngâu nhiên
nám trong khoan
[0, 1)
Không có tham sô double
Ví du vê các hàm toán hoc trong lop Math, ban hãy gõ doan chuong trình sau và cho chay
thu dê thây duoc kêt qua tính toán cua các hàm toán hoc.
Trang 26
XI. Các phép toán trên kiêu kí tu
Dôi voi kiêu kí tu ta có thê thuc hiên các phép toán sô hoc (nhu: +, -, *,/ ) và các phép
toán quan hê.
Ví du:
char kt1=’A’;
char kt2=tk1+a;// kt2 nhân ký tu B
char kt3=(char)33*2;// kt3 nhân ký tu B
(kt1>kt2)= false;
(kt2=kt3)= false;
Trang 27
BÀI 3. ÐIÈU KHIEN LUÒNG CHUONG TRÌNH
Chuong trình là môt dây các lênh duoc bô trí thuc hiên theo môt trình tu nào dó,
nhung dôi khi ta muôn diêu khiên luông thuc hiên cua chuong trình tuy thuôc vào diêu
kiên gì dó. Ngôn ngu lâp trình java cung câp môt sô phát biêu cho phép ta diêu khiên
luông thuc hiên cua chuong trình, chúng duoc liêt kê trong bang sau:
Kiêu lênh Tù khoá
Láp while, do-while, for
Quyêt dinh if-else, switch-case
Xu lý lôi try-catch-finally, throw
Rë nhánh break, continue, label:, return
I. Câu trúc rê nhánh
1.1. Phát biêu if
a) Dang khuyêt
Cú pháp
if (Boolean-expression)
statement;
su hoat dông cua câu trúc if thiêu duoc mô ta qua so dô sau:
b) Dang du
Cú pháp
if (Boolean-expression)
statement1;
else
statement2;
su hoat dông cua câu trúc if thiêu duoc mô ta qua so dô sau:
diêu kiên
statement
T
F
diêu kiên
Statement 1
dúng
sai
Statement2
Trang 28
1.2. Biêu thúc diêu kiên
Cú pháp:
Variable=booleanExpression? true-result-expression:
false-result-expression;
1.3. câu trúc switch
a) Dang khuyêt
Cú pháp
switch (biêu_thúc) {
case gt_1:
lênh 1; [ break;]
case gt_2:
lênh 2; [ break;]

case gt_n:
lênh n; [ break;]
}
Sau dây là so dô khôi mô ta su hoat dông cua câu trúc rë nhánh switch dang thiêu
biêu_thuc
báng gt_1 lênh 1
biêu_thuc
báng gt_2
.....................................................................
biêu_thuc
báng gt_n
No
Yes
Yes
No
Yes
No
break;
lênh 2 break;
lênh n break;
Trang 29
b) Dang du
Cú pháp
switch(biêu_thúc) {
case gt_1:
lênh 1; [ break;]
case gt_2:
lênh 2; [ break;]

case gt_n:
lênh n; [ break;]
default:
lênh n+1;
}
Sau dây là so dô khôi mô ta su hoat dông cua câu trúc switch dang du
Chú ý:
- Biêu_thuc phai là môt biêu thuc có kiêu char, byte, short, int nhung không thê là kiêu
long, nêu biêu_thuc có kiêu khác voi các kiêu liêt kê o trên thì java së dua ra môt thông
báo lôi.
- Nêu biêu_thuc báng giá tri cua gt_i thì các lênh tu lênh i cho dên lênh n nêu không có
default (lênh n+1 nêu có default) së duoc thuc hiên.
- Câu lênh break thoát ra khoi câu trúc switch.
So dô khôi mô ta su hoat dông cua câu trúc switch trong truong hop có lênh break
biêu_t húc
bâng gt _1
Lênh 1
biêu_t húc
bâng gt _2 Lênh 2
.............. ......... ........................
.......... ............
biêu_t húc
bâng gt _n
Lênh n
No
Yes
Yes
No
Yes
No
lênh n+ 1
Trang 30
1.4. Toán tu diêu kiên
Toán tu diêu kiên là môt loai toán tu dác biêt vì nó gôm ba thành phân câu thành
biêu thuc diêu kiên. hay nói cách khác toán tu diêu kiên là toán tu 3 ngôi.
Cú pháp :
Biêu thúc 1? biêu thúc 2 : biêu thúc 3;
Trong dó
biêu thúc 1: Biêu thuc 1 là môt biêu thuc logic. Tuc là nó tra tra vê giá tri True hoác False
biêu thúc 2: Giá tri tra vê nêu biêu thuc 1 nhân giá True.
biêu thúc 3: Giá tri tra vê nêu biêu thuc 1 nhân giá tri False
Chú ý: Kiêu giá tri cua biêu thuc 2 và biêu thuc 3 phai tuong thích voi nhau.
Ví du: Doan biêu thuc diêu kiên sau tra vê giá tri “a là sô chán” nêu nhu giá tri cua biên a
là sô chán, nguoc lai tra vê giá tri “a là sô le” nêu nhu giá tri cua biên a là sô le.
String result=a%2==0 ? "a là sô chán" : "a là sô le";
II. Câu trúc làp while và do-while
1. Láp kiêm tra diêu kiên truóc
Ta có thê su dung câu trúc while dê thuc thi láp di láp lai môt lênh hoác môt khôi
lênh trong khi diêu kiên dúng
Cú pháp:
while (BooleanExpression) {
statement;
}
ta có thê thây duoc luông thuc hiên cua chuong trình thông qua so dô khôi sau:
truoc tiên phát biêu while së tính giá tri cua biêu thuc logic, nêu giá tri cua biêu thuc logic
là dúng thì câu lênh trong thân cua while së duoc thuc hiên, sau khi thuc hiên xong nó tính
lai giá tri cua biêu thuc logic, nêu giá tri dúng nó lai tiêp tuc thuc hiên lênh trong thân
while cho dên khi giá tri cua biêu thuc sai.
Ví du:
Diêu kiên láp
dúng
Lênh
sai
Trang 31
public class WhileDemo {
public static void main(String[] args) {
String copyFromMe = "Copy this string until you " +
"encounter the letter 'g'.";
StringBuffer copyToMe = new StringBuffer();
int i = 0;
char c = copyFromMe.charAt(i);
while (c! = 'g')
{
copyToMe.append(c);
c = copyFromMe.charAt(++i);
}
System.out.println(copyToMe);
}
}
Chú ý:
+ Biêu thuc bên trong cáp ngoác tròn phai là môt biêu thuc logic ( biêu thuc tra vê
giá tri true hoác false )
+ Biêu thuc diêu kiên phai nám trong cáp ngoác tròn
+ Sau tu khoá while ta chi có thê dát duoc duy nhât môt lênh, do vây dê có thê thuc
hiên nhiêu tác vu sau while ta phai bao chúng trong môt khôi lênh
+ Bên trong thân cua vòng láp while ta nên có lênh làm thay dôi giá tri cua biêu thuc
logic, nêu không chúng ta së roi vào vòng láp vô han.
+ Câu lênh trong thân câu trúc while có thê không duoc thuc hiên lân nào (do biêu
thuc lôgic ban dâu có giá tri false )
2. Láp kiêm tra diêu kiên sau
Cú pháp:
do {
statement(s);
} while (expression);
su hoat dông cua câu trúc này duoc thê hiên qua so dô sau:
Nhìn vào so dô này ta thây su hoat dông cua nó nhu sau:
b1. Thuc hiên lênh
b2. Sau khi thuc hiên lênh xong nó tính giá tri cua biêu thuc logic
Ðiêu kiên l åp
dúng
Lênh
sai
Trang 32
b3. Nêu biêu thuc logic dúng nó quay tro lai b1, nêu sai thì b4
b4. Kêt thúc vòng láp và thuc hiên lênh sau do-while
ví du:
public class DoWhileDemo {
public static void main(String[] args) {
String copyFromMe = "Copy this string until you " +
"encounter the letter 'g'.";
StringBuffer copyToMe = new StringBuffer();
int i = 0;
char c = copyFromMe.charAt(i);
do {
copyToMe.append(c);
c = copyFromMe.charAt(++i);
} while (c! = 'g');
System.out.println(copyToMe);
}
}
Chú ý:
+ Biêu thuc bên trong cáp ngoác tròn phai là môt biêu thuc logic ( biêu thuc tra vê
giá tri true hoác false )
+ Biêu thuc diêu kiên phai nám trong cáp ngoác tròn
+ Sau tu khoá do ta có thê dát duoc nhiêu lênh
+ Bên trong thân cua vòng láp do-while ta nên có lênh làm thay dôi giá tri cua biêu
thuc logic, nêu không chúng ta së roi vào vòng láp vô han.
+ Câu lênh trong thân câu trúc do-while duoc thuc hiên ít nhât môt lân
III. Câu trúc for
Dây la câu trúc láp phô biên nhât trong các ngôn ngu lâp trình, mà nôi dung cua
vòng láp cân phai láp di láp lai môt sô lân biêt truoc, cú pháp cua nó nhu sau:
for (initialization; termination; increment)
{
statement
}
Trong dó:
- initialization là giá tri khoi tao truoc khi vòng làp bát dau, nó chi duoc thuc hiên duy
nhât môt lân truoc khi vòng láp bát dâu
- termination là diêu kiên dùng dê kêt thúc quá trình làp
- increment là câu lênh dùng dê diêu khiên quá trình làp
- statement là câu lênh mà ta can phai thuc hiên làp di làp lai.
So dô khôi diên giai su hoat dông cua câu trúc for sau:
Trang 33
Nhân xét:
+ Thân cua câu trúc láp for ta chi có thê dát duoc duy nhât môt lênh, do vây dê có
thê thuc hiên nhiêu tác vu trong thân for ta phai bao chúng trong khôi lênh
+ Thân vòng láp for có thê không duoc thuc hiên lân nào
+ Các phân initialization, termination, increment có thê khuyêt tuy nhiên dây phây
dành cho nó vân phai có
+ Sô lân thuc hiên initialization=1
+ Sô lân thuc hiên termination = sô lân láp +1
+ Sô lân thuc hiên increment = sô lân láp
+ Ta có thê dát môt vài khai báo biên trong phân initialization, nhu ví du sau
+ Ta có thê mô ta câu trúc while thông qua câu trúc for nhu sau
for (; Boolean_Expression;) statement;
Ví du: kiêt kê ra 128 các kí tu asciii dâu tiên
public class ListCharacters {
public static void main(String[] args) {
for ( char c = 0; c < 128; c++)
if (c! = 26 ) // ANSI Clear screen
System.out.println( "value: " + (int)c +" character: " + c);
}
}// /:~
Toán tu dây và vòng láp for
Trong bài truoc ta dã nhác dên toán tu dây (toán tu dây là môt dây các lênh don
duoc cách nhau boi dâu phây), trong java chô duy nhât mà ta có thê dát toán tu dây dó là
bên trong câu trúc láp for, ta có thê dát toán tu dây ca trong phân initialization lân phân
increment
Ví du vê toán tu dây
public class CommaOperator {
public static void main(String[] args) {
for(int i = 1, j = i + 10; i < 5;
i++, j = i * 2) {
System.out.println("i= " + i + " j= " + j);
}
}
}
Kêt qua chay chuong trình sau:
i= 1 j= 11
increment
initialization
termination
statement
dúng
Trang 34
i= 2 j= 4
i= 3 j= 6
i= 4 j= 8
IV. Lênh break và continue
Bên trong thân cua các câu trúc láp ta có thê diêu khiên luông thuc hiên báng cách
su dung lênh break và continue, lênh break së châm dut quá trình láp mà không thuc hiên
nôt phân còn lai cua câu trúc láp, continue së ngung thuc thi phân còn lai cua thân vòng
láp và chuyên diêu khiên vê diêm bát dâu cua vòng láp, dê thuc hiên lân láp tiêp theo, ví
du sau chi ra cách su dung break và continue bên trong câu trúc láp for và while
public class BreakAndContinue {
public static void main(String[] args)
{
for(int i = 0; i < 100; i++)
{
if(i == 74) break;// Out of for loop
if(i % 9! = 0) continue;// Next iteration
System.out.println(i);
}
int i = 0;
// An "infinite loop":
while(true)
{
i++;
int j = i * 27;
if(j == 1269) break;// Out of loop
if(i % 10! = 0) continue;// Top of loop
System.out.println(i);
}
}
}
kêt qua chay chuong trình sau:
0
9
18
27
36
45
54
63
72
10
20
30
40
Bên trong câu trúc láp for giá tri cua i không thê dat duoc giá tri 100 vì phát biêu break së
kêt thúc vòng láp khi i=74
Chú ý: Java không có lênh nhây goto, tuy nhiên trong java vân có môt vài vêt tích cua
lênh nhây goto ( khét tiêng và duoc coi là nguôn sinh các lôi ) dó là lênh break và continue
Trang 35
Nhãn cua vòng láp
Trong thuc tê các vòng láp có thê lông vào nhau, muc dô lông nhau không han chê,
thê thì câu hoi dát ra là lênh break së thoát ra khoi vòng láp nào, câu tra loi là nó thoát ra
khoi vòng láp mà lênh break duoc dát, thê thì làm cách nào ta có thê cho nó thoát ra khoi
môt vòng láp tuy ý nào dó, câu tra loi là java dã hô tro cho ta môt công cu dó là nhãn cua
vòng láp.
Nhãn là môt cái tên sau dó có 2 dâu châm
Ví du LabelName:
Chô duy nhât mà nhãn có ý nghia dó là ngay truoc lênh láp, ta không thê có bât cu
môt lênh nào nám giua nhãn và lênh láp, ta mô ta su hoat dông, cách su dung nhãn cua
vòng láp thông qua ví du sau:
public class LabeledFor {
public static void (String[] args)
{
int i = 0;
outer: // Can't have statements here
for(; true; )
{ // infinite loop
inner:// Can't have statements here
for(; i < 10; i++)
{ prt("i = " + i);
if(i == 2) {
prt("continue");
continue;
}
if(i == 3) {
prt("break");
i++; // Otherwise i never
// gets incremented.
break;
}
if(i == 7) {
prt("continue outer");
i++; // Otherwise i never
// gets incremented.
continue outer;
}
if(i == 8) {
prt("break outer");
break outer;
}
for(int k = 0; k < 5; k++) {
if(k == 3) {
prt("continue inner");
continue inner;
}
}
}
}
// Can't break or continue
// to labels here
Trang 36
}
static void prt(String s) {
System.out.println(s);
}
}
kêt qua chay chuong trình nhu sau:
i = 0
continue inner
i = 1
continue inner
i = 2
continue
i = 3
break
i = 4
continue inner
i = 5
continue inner
i = 6
continue inner
i = 7
continue outer
i = 8
break outer
Trang 37
Chuong 2: LAP TRÌNH HUÓNG DÓI TUONG
Lop là khái niêm trong tâm cua lâp trình huong dôi tuong, java là ngôn ngu lâp
trình huong dôi tuong, môt chuong trình java gôm môt tâp các dôi tuong, các dôi tuong
này phôi hop voi nhau dê tao thành môt ung dung hoàn chinh. Các dôi tuong duoc mô ta
qua khái niêm lop, lop là su mo rông khái niêm RECORD trong pascal, hay struct cua C,
ngoài các thành phân du liêu, lop còn có các hàm ( phuong thuc, hành vi ), ta có thê xem
lop là môt kiêu du liêu, vì vây nguoi ta còn goi lop là kiêu du liêu dôi tuong. Sau khi dinh
nghia lop ta có thê tao ra các dôi tuong ( báng cách khai báo biên ) cua lop vua tao, do vây
có thê quan niêm lop là tâp hop các dôi tuong cùng kiêu.
Trang 38
BÀI 1. ÐINH NGHÏA LÓP
I. Khai báo lóp
1.1. Môt lóp duoc dinh nghîa theo mâu sau:
[pbulic][final][abstract] class <tên_lóp>{
// khai báo các thuôc tính
// khai báo các phuong thúc
}
sau dâu là ví du don gian dinh nghia lop ngán xêp:
Tông quát: môt lóp duoc khai báo dang sau:
[public][<abstract><final>][ class <Tên lop>
[extends <Tên lop cha>] [implements <Tên giao diên>] {
<Các thành phân cua lop, bao gôm: thuôc tính và phuong thuc>
}
Trong dó:
1. Boi mác dinh môt lop chi có thê su dung boi môt lop khác trong cùng môt gói voi
lop dó, nêu muôn gói khác có thê su dung lop này thì lop này phai duoc khai báo là lop
public.
2. abstract là bô tu cho java biêt dây là môt lop truu tuong, do vây ta không thê tao ra
môt thê hiên cua lop này
3. final là bô tu cho java biêt dây là môt lop không thê kê thua
Trang 39
4. class là tu khoá cho chuong trình biêt ta dang khai báo môt lop, lop này có tên là
NameOfClass
5. extends là tu khoá cho java biêt lop này này duoc kê thua tu lop super
6. implements là tu khoá cho java biêt lop này së triên khai giao diên Interfaces, dây
là môt dang tuong tu nhu kê thua bôi cua java.
Chú ý:
a) Thuôc tính cua lop là môt biên có kiêu du liêu bât ky, nó có thê lai là môt biên có
kiêu là chính lop dó
b) Khi khai báo các thành phân cua lop (thuôc tính và phuong thuc) có thê dùng môt
trong các tu khoá private, public, protected dê giuo han su truy câp dên thành phân dó.
– Ccác thành phân private chi có thê su dung duoc o bên trong lop, ta không thê truy
câp vào các thành phân private tu bên ngoài lop
– Các thành phân public có thê truy câp duoc ca bên trong lop lân bên ngoài lop.
– Các thành phân protected tuong tu nhu các thành phân private, nhung có thê truy câp
duoc tu bât cu lop con nào kê thua tu nó.
– Nêu môt thành phân cua lop khi khai báo mà không su dung môt trong 3 bô tu
protected, private, public thì su truy câp là ban bè, tuc là thành phân này có thê truy
câp duoc tu bât cu lop nào trong cùng gói voi lop dó.
c) Các thuôc tính nên dê muc truy câp private dê dam bao tính dâu kín và lúc dó dê
bên ngoài pham vi cua lop có thê truy câp duoc dên thành phân private này ta phai tao
ra các phuong thuc phuong thuc get và set.
d) Các phuong thuc thuong khai báo là public, dê chúng có thê truy câp tu bât cu dâu.
e) Trong môt têp chuong trình (hay còn goi là môt don vi biên dich) chi có môt lop
duoc khai báo là public, và tên lop public này phai trùng voi tên cua têp kê ca chu
hoa, chu thuong
1.2. Khai báo thuôc tính
Tro lai lop Stack
public class Stack {
private Vector items;
// a method with same name as a member variable
public Vector items() {
...
}
}
Trong lop Stack trên ta có môt thuôc tính duoc dinh nghia nhu sau:
private Vector items;
Viêc khai báo nhu trên duoc goi là khai báo thuôc tính hay còn goi là biên thành viên lop
Tông quát viêc khai báo môt thuôc tính duoc viêt theo mâu sau:
Trong dó:
Trang 40
Ø accessLevel có thê là mot trong các tu public, private, protected hoàc có thê bo trông,
ý nghia cua các bô tu này duoc mô ta o phân trên
Ø - static là tu khoá báo ráng dây là mot thuoc tính lop, nó là mot thuoc tính su dung
chung cho ca lop, nó không là cua riêng môt dôi tuong nào.
Ø - transient và volatile chua duoc dùng
Ø - type là mot kiêu dù liêu nào dó
Ø name là tên cua thuoc tính
Chú ý: Ta phai phân biêt duoc viêc khai báo nhu thê nào là khai báo thuôc tính, khai báo
thê nào là khai báo biên thông thuong? Câu tra loi là tât ca các khai báo bên trong thân cua
môt lop và bên ngoài tât ca các phuong thuc và hàm tao thì dó là khai báo thuôc tính, khai
báo o nhung chô khác së cho ta biên.
1.3. Khai báo phuong thúc
Trong lop Stack trên ta có phuong thuc push dùng dê dây môt dôi tuong vào dinh ngán
xêp, nó duoc dinh nghia nhu sau:
Cung giông nhu môt lop, môt phuong thuc cung gôm có 2 phân: phân khai báo và phan
thân
- Phân khai báo gôm có nhung phân sau( chi tiêt cua khai báo duoc mô ta sau):
- Phân thân cua phuong thuc gôm các lênh dê mô ta hành vi cua phuong thuc, các hành vi
này duoc viêt báng các lênh cua java.
II. Chi tiêt vê khai báo môt phuong thúc
1. Tông quát môt phuong thúc duoc khai báo nhu sau:
accessLevel //mô ta muc dô truy câp dên phuong thuc
static //dây là phuong thuc lop
abstract //dây là phuong thuc không có cài dát
final //phuong thuc này không thê ghi dè
native //phuong thuc này duoc viêt trong môt ngôn ngu khác
synchronized //dây là phuong thuc dông bô
returnType //giá tri tra vê cua phuong thuc
MethodName //tên cua phuong thuc
throws
exception
//khai báo các ngoai lê có thê duoc nem ra tu phuong
thuc
Trong dó:
Trang 41
- accessLevel có thê là môt trong các tu khoá public, private, protected hoác bo trông, ý
nghia cua các bô tu này duoc mô ta trong phân khai báo lop
- static là tu khoá báo cho java biêt dây là môt phuong thuc lop
- abstract tu khoá cho biêt dây là môt lop truu tuong, nó không có cài dát.
- final dây là tu khoá báo cho java biêt dây là phuong thuc không thê ghi dè tu lop con
- native dây là tu khoá báo cho java biêt phuong thuc này duoc viêt báng môt ngôn ngu
lâp trình nào dó không phai là java ( thuong duoc viêt báng C/C++)
- synchronized dây là môt phuong thuc dông bô, nó rât huu ích khi nhiêu phuong thuc
cùng truy câp dông thoi vào tài nguyên miên gáng
- returnType là môt kiêu du liêu, dây là kiêu tra vê cua phuong thuc, khi phuong thuc
không tra vê du liêu thì phai dùng tu khoá void
- MethodName là tên cua phuong thuc, tên cua phuong thuc duoc dát theo quy tác dát tên
cua java
- throws là tu khoá dùng dê khai báo các ngoai lê có thê duoc ném ra tu phuong thuc,
theo sau tu khoá này là danh sách các ngoai lê có thê duoc phuong thuc này ném ra
Chú ý:
1) Nêu trong lop có ít nhât môt phuong thuc truu tuong thì lop dó phai là lop truu
tuong
2) không có thuôc tính truu tuong
3) ta không thê tao dôi tuong cua lop truu tuong
4) khác voi ngôn ngu C/C++, java bát buôc ban phai khai báo giá tri tra vê cho phuong
thuc, nêu phuong thuc không tra vê du liêu thi dùng tu khoá void (trong C/C++ khi ta
không khai báo giá tri tra vê thì mác dinh giá tri tra vê là int)
2. Nhân giá tri tra vê tù phuong thúc
Ta khai báo kiêu giá tri tra vê tu lúc ta khai báo phuong thuc, bên trong thân cua
phuong thuc ta phai su dung phát biêu return value; dê nhân vê kêt qua, nêu hàm duoc
khai báo kiêu void thì ta chi su dung phát biêu return; mênh dê return dôi khi còn duoc
dùng dê kêt thúc môt phuong thuc.
3. Truyên tham sô cho phuong thúc
Khi ta viêt các phuong thuc, môt sô phuong thuc yêu câu phai có môt sô tham sô,
các tham sô cua môt phuong thuc duoc khai báo trong loi khai báo phuong thuc, chúng
phai duoc khai báo chi tiêt có bao nhiêu tham sô, môi tham sô cân phai cung câp cho
chúng môt cái tên và kiêu du liêu cua chúng.
Ví du: ta có môt phuong thuc dùng dê tính tông cua hai sô, phuong thuc này duoc khai
báo nhu sau:
public double tongHaiSo(double a, double b){
return (a + b);
}
1. Kiêu tham sô
Trong java ta có thê truyên vào phuong thuc môt tham sô có kiêu bât ky, tu kiêu du
liêu nguyên thuy cho dên tham chiêu dôi tuong.
2. Tên tham sô
Khi ban khai báo môt tham sô dê truyên vào phuong thuc thì ban phai cung câp cho
nó môt cái tên, tên nay duoc su dung bên trong thân cua phuong thuc dê tham chiêu dên
tham sô duoc truyên vào.
Trang 42
Chú ý: Tên cua tham sô có thê trùng voi tên cua thuôc tính, khi dó tên cua tham sô së
“che” di tên cua phuong thuc, boi vây bên trong thân cua phuong thuc mà có tham sô có
tên trùng voi tên cua thuôc tính, thì khi nhác dên cái tên dó có nghia là nhác dên tham sô.
3. Truyên tham sô theo tri
Khi goi môt phuong thuc mà tham sô cua phuong thuc có kiêu nguyên thuy, thì ban
sao giá tri cua tham sô thuc su së duoc chuyên dên phuong thuc, dây là dác tính truyên
theo tri ( pass- by – value ), nghia là phuong thuc không thê thay dôi giá tri cua các tham
sô truyên vào.
Ta kiêm tra diêu này qua ví du sau:
public class TestPassByValue {
public static void test(int t) {
t++;
System.out.println("Gia tri cúa t bi?n trong ham sau khi tang len 1 la " + t);
}
public static void main(String[] args) {
int t = 10;
System.out.println("Gia tri cúa t tru?c khi goi ham = " + t);
test(t);
System.out.println("Gia tri cúa t truoc khi goi ham = " + t);
}
}
Ta së nhân duoc kêt qua ra nhu sau:
Gia tri cua t truoc khi goi ham = 10
Gia tri cua t bên trong ham sau khi tang len 1 la 11
Gia tri cua t truoc khi goi ham = 10
4. Thân cua phuong thúc
Trong ví du sau thân cua phuong thuc isEmpty và phuong thuc pop duoc in dâm và
có mâu do
class Stack {
static final int STACK_EMPTY = -1;
Object[] stackelements;
int topelement = STACK_EMPTY;
...
boolean isEmpty() {
if (topelement == STACK_EMPTY)
return true;
else
return false;
}
Object pop() {
if (topelement == STACK_EMPTY)
return null;
else { return stackelements[topelement--]; }
}
Ví du: Xây dung lop man
import java.lang.*;
import java.io.*;
import java.util.*;
public class Man
Trang 43
{protected
String ten;
int namsinh;
public Man(String name,int birthday){
ten=name;namsinh=birthday;
}
public int tuoi()
{Calendar now=Calendar.getInstance();
return (now.get(Calendar.YEAR) - namsinh);
}
public void hienthi()
{System.out.println("Ho va ten:"+ten);
System.out.println("Ho va ten:"+tuoi());
}
public void HienThiNgay()
{ Calendar now=Calendar.getInstance();
System.out.println("Ngay hien tai=" +now.get(Calendar.DATE));
System.out.println("Thang hien tai=" +now.get(Calendar.MONTH));
System.out.println("Nam hien tai=" +now.get(Calendar.YEAR));
System.out.println("Gio hien tai=" +now.get(Calendar.HOUR));
System.out.println("Phut hien tai=" +now.get(Calendar.SECOND));
}
III. Tù khoá this
Thông thuong bên trong thân cua môt phuong thuc ta có thê tham chiêu dên các
thuôc tính cua dôi tuong dó, tuy nhiên trong môt sô tình huông dác biêt nhu tên cua tham
sô trùng voi tên cua thuôc tính, lúc dó dê chi các thành viên cua dôi tuong dó ta dùng tu
khoá this, tu khoá this dùng dê chi dôi tuong này.
Ví du sau chi ra cho ta thây trong tình huông này bát buôc phai dùng tu khoá this vì tên
tham sô cua phuong thuc tao dung lai trùng voi tên cua thuôc tính
class HSBColor {
int hue, saturation, brightness;
HSBColor (int hue, int saturation, int brightness) {
this.hue = hue;
this.saturation = saturation;
this.brightness = brightness;
}
IV. Tù khoá super
Khi môt lop duoc kê thua tu lop cha trong ca lop cha và lop con dêu có môt
phuong thuc trùng tên nhau, thê thì làm thê nào có thê goi phuong thuc trùng tên dó cua
lop cha, java cung câp cho ta tu khoá super dùng dê chi doi tuong cua lop cha
Ta xét ví du sau
class ASillyClass
{ boolean aVariable;
void aMethod() {
aVariable = true;
}
}
Trang 44
class ASillierClass extends ASillyClass
{ boolean aVariable;
void aMethod() {
aVariable = false;
super.aMethod();
System.out.println(aVariable);
System.out.println(super.aVariable);
}
}
trong ví du trên ta thây trong lop cha có phuong thuc tên là aMethod trong lop con cung
có môt phuong thuc cùng tên, ta còn thây ca hai lop này cùng có môt thuôc tính tên
aVariable dê có thê truy câp vào các thành viên cua lop cha ta phai dùng tu khoá super.
Chú ý: Ta không thê dùng nhiêu tu khoá này dê chi lop ông, lop cu… cháng han viêt nhu
sau là sai: super.super.add(1,4);
V. Su dung lóp
Sau khi khao môt môt lop ta có thê xem lop nhu là môt kiêu du liêu, nên ta có thê
tao ra các biên, mang các dôi tuong, viêc khai báo môt biên, mang các dôi tuong cung
tuong tu nhu khai báo môt biên, mang cua kiêu du liêu nguyên thuy
Viêc khai báo môt biên, mang duoc khai báo theo mâu sau:
<Tên_Lóp> < tên_biên>;
<Tên_Lóp> <tên_mang>[kích thuóc mang];
<Tên_Lóp>[kích thuóc mang] <tên_mang>;
Vê ban chât môi dôi tuong trong java là môt con tro toi môt vùng nho, vùng nho
này chính là vùng nho dùng dê luu tru các thuôc tính, vùng nho dành cho con tro này thì
duoc câp phát trên stack, còn vùng nho dành cho các thuôc tính cua dôi tuong này thì
duoc câp phát trên heap.
VI. Diêu khiên viêc truy câp dên các thành viên cua môt lóp
Khi xây dung môt lop ta có thê han chê su truy câp dên các thành viên cua lop, tu
môt dôi tuong khác.
Ta tóm tát qua bang sau:
Tu khoá Truy câp
trong
chính lop

Truy câp
trong lop
con cùng
gói
Truy câp
trong lop
con khác
gói
Truy câp trong
lop khác cùng gói
Truy câp trong
lop khác khác gói
private X - - - -
protected X X X X -
public X X X X X
default X X - X -
Trong bang trên thì X thê hiên cho su truy câp hop lê còn – thê hiên không thê truy câp
vào thành phân này.
1. Các thành phân private
Các thành viên private chi có thê su dung bên trong lop, ta không thê truy câp các
thành viên private tu bên ngoài lop này.
Ví du:
class Alpha
Trang 45
{
private int iamprivate;
private void privateMethod()
{
System.out.println("privateMethod");
}
}
class Beta {
void accessMethod()
{
Alpha a = new Alpha();
a.iamprivate = 10;// không hop lê
a.privateMethod();// không hop lê
}
}
2. Các thành phân protected
Các thành viên protected së duoc thao luân trong chuong sau
3. Các thành phân public
Các thành viên public có thê truy câp tu bât cu dâu, ta se xem ví du sau:
package Greek;
public class Alpha
{
public int iampublic;
public void publicMethod()
{ System.out.println("publicMethod");}
}
package Roman;
import Greek.*;
class Beta {
void accessMethod() {
Alpha a = new Alpha();
a.iampublic = 10; // hop lê
a.publicMethod(); // hop lê
}
}
4. Các thành phân có múc truy xuât gói
Khi ta khai báo các thành viên mà không su dung môt trong các tu public, private,
protected thì java mác dinh thành viên dó có muc truy câp gói.
Ví du
package Greek;
class Alpha {
int iampackage;
void packageMethod() { System.out.println("packageMethod");}
}
package Greek;
class Beta {
Trang 46
void accessMethod() { Alpha a = new Alpha();a.iampackage = 10;// legal
a.packageMethod();// legal}
}
Trang 47
BÀI 2. KHÒI ÐÀU VÀ DON DEP
I. Phuong thúc tao dung (constructor)
1. Công dung
Phuong thuc tao dung là môt phuong thuc cua lop ( nhung khá dác biêt ) thuong dùng
dê khoi tao môt dôi tuong moi. Thông thuong nguoi ta thuong su dung hàm tao dê khoi
gán giá tri cho các thuôc tính cua dôi tuong và có thê thuc hiên môt sô công viêc cân thiêt
khác nhám chuân bi cho dôi tuong moi.
2. Cách viêt hàm tao
a) dác diêm cua phuong thúc tao dung
Ø hàm tao có tên trùng voi tên cua lop
Ø hàm tao không bao gio tra vê kêt qua
Ø nó duoc java goi tu dông khi môt dôi tuong cua lop duoc tao ra
Ø hàm tao có thê có dôi sô nhu các phuong thuc thông thuong khác
Ø trong môt lop có thê có nhiêu hàm tao
b) Ví du
Ví du 1: su dung hàm tao dê in ra màn hình xâu “Creating Rock”
class Rock {
Rock() {// This is the constructor
System.out.println("Creating Rock");
}
}
public class SimpleConstructor {
public static void main(String[] args) {
for(int i = 0; i < 10; i++)
new Rock();// call constructor
}
}
Ví du 2: su dung hàm tao có dôi
class Rock2 {
Rock2(int i) {
System.out.println(
"Creating Rock number " + i);
}
}
public class SimpleConstructor2 {
public static void main(String[] args) {
for(int i = 0; i < 10; i++)
new Rock2(i);// goi hàm tao có dôi
}
}// /:~
3. Hàm tao mác dinh
Khi xây dung môt lop mà không xây dung hàm tao thê thì java së cung câp cho ta
môt hàm tao không dôi mác dinh, hàm tao này thuc chât không làm gì ca, nêu trong lop dã
có ít nhât môt hàm tao thì hàm tao mác dinh së không duoc tao ra, khi ta tao ra môt dôi
tuong thì së có môt hàm tao nào dó duoc goi, nêu trình biên dich không tìm thây hàm tao
tuong ung nó së thông báo lôi, diêu này thuong xây ra khi chúng ta không xây dung hàm
Trang 48
tao không dôi nhung khi tao dung dôi tuong ta lai không truyên vào tham sô, nhu duoc chi
ra trong ví du sau:
public class TestPassByValue {
public TestPassByValue(String s) {
System.out.println(s);
}
public static void main(String[] args) {
TestPassByValue thu = new TestPassByValue();
// lôi vì lóp này không có hàm tao không dôi
TestPassByValue thu1 = new TestPassByValue("Hello World");
// không vân dê gì
}
}
4. Goi hàm tao tù hàm tao
Khi ban viêt nhiêu hàm tao cho lop, có dôi lúc ban muôn goi môt hàm tao này tu
bên trong môt hàm tao khác dê tránh phai viêt láp mã. Dê có thê goi dên hàm tao ta su
dung tu khoá this.
Cú pháp this(danh sách dôi sô);
Ví du:
public class Test {
public Test ()
{
System.out.println("hàm tao không dôi");
}
public Test ( int i)
{
this();// goi dên hàm tao không dôi cúa chính lóp này
}
public static void main(String[] args) {
TestPassByValue thu=new TestPassByValue(10);
}
}
Chú ý:
a) bên trong câu tu ta chi có thê goi duoc tôi da môt câu tu, diêu này có nghia là ta không
thê goi duoc tu 2 câu tu tro lên bên trong môt câu tu khác nhu duoc chi ra trong ví du
sau:
public class TestPassByValue {
public TestPassByValue() {
System.out.println("Day la ham tao khong doi");
}
public TestPassByValue(int i) {
System.out.println("Day la ham tao doi so nguyen");
}
public TestPassByValue(String s) {
this();// không thê goi hai hàm tao tró lên bên trong môt hàm tao
this(10);
System.out.println("Day la ham tao doi so xau");
}
Trang 49
public static void main(String[] args) {
TestPassByValue thu = new TestPassByValue();//
TestPassByValue thu1 = new TestPassByValue("Hello World");//
}
}
b) khi goi môt hàm tao bên trong môt hàm tao khác thì loi goi hàm tao phai là lênh dâu
tiên trong thân phuong thuc, nên ví du sau së bi báo lôi
public class Test{
public Test () {
System.out.println("Day la ham tao khong doi");
}
public Test (String s) {
System.out.println("Day la ham tao doi so xau");
this();// goi dên câu tú phái là lênh dâu tiên
}
public static void main(String[] args) {
Test thu = new Test ("Hello World¨);
}
}
nêu cho dich ví du trên trình biên dich së phàn nàn
"Test.java": call to this must be first statement in constructor at line 7, column 9
II. Khôi khoi dâu vô danh và khôi khoi dâu tinh
1. Khôi vô danh
Trong java ta có thê dát môt khôi lênh không thuôc môt phuong thuc nào, nghia là
khôi này không thuôc bât cu phuong thuc nào kê ca hàm tao. khi dó khôi lênh này duoc
goi là khôi vô danh, khôi vô danh này duoc java goi thuc thi khi môt dôi tuong duoc tao
ra, các khôi vô danh duoc goi truoc ca hàm tao, thông thuong ta hay su dung khôi vô danh
dê khoi dâu các thuôc tính cua lop hoác duoc su dung dê khoi tao cho các thôc tính cua
môt lop vô danh(vì lop vô danh không có tên do vây ta không thê viêt hàm tao cho lop
này, trong truong hop này khôi vô danh là giai pháp duy nhât )
Ví du: o ví du này ta có 3 khôi vô danh, khi chay java cho thuc thi các khôi vô danh này
theo thu tu tu trên xuông duoi
public class Untitled1{
// hàm tao
public Untitled1 (){
System.out.println ( "Day la ham tao" );
}
// bät dâu khôi vô danh
{
System.out.println ( "khoi khoi dau thu 3 ");
}// kêt thúc khôi vô danh
//bät dâu khôi vô danh
{
System.out.println ( "khoi khoi dau thu 1 ");
}//kêt thúc khôi vô danh
// bät dâu khôi vô danh
{
Trang 50
System.out.println ( "khoi khoi dau thu 2 ");
}//kêt thúc khôi vô danh
public static void main ( String[] args )
{
Untitled1 dt1 = new Untitled1 ();
Untitled1 dt2 = new Untitled1 ();
}
}
khi chay chuong trình së cho kêt qua sau:
khoi khoi dau thu 3
khoi khoi dau thu 1
khoi khoi dau thu 2
Day la ham tao
khoi khoi dau thu 3
khoi khoi dau thu 1
khoi khoi dau thu 2
Day la ham tao
2. Khôi khoi dâu tînh
Khôi khoi dâu tinh là môt khôi lênh bên ngoài tât ca các phuong thuc, kê ca hàm
tao, truoc khôi lênh này ta dát tu khoá static, tu khoá này báo cho java biêt dây là khôi
khoi dâu tinh, khôi này chi duoc goi 1 lân khi dôi tuong dâu tiên cua lop này duoc tao ra,
khôi khoi dâu tinh này cung duoc java goi tu dông truoc bât cu hàm tao nào, thông thuong
ta su dung khôi khoi dâu tinh dê khoi dâu các thuôc tính tinh ( static ), sau dây là môt ví
du có 1 khôi khoi dâu tinh và môt khôi vô danh, dê ban thây duoc su khác nhau giua khôi
khoi dâu tinh và khôi vô danh
public class Untitled1
{
public Untitled1 ()
{
System.out.println ( "Ðây là hàm tao" );
}
static {// dây là khôi khói dâu tïnh
System.out.println ( "Ðây là khôi khói dâu tïnh");
System.out.println("Khôi này chi duoc goi 1 lân khi thê hiên dâu tiên cúa lóp duoc
tao ra");
}
{//dây là khôi vô danh
System.out.println ( "Ðây là khôi vô danh ");
}
public static void main ( String[] args )
{
Untitled1 dt1 = new Untitled1 ();/ / tao ra thê hiên thú nhât cúa lóp
Untitled1 dt2 = new Untitled1 ();/ / tao tiêp thê hiên thu 2 cúa lóp
}
}
khi cho chay chuong trình ta së duoc kêt qua ra nhu sau:
Dây là khôi khoi dâu tinh
Khôi này chi duoc goi 1 lân khi thê hiên dâu tiên cua lop duoc tao ra
Trang 51
Dây là khôi vô danh
Dây là hàm tao
Dây là khôi vô danh
Dây là hàm tao
Nhìn vào kêt qua ra ta thây khôi khoi dâu tinh chi duoc java goi thuc hiên 1 lân khi dôi
tuong dâu tiên cua lop này duoc tao, còn khôi vô danh duoc goi môi khi môt dôi tuong
moi duoc tao ra
III. Don dep: kêt thúc và thu rác
1. Phuong thúc finalize
Java không có phuong thuc huy bo. Phuong thuc finalize tuong tu nhu phuong
thuc huy bo cua C++, tuy nhiên nó không phai là phuong thuc huy bo. So di nó không
phai là phuong thuc huy bo vì khi dôi tuong duoc huy bo thì phuong thuc này chua chác
dã duoc goi dên. Phuong thuc này duoc goi dên chi khi bô thu rác cua Java duoc khoi
dông và lúc dó dôi tuong không còn duoc su dung nua. Do vây phuong thuc finalize có
thê không duoc goi dên.
2. Co chê gom rác cua java
Nguoi lâp trình C++ thuong su dung toán tu new dê câp phát dông môt dôi tuong,
nhung lai thuong quên goi toán tu delete dê giai phóng vùng nho này khi không còn dùng
dên nua, diêu này làm rò ri bô nho dôi khi dân dên chuong trình phai kêt thúc môt cách
bât thuong, qua thât dâu là môt diêu tôi tê. Trong java ta không cân quan tâm dên diêu dó,
java có môt co chê thu rác tu dông, nó du thông minh dê biêt dôi tuong tuong nào không
dùng nua, rôi nó tu dông thu hôi vùng nho dành cho dôi tuong dó.
Trong ngôn ngu C++ khi môt dôi tuong bi phá huy, së có môt hàm duoc goi tu
dông, hàm này duoc goi là huy tu hay còn goi là hàm huy, thông thuong hàm hàm huy
mác dinh là du là du dê don dep, tuy nhiên trong môt sô truong hop thì hàm huy mác dinh
lai không thê dáp ung duoc, do vây nguoi lâp trình C++, phai viêt ra hàm huy riêng dê làm
viêc dó, tuy nhiên java lai không có khái niêm hàm huy hay môt cái gì dó tuong tu.
Trang 52
BÀI 3. CÁC THÀNH PHÀN TÏNH
I. Thuôc tính tinh
Thuôc tính duoc khai báo voi tu khoá static goi là thuôc tính tinh
Ví du:
class Static{
static int i = 10;// Dây là thuôc tính tinh
int j = 10;// Dây là thuôc tính thuong

}
+ Các thuôc tính tinh duoc câp phát môt vùng bô nho cô dinh, trong java bô nho dành cho
các thuôc tính tinh chi duoc câp phát khi lân dâu tiên ta truy câp dên nó.
+ Thành phân tinh là chung cua ca lop, nó không là cua riêng môt dôi tuong nào ca.
+ Dê truy xuât dên thuôc tính tinh ta có thê dùng môt trong 2 cách sau:
tên_lop.tên_thuôc_tính_tinh;
tên_dôi_tuong.tên_thuôc_tính_tinh;
ca 2 cách truy xuât trên dêu có tác dung nhu nhau
+ khoi gán giá tri cho thuôc tính tinh
thành phân tinh duoc khoi gán báng môt trong 2 cách sau:
Ø Su dung khôi khoi dâu tinh (xem lai bài truoc )
Ø Su dung khoi dâu truc tiêp khi khai báo nhu ví du trên
Chú ý: Ta không thê su dung hàm tao dê khoi dau các thuoc tính tinh, boi vì hàm tao
không phai là phuong thuc tinh.
II. Phuong thúc tinh
Môt phuong thuc duoc khai báo là static duoc goi là phuong thuc tinh
Ví du:
class Static{
static int i;// Dây là thuôc tính tinh
// phuong thuc tinh
static void println (){
System.out.println ( i );
}
}
+ Phuong thuc tinh là chung cho ca lop, nó không lê thuôc vào môt dôi tuong cu thê nào
+ Loi goi phuong thuc tinh xuât phát tu:
tên cua lop: tên_lop.tên_phuong_thuc_tinh(tham sô);
tên cua dôi tuong: tên_dôi_tuong. tên_phuong_thuc_tinh(tham sô);
+ Vì phuong thuc tinh là dôc lâp voi dôi tuong do vây o bên trong phuong thuc tinh ta
không thê truy câp các thành viên không tinh cua lop dó, tuc là bên trong phuong thuc
tinh ta chi có thê truy câp dên các thành viên tinh mà thôi.
+ Ta không thê su dung tu khoá this bên trong phuong thuc tinh
Trang 53
BÀI 4. NAP CHÒNG PHUONG THÚC
I. Khái niêm vê phuong thúc bôi tai
Java cho phép ta xây dung nhiêu phuong thuc trùng tên nhau, trong cùng môt lop, hiên
tuong các phuong thuc trong môt lop có tên giông nhau duoc goi là bôi tai phuong thuc.
II. Yêu câu cua các phuong thúc bôi tai
Do su dung chung môt cái tên cho nhiêu phuong thuc, nên ta phai cho java biêt cân
phai goi phuong thuc nào dê thuc hiên, java dua vào su khác nhau vê sô luong dôi cung
nhu kiêu du liêu cua các dôi này dê phân biêt các phuong thuc trùng tên dó.
Ví du:
public class OverloadingOrder {
static void print(String s, int i) {
System.out.println(
"String: " + s +
", int: " + i);
}
static void print(int i, String s) {
System.out.println(
"int: " + i +
", String: " + s);
}
public static void main(String[] args) {
print("String first", 11);
print(99, "Int first");
}
}// /:~
Chú ý:
1) Nêu nêu java không tìm thây môt hàm bôi tai thích hop thì nó së dua ra môt thông
báo lôi
2) Ta không thê su dung giá tri tra vê cua hàm dê phân biêt su khác nhau giua 2
phuong thuc bôi tai
3) Không nên quá lam dung các phuong thuc bôi tai vì trình biên dich phai mât thoi
gian phán doán dê tìm ra hàm thích hop, diêu này dôi khi còn dân dên sai sót
4) Khi goi các hàm nap chông ta nên có lênh chuyên kiêu tuong minh dê trình biên
dich tìm ra hàm phù hop môt cách nhanh nhât
5) Trong java không thê dinh nghia chông toán tu nhu trong ngôn ngu C++, có thê
dây là môt khuyêt diêm, nhung nhung nguoi thiêt kê java cho ráng diêu này là
không cân thiêt, vì nó quá phuc tap.
Trang 54
BÀI 5. KÉ THÙA (INHERITANCE)
I. Lóp co so và lóp dân xuât
- Môt lop duoc xây dung thông qua kê thua tu môt lop khác goi là lop dân xuât (hay còn
goi là lop con, lop hâu duê ), lop dùng dê xây dung lop dân xuât duoc goi là lop co so (
hay còn goi là lop cha, hoác lop tô tiên )
Ø Môt lop dân xuât ngoài các thành phân cua riêng nó, nó còn duoc kê thua tât ca các
thành phân cua lop cha
II. Cách xây dung lóp dân xuât
Dê nói lop b là dân xuât cua lop a ta dùng tu khoá extends, cú pháp nhu sau:
class b extends a
{
// phân thân cua lop b
}
III. Thùa kê các thuôc tính
Thôc tính cua lop co so duoc thua kê trong lop dân xuât, nhu vây tâp thuôc tính cua lop
dân xuât së gôm: các thuôc tính khai báo trong lop dân xuât và các thuôc tính cua lop co
so, tuy nhiên trong lop dân xuât ta không thê truy câp vào các thành phân private, package
cua lop co so
IV. Thùa kê phuong thúc
Lop dân xuât kê thua tât ca các phuong thuc cua lop co so tru:
Ø Phuong thuc tao dung
Ø Phuong thuc finalize
V. Khoi dâu lóp co so
Lop dân xuât kê thua moi thành phân cua lop co, diêu này dân ta dên môt hình
dung, là lop dân xuât có cùng giao diên voi lop co so và có thê có các thành phân moi bô
sung thêm. nhung thuc tê không phai vây, kê thua không chi là sao chép giao diên cua lop
cua lop co so. Khi ta tao ra môt dôi tuong cua lop suy dân, thì nó chua bên trong nó môt
su vât con cua lop co so, su vât con này nhu thê ta dã tao ra môt su vât tuong minh cua
lop co so, thê thì lop co so phai duoc bao dam khoi dâu dúng, dê thuc hiên diêu dó trong
java ta làm nhu sau:
Thuc hiên khoi dau cho lop co so báng cách goi cau tu cua lop co so bên trong cau tu cua
lop dan xuat, nêu ban không làm diêu này thì java se làm giúp ban, nghia là java luôn tu
dong thêm loi goi cau tu cua lop co so vào cau tu cua lop dan xuat nêu nhu ta quên làm
diêu dó, dê có thê goi cau tu cua lop co so ta su dung tu khoá super
Ví du 1: ví du này không goi câu tu cua lop co so môt cách tuong minh
class B
{
public B ()
{ System.out.println ( "Ham tao cúa lop co so" );}
}
public class A extends B
{ public A () {// không goi hàm tao cúa lóp co só tuòng minh
System.out.println ( "Ham tao cúa lop dan xuat" );
}
Trang 55
public static void main ( String arg[] )
{
A thu = new A ();
}
}
Kêt qua chay chuong trình nhu sau:
Ham tao cua lop co so
Ham tao cua lop dan xuat
Ví du 2: ví du này su dung tu khoá super dê goi câu tu cua lop co so môt cách tuong minh
class B
{ public B ()
{ System.out.println ( "Ham tao cúa lop co so" ); }
}
public class A extends B
{ public A ()
{ super();// goi tao cúa lóp co só môt cách tuòng minh
System.out.println ( "Ham tao cúa lop dan xuat" );
}
public static void main ( String arg[] )
{
A thu = new A ();
}
}
khi chay chung trình ta thây kêt qua giông hêt nhu ví du trên
Chú ý 1: Nêu goi tuong minh câu tu cua lop co so, thì loi goi này phai là lênh dâu tiên,
nêu ví du trên dôi thành
class B
{ public B ()
{System.out.println ( "Ham tao cúa lop co so" );}
}
public class A extends B
{public A () {// Lòi goi câu tú cúa lóp co só không phái là lênh dâu tiên
System.out.println ("Ham tao cúa lop dan xuat");
super ();
}
public static void main ( String arg[] )
{
A thu = new A ();
}
}
Nêu biên dich doan mã này ta së nhân duoc môt thông báo lôi nhu sau:
"A.java": call to super must be first statement in constructor at line 15, column 15
Chú ý 2: ta chi có thê goi dên môt hàm tao cua lop co so bên trong hàm tao cua lop dân
xuât, ví du chi ra sau dã bi báo lôi
class B
{ public B (){System.out.println ( "Ham tao cúa lop co so" );}
public B ( int i )
{System.out.println ( "Ham tao cúa lop co so" );}
Trang 56
}
public class A extends B
{ public A ()
{super ();
super ( 10 );/ / không thê goi nhiêu hon 1 hàm tao cúa lóp co só
System.out.println ( "Ham tao cúa lop dan xuat" );
}
public static void main ( String arg[] )
{
A thu = new A ();
}
}
1. Trât tu khoi dâu
Trât tu khoi dâu trong java duoc thuc hiên theo nguyên tác sau: java së goi câu tu
cua lop co so truoc sau dó moi dên câu tu cua lop suy dân, diêu này có nghia là trong cây
pha hê thì các câu tu së duoc goi theo trât tu tu gôc xuông dân dên lá
2. Trât tu don dep
Mác dù java không có khái niêm huy tu nhu cua C++, tuy nhiên bô thu rác cua java
vân hoat dông theo nguyên tác làm viêc cua câu tu C++, tuc là trât tu thu rác thì nguoc lai
so voi trât tu khoi dâu.
VI. Ghi dè phuong thúc ( Override )
Hiên tuong trong lop co so và lop dân xuât có hai phuong thuc giông hêt nhau ( ca
tên lân bô tham sô) goi là ghi dè phuong thuc ( Override ), chú ý Override khác Overload.
Goi phuong thúc bi ghi dè cua lóp co so
Bên trong lop dân xuât, nêu có hiên tuong ghi dè thì phuong thuc bi ghi dè cua lop co so
së bi ân di, dê có thê goi phuong thuc bi ghi dè cua lop co so ta dùng tu khoá super dê truy
câp dên lop cha, cú pháp sau:
super.overridden MethodName();
Chú ý: Nêu môt phuong thuc cua lop co so bi bôi tai ( Overload ), thì nó không thê bi ghi
dè ( Override ) o lop dân xuât.
VI. Thành phân protected
Trong môt vài bài truoc ta dã làm quen voi các thành phân private, public, sau khi
dã hoc vê kê thua thì tu khoá protected cuôi cùng dã có ý nghia.
Tu khoá protected báo cho java biêt dây là thành phân riêng tu dôi voi bên ngoài nhung lai
sán sàng voi các con cháu
VII. Tù khoá final
Tu khoá final trong java có nhiêu nghia khác nhau, nghia cua nó tuy thuôc vào ngu
canh cu thê, nhung nói chung nó muôn nói “cái này không thê thay dôi duoc”.
1. Thuôc tính final
Trong java cách duy nhât dê tao ra môt háng là khai báo thuôc tính là final
Ví du:
public class A
{ // dinh nghïa hãng tên MAX_VALUE giá tri 100
static final int MAX_VALUE = 100;
public static void main ( String arg[] )
Trang 57
{ A thu = new A ();
System.out.println("MAX_VALUE= " +thu.MAX_VALUE);
}
}
Chú ý:
1) Khi dã khai báo môt thuôc tính là final thì thuôc tính này la háng, do vây ta không thê
thay dôi giá tri cua nó
2) Khi khai báo môt thuôc tính là final thì ta phai cung câp giá tri ban dâu cho nó
3) Nêu môt thuôc tính vua là final vua là static thì nó chi có môt vùng nho chung duy
nhât cho ca lop
2. Dôi sô final
Java cho phép ta tao ra các dôi final báng viêc khai báo chúng nhu vây bên trong
danh sách dôi, nghia là bên trong thân cua phuong pháp này, bât cu cô gáng nào dê thay
dôi giá tri cua dôi dêu gây ra lôi lúc dich
Ví du sau bi báo lôi lúc dich vì nó cô gáng thay dôi giá tri cua dôi final
public class A
{ static public void thu ( final int i )
{ i=i+1;//không cho phép thay dôi giá tri cúa tham sô final
System.out.println ( i );;
}
public static void main ( String arg[] )
{ int i = 100;
thu ( i );
}
}
chuong trình này së bi báo lôi:
"A.java": variable i might already have been assigned to at line 5, column 9
3. Phuong thúc final
Môt phuong thuc bình thuong có thê bi ghi dè o lop dân xuât, dôi khi ta không
muôn phuong thuc cua ta bi ghi dè o lop dân xuât vì lý do gì dó, muc dích chu yêu cua
các phuong thuc final là tránh ghi dè, tuy nhiên ta thây ráng các phuong thuc private
së tu dông là final vì chúng không thê thây duoc trong lop dân xuât lên chúng không
thê bi ghi dè, nên cho dù ban có cho môt phuong thuc private là final thì ban cung cha
thây môt hiêu ung nào
4. Lóp final
Nêu ban không muôn nguoi khác kê thua tu lop cua ban, thì ban hãy dùng tu khoá
final dê ngán can bât cu ai muôn kê thua tu lop này.
Chú ý: Do môt lop là final (tuc không thê kê thua )do vây ta không thê nào ghi dè các
phuong thuc cua lop này, do vây dung cô gáng cho môt phuong thuc cua lop final là
final
Ví du vê tính kê thùa
1. Xây dung lóp co so
package JavaContent;
import java.util.*;
class HocSinh {
//Khai bao du lieu thanh phan
protected
Trang 58
String hoTen;
String diaChi;
int namSinh;
protected double dToan;
double dLy;
double dHoa;
//Khai bao Contructor & Detructor
public HocSinh(String name,String Address,int birthday,double d1,double d2,double
d3)
{hoTen=name;diaChi=Address;namSinh=birthday;dToan=d1;dLy=d2;dHoa=d3; }
//Khai bao cac phuong thuc cua lop Man
public int tinhTuoi()
{Calendar now=Calendar.getInstance();
return (now.get(Calendar.YEAR)-namSinh); }
public double tongDiem()
{return (dToan+dLy+dHoa);}
public void hienThi()
{System.out.println("Ho va ten nhan su="+hoTen);
System.out.println("Dia chi ="+diaChi);
System.out.println("Tuoi="+tinhTuoi());
System.out.println("Diem Toan="+dToan);
System.out.println("Diem Ly="+dLy);
System.out.println("Diem Hoa="+dHoa);
System.out.println("Tong diem cac mon="+tongDiem());
}
public static void main(String args[])
{HocSinh ng1=new HocSinh("Nguyen Tam Hung","Quang Ninh",1977,6.4,9.0,6.7);
ng1.hienThi();
}
}
2. Xây dung lóp dân xuât
package JavaContent;
import java.io.*;
import java.lang.*;
public class HocSinhCD extends HocSinh
{//-------------------Khai bao du lieu thanh phan cho lop CanBo
protected double dTin;
static private BufferedReader br=new BufferedReader(new
InputStreamReader(System.in));
//-----------------Khai bao Contructor,Detructor;
public HocSinhCD(String name, String Address, int birthday, double d1,double d2,
double d3,double d4)
{ super(name, Address, birthday, d1, d2, d3);dTin=d4;}
//----------------Xay dung cac phuong thuc
public double tongDiem()
{return (dToan+dLy+dHoa+dTin);}
//--------------------------------------------------
public double diemTBUT()
{return (dToan*2+dLy+dHoa+dTin*2)/6;}
//--------------------------------------------------
public void hienThi1()
{System.out.println("CAC THONG SO VE CAN BO");
Trang 59
hienThi();
System.out.println("Diem mon Tin=" +dTin);
System.out.println("Diem TBC co uu tien=" +diemTBUT());
}
//--------------------------------------------------
public static void main(String args[])
{String ht=" ",dc=" ";
int ns=0;
double d1=0,d2=0,d3=0,d4=0;
System.out.print("Nhap vao ho ten:");ht=readString();
System.out.print("Nhap vao dia chi:");dc=readString();
System.out.print("Nhap vao nam sinh:");ns=readInt();
System.out.print("Nhap vao diem Toan:");d1=readDouble();
System.out.print("Nhap vao diem Ly:");d2=readDouble();
System.out.print("Nhap vao diem Hoa:");d3=readDouble();
System.out.print("Nhap vao diem in:");d4=readDouble();
HocSinhCD hs1=new HocSinhCD(ht,dc,ns,d1,d2,d3,d4);
// HocSinhCD hs1=new HocSinhCD("Nguyen Van Thanh","Ha
Tay",1980,7.0,7.0,7.0,7.0);
hs1.hienThi1();
HocSinhCD TK1[]=new HocSinhCD[100];//Khai bao mot mang hoc sinh trong 1 lop
TK1[0]=hs1;
TK1[0].hienThi();
//Goi phuong thuc Hie Thi cua lop co so hs1.hienThi();
//Doi hpuong thuc readDoube
}
//----------------Xay dung cac phuong thuc nhap du lieu
public static int readInt()
{int d=0;
try{
String str=br.readLine();
d=Integer.parseInt(str);
}catch(IOException ex){System.out.println("Loi IO "+ex.toString());}
return d;
}
//--------------------------------------------------
public static long readLong()
{ long d=0;
try{
String str=br.readLine();
d=Long.parseLong(str);
}catch(IOException ex){System.out.println("Loi IO "+ex.toString());}
return d;
}
//--------------------------------------------------
public static float readFloat()
{ float d=0;
try{
String str=br.readLine();
d=Float.parseFloat(str);
}catch(IOException ex){System.out.println("Loi IO "+ex.toString());}
Trang 60
return d;
}
//--------------------------------------------------
public static double readDouble()
{ double d=0;
try{
String str=br.readLine();
d=Double.parseDouble(str);
}catch(IOException ex){System.out.println("Loi IO "+ex.toString());}
return d;
}
//-------------------------------------------------------
public static String readString()
{ String str=" ";
try{
str=br.readLine();
}catch(IOException ex){System.out.println("Loi IO "+ex.toString());}
return str;
}
}
Trang 61
BÀI 6. LÓP CO SÒ TRÙU TUONG
Môt lop co so truu tuong là môt lop chi duoc dùng làm co so cho các lop khác, ta
không thê tao ra thê hiên cua lop này, boi vì nó duoc dùng dê dinh nghia môt giao diên
chung cho các lop khác.
Phuong thúc trùu tuong
Môt lop truu tuong có thê chua môt vài phuong thuc truu tuong, do lop truu tuong
chi làm lop co so cho các lop khác, do vây các phuong thuc truu tuong cung không duoc
cài dát cu thê, chúng chi gôm có khai báo, viêc cài dát cu thê së dành cho lop con
Chú ý:
1. Nêu trong lop có phuong thuc truu tuong thì lop dó phai duoc khai báo là truu tuong
2. Nêu môt lop kê thua tu lop truu tuong thì: hoác chúng phai ghi dè tât ca các phuong
thuc ao cua lop cha, hoác lop dó phai là lop truu tuong
3. Không thê tao ra dôi tuong cua lop truu tuong
Trang 62
BÀI 7. ÐA HÌNH THÁI
Da hình thái trong lâp trình huong dôi tuong dê câp dên kha náng quyêt dinh trong
lúc thi hành (runtime) mã nào së duoc chay, khi có nhiêu phuong thuc trùng tên nhau
nhung o các lop có câp bâc khác nhau.
Chú ý: Kha náng da hình thái trong lâp trình huong dôi tuong còn duoc goi voi nhiêu cái
tên khác nhau nhu: tuong ung bôi, kêt ghép dông,..
Da hình thái cho phép các vân dê khác nhau, các dôi tuong khác nhau, các phuong thuc
khác nhau, các cách giai quyêt khác nhau theo cùng môt luoc dô chung.
Các buoc dê tao da hình thái:
1) Xây dung lop co so (thuong là lop co so truu tuong, hoác là môt giao diên), lop
này së duoc các lop con mo rông( dôi voi lop thuong, hoác lop truu tuong), hoác triên
khai chi tiêt ( dôi voi giao diên ).
2) Xây dung các lop dân xuât tu lop co so vua tao. trong lop dân xuât này ta së ghi dè
các phuong thuc cua lop co so( dôi voi lop co so thuong), hoác triên khai chi tiêt nó (
dôi voi lop co so truu tuong hoác giao diên).
3) Thuc hiên viêc tao khuôn xuông, thông qua lop co so, dê thuc hiên hành vi da hình
thái
Khái niêm vê tao khuôn lên, tao khuôn xuông
Ø Hiên tuong môt dôi tuong cua lop cha tham tro dên môt dôi tuong cua lop con thì duoc
goi là tao khuôn xuông, viêc tao khuôn xuông luôn duoc java châp thuân, do vây khi
tao khuôn xuông ta không cân phai ép kiêu tuong minh.
Ø Hiên tuong môt dôi tuong cua lop con tham tro toi môt dôi tuong cua lop cha thì duoc
goi là tao khuôn lên, viêc tao khuôn lên là an toàn, vì môt dôi tuong cua lop con cung
có dây du các thành phân cua lop cha, tuy nhiên viêc tao khuôn lên së bi báo lôi nêu
nhu ta không ép kiêu môt cách tuong minh.
Trang 63
BÀI 8. GIAO DIEN, LÓP TRONG, GÓI
Giao diên là môt khái niêm duoc java dua ra voi 2 muc dích chính:
Ø Dê tao ra môt lop co so thuân ao, môt lop không có bât cu hàm nào duoc cài dát
Ø Thuc hiên hành vi tuong tu nhu kê thua bôi, boi trong java không có khái niêm kê thua
bôi, nhu cua C++
Lop trong cho ta môt cách thuc tinh vi dê che giâu mã môt cách tôi da, trong java ta có thê
dinh nghia môt lop bên trong môt lop khác, thâm chí ta còn có thê tao lop trong, bên trong
thân cua môt phuong thuc, diêu này cho phép ta có thê tao ra các lop cuc bô, chi duoc su
dung nôi bô bên trong môt don vi dó. Ta không thê tao ra môt lop trong, trong ngôn ngu
C++
I. Giao diên
Tu khoá interface dã dua khái niêm abstract di xa thêm môt buoc nua. Ta có thê
nghi nó nhu là môt lop abstract “thuân tuý”, nó cho phép ta tao ra môt lop thuân ao, lop
này chi gôm tâp các giao diên cho các lop muôn dân xuât tu nó, môt interface cung có thê
có các truong, tuy nhiên java tu dông làm các truong này thành static và final
Dê tao ra môt interface, ta dùng tu khoá interface thay vì tu khoá class. Môt
interface gôm có 2 phân: phân khai báo và phân thân, phân khai báo cho biêt môt sô thông
tin nhu: tên cua interface, nó có kê thua tu môt giao diên khác hay không. Phân thân chua
các khai báo háng, khai báo phuong thuc ( nhung không có cài dát). Giông nhu môt lop ta
cung có thê thêm bô tu public vào truoc dinh nghia cua interface. Sau dây là hình anh cua
môt interface.
Nhung do java tu dông làm các truong thành final nên ta không cân thêm bô tu
này, do vây ta có thê dinh nghia lai giao diên nhu sau:
Nhung do java tu dông làm các truong thành final nên ta không cân thêm bô tu này
public interface StockWatcher
{
final String
sunTicker = "SUNW";
final String oracleTicker = "ORCL";
final String ciscoTicker = "CSCO";
void valueChanged(String tickerSymbol, double newValue);
}
Trang 64
1. Phân khai báo cua giao diên
Tông quát phân khai báo cua môt giao diên có câu trúc tông quát nhu sau:
Public //giao diên này là công công
interface InterfaceName //tên cua giao diên
Extends SuperInterface //giao diên này là mo rông cua 1 giao diên
khác
{
InterfaceBody
}
//thân cua giao diên
Trong câu trúc trên có 2 phân bát buôc phai có dó là phân interface và InterfaceName, các
phan khác là tuv chon.
2. Phân thân
Phân thân khai báo các các háng, các phuong thuc rông ( không có cài dát ), các phuong
thuc này phai kêt thúc voi dâu châm phây ‘;’, boi vì chúng không có phân cài dát
Chú ý:
1. Tât ca các thành phân cua môt giao diên tu dông là public do vây ta không cân phai
cho bô tu này vào.
2. Java yêu câu tât ca các thành phân cua giao diên phai là public, nêu ta thêm các bô tu
khác nhu private, protected truoc các khai báo thì ta së nhân duoc môt lôi lúc dich
3. Tât ca các truong tu dông là final và static, nên ta không cân phai cho bô tu này vào.
3. Triên khai giao diên
Boi môt giao diên chi gôm các mô ta chúng không có phân cài dát, các giao diên duoc
dinh nghia dê cho các lop dân xuât triên khai, do vây các lop dân xuât tu lop này phai triên
khai dây du tât ca các khai báo bên trong giao diên, dê triên khai môt giao diên ban bao
gôm tu khoá implements vào phân khai báo lop, lop cua ban có thê triên khai môt hoác
nhiêu giao diên ( hình thuc này tuong tu nhu kê thua bôi cua C++)
Ví du 1
public class StockApplet extends Applet implements StockWatcher {
.. .
public void valueChanged(String tickerSymbol, double newValue) {
if (tickerSymbol.equals(sunTicker)) {
.. .
} else if (tickerSymbol.equals(oracleTicker)) {
.. .
} else if (tickerSymbol.equals(ciscoTicker)) {
.. .
}
}
}
Ví du 2
public interface MyInterface{
public void add(int x, int y);
public void volume(int x, int y, int z);
Trang 65
} //Hoãc
interface Interface_Const{
public static final double price = 100.0;
public static final int counter = 5;
}
+ Su dung Interface trên
package JavaContent;
public class Use_MyInterface implements MyInterface,Interface_Const
{ public void add(int x, int y)
{System.out.println("Tong cua 2 so "+x+" + " + y+" la:"+ (x+y));}
public void volume(int x, int y, int z)
{ System.out.println("Tich cua 3 so "+x+" * " + y+"*"+z+" la:"+ (x*y*z));
}
public static void main(String args[])
{Use_MyInterface uu=new Use_MyInterface();
uu.add(4,8);
uu.volume(20,15,9);
System.out.println("Gia tri hang so price="+price);
System.out.println("Gia tri hang so counter="+counter);
}
}
Chú ý:
+ Nêu môt lop triên khai nhiêu giao diên thì các giao diên này duoc liêt kê cách nhau boi
dâu phây ‘,’
+ Lop triên khai giao diên phai thuc thi tât ca các phuong thuc duoc khai báo trong giao
diên, nêu nhu lop dó không triên khai, hoác triên khai không hêt thì nó phai duoc khai báo
là abstract
+ Do giao diên cung là môt lop truu tuong do vây ta không thê tao thê hiên cua giao diên
+ Môt lop có thê triên khai nhiêu giao diên, do vây ta có loi dung diêu này dê thuc hiên
hành vi kê thua bôi, vôn không duoc java hô tro
+ Môt giao diên có thê mo rông môt giao diên khác, báng hình thuc kê thua
II. Lóp trong
Có thê dát môt dinh nghia lop này vào bên trong môt lop khác. diêu này duoc goi là
lop trong. Lop trong là môt tính náng có giá tri vì nó cho phép ban gôp nhóm các lop vê
mát logic thuôc vê nhau và dê kiêm soát tính thây duoc cua các lop này bên trong lop
khác. Tuy nhiên ban phai hiêu ráng lop trong không phai là là hop thành
Ví du:
public class Stack {
private Vector items;
.. .//code for Stack's methods and constructors not shown...
public Enumeration enumerator() {
return new StackEnum();
}
class StackEnum implements Enumeration
{ int currentItem = items.size() - 1;
public boolean hasMoreElements() {
Trang 66
return (currentItem >= 0);
}
public Object nextElement() {
if (!hasMoreElements())
throw new NoSuchElementException();
else
return items.elementAt(currentItem--);
}
}
}
Lop trong rât huu hiêu khi ban ban muôn tao ra các lop diêu hop ( duoc bàn kÿ khi nói vê
thiêt kê giao diên nguoi dùng )
Trang 67
Bài 9. MÀNG, XÂU KÝ TU, TAP HOP
I. Mang
1. Mang 1 chiêu
a) Khai báo
Cú pháp khai báo:
- KDL tên_mang[];//Khai báo môt con tro mang
- KDL []tên_mang;//nhu trên
- KDL tên_mang[] = new KDL[spt];//Tao ra môt mang có spt phân tu
Trong cú pháp trên thì:
Ø KDL là môt kiêu du liêu bât ky nhu: kiêu nguyên thuy, kiêu dôi tuong… nó xác dinh
kiêu du liêu cua tung phân tu cua mang.
Ø Spt là sô phân tu cua mang.
Chú ý:
Ø Mang trong Java là môt dôi tuong
Ø Cung nhu các dôi tuong khác, mang phai duoc tao ra báng toán tu new nhu sau:
Tên_mang=new KDL[spt];
Ø Khi mang duoc tao ra thì môi phân tu cua mang së nhân môt giá tri mác dinh, quy tác
khoi tao giá tri cho các phân tu cua mang cung chính là quy tác khoi dâu giá tri cho các
thuôc tính cua dôi tuong, tuc là môi phân tu cua mang së nhân giá tri:
+ 0 nêu KDL là kiêu sô
+ ‘\0’ nêu KDL là kí tu
+ false nêu KDL là boolean
+ null nêu KDL là môt lop nào dó.
Ví du 1: Khai báo môt mang sô nguyên gôm 100 phân tu
Cách 1:
int mangInt[]; //Khai báo môt con tro dên mang các sô nguyên
mangInt=new int[100]; //Tao ra mang
Cách 2:
int mangInt[]=new int[100];
Ví du 2: Gia su ta có lop SinhVien dã duoc dinh nghia, hãy khai báo môt mang gôm 100
dôi tuong cua lop SinhVien
SinhVien arraySinhVien[]=new SinhVien[100];
Chú ý: Lúc này môi phân tu cua mang arraySinhVien là môt con tro cua lop SinhVien và
hiên gio môi phân tu cua mang dang tro dên giá tri null. Dê khoi tao tung phân tu cua
mang ta phai làm nhu sau:
arraySinhVien[0]=new SinhVien(“sv01”, “Nguyên Ván An”, “Hung Yên”);
arraySinhVien[1]=new SinhVien(“sv02”, “Nguyên Thi Bình”, “Bác Giang”);
….
arraySinhVien[99]=new SinhVien(“sv100”, “Dào Thi Mên”, “Hà Nam”);
Ngoài cách khai báo trên Java còn cho phép ta kêt hop ca khai báo và khoi gán các
phân tu cua mang theo cách sau:
int[] mangInt = {1, 3, 5, 7, 9};
Tao ra môt mang gôm 5 phân tu, các phân tu cua mang lân luot duoc gán các giá tri là: 1,
3, 5, 7, 9
Trang 68
SinhVien[] mangSinhVien = {
new SinhVien(“sv01”, “Nguyên Ván A”, “HY”),
new SinhVien(“sv02”, “Nguyên Thi B”, “HN”),
new SinhVien(“sv03”, “Dô Thi Q”, “BG”),
null
};
Khai báo môt mang gôm 4 phân tu, giá tri cua các phân tu lân luot duoc khoi gán nhu sau:
mangSinhVien [0]=new SinhVien(“sv01”, “Nguyên Ván A”, “HY”)
mangSinhVien [1]=new SinhVien(“sv02”, “Nguyên Thi B”, “HN”)
mangSinhVien [2]=new SinhVien(“sv03”, “Dô Thi Q”, “BG”)
mangSinhVien [3]=null
b) Truy xât dên các phân tu cua mang môt chiêu
Dê truy xuât dên phân tu thu ind cua mang ta su dung cú pháp nhu sau:
Tên_mang[ind-1]
Chú ý: Phân tu dâu tiên cua mang có chi sô là 0.
Ví du:
int a[]=new int [3]; //Khai báo và tao ra mang gôm 3 phân tu
Lúc này các phân tu cua mang lân luot duoc truy xuât nhu sau:
- Phân tu dâu tiên cua mang là a[0]
- Phân tu thu 2 cua mang là a[1]
- Phân tu thu 3 dông thoi là phân tu cuôi cùng cua mang là a[2]
c) Lây vê sô phân tu hiên tai cua mang
Mang trong Java là môt dôi tuong, do vây nó cung có các thuôc tính và các phuong
thuc nhu các dôi tuong khác. Dê lây vê sô phân tu cua mang ta su dung thuôc tính length
nhu sau:
Tên_mang.length
Ví du 1: Nhâp vào môt mang và in ra màn hình
import com.theht.Keyboard;
class ArrayDemo{
public static void main(String[] args) {
//Nhâp sô phân tú cúa máng
System.out.print("Nhâp sô phân tú cúa máng:");
int n=Keyboard.readInt();
//Khai báo máng vói sô phân tú bãng n
int a[]=new int[n];
//Nhâp dü liêu cho máng
for(int i=0;i<a.length;i++){
System.out.print("a[" + i + "]=");
a[i]=Keyboard.readInt();
}
//In máng ra màn hình
System.out.println("Máng vùa nhâp là");
for (int i = 0; i < a.length; i++)
System.out.print(a[i] + " ");
}
}
Trang 69
Ví du 2: Nhâp vào môt mang sô thuc sau dó kiêm tra xem mang có phai là môt dãy táng
hay không?
import com.theht.Keyboard;
class ArrayDemo2{
public static void main(String[] args) {
//Nhâp sô phân tú cúa máng
System.out.print("Nhâp sô phân tú cúa máng:");
int n=Keyboard.readInt();
//Khai báo máng vói sô phân tú bãng n
int a[]=new int[n];
//Nhâp dü liêu cho máng
for(int i=0;i<a.length;i++){
System.out.print("a[" + i + "]=");
a[i]=Keyboard.readInt();
}
//Kiêm tra dãy tãng
boolean kt=true;
for (int i = 0; i < a.length-1; i++)
if(a[i+1]-a[i]<0){
kt=false;//thay dôi trang thái cò
break;//Thoát khói vòng lãp
}
if(kt)
System.out.println("Dãy tãng dân");
else
System.out.println("Dãy không phái tãng dân");
}
}
2. Mang nhiêu chiêu
a) Khai báo
Khai báo mang N chiêu trong Java duoc tiên hành nhu sau:
hoác
Trong dó:
Ø KDL là môt kiêu du liêu bât ky: nguyên thuy hoác lop
Ø sp1, sp2, …, sptN lân luot là sô phân tu trên chiêu thu 1, 2, .., N
Ví du:
- Khai báo môt con tro cua mang 2 chiêu
int[][] a ; hoác int a[][];
Ø Khai báo và tao ra mang 2 chiêu:
int[][] a = new int[2][3]; // Ma trân gôm 2 hàng, 3 côt
KDL [][]…[] tên_mang;
N lân
KDL t ên_mng [ ] [ ] [ ] ;
N lân
KDL tên_mang [][]…[] =new KDL[spt1][spt2]…[sptN];
N lân
Trang 70
- Khai báo và khoi gán giá tri cho các phân tu cua mang 2 chiêu:
int a[][]={
{1, 2, 5}. //Các phân tu trên hàng thu nhât
{2, 4, 7, 9}. //Các phân tu trên hàng thu hai
{1, 7}. //Các phân tu trên hàng thu ba
}
Khai báo trên së tao ra môt mang hai chiêu gôm: 3 hàng, nhung trên môi hàng lai
có sô phân tu khác nhau, cu thê là: trên hàng thu nhât có 3 phân tu, hang 2 gôm 4 phân tu
và hàng thu 3 gôm 2 phân tu.
Chú ý: Voi khai báo trên nêu ta liêt kê các phân tu cua mang theo trình tu tu trái qua phai
và tu trên xuông duoi thì các phân tu lân luot là:
a[0][0], a[0][1], a[0][2], a[1][0], a[1][1], a[1][2], a[1][3], a[2][0], a[2][1]
b) Truy xuât dên phân tu mang nhiêu chiêu
tên_mang[ind1][ind2]
Ví du 1: Nhâp vào môt ma trân và in ra màn hình
import com.theht.Keyboard;
class MaTram {
public static void main(String[] args) {
//Nhâp sô hàng và sô côt
System.out.print("Nhâp sô hàng:");
int sh = Keyboard.readInt();
System.out.print("Nhâp sô côt:");
int sc = Keyboard.readInt();
//Khai báo máng hai chiêu gôm sh hàng và sc côt
float a[][] = new float[sh][sc];
//Nhâp dü liêu cho máng hai chiêu
for (int i = 0; i < a.length; i++)
for (int j = 0; j < a[i].length; j++) {
System.out.print("a[" + i + "," + j + "]=");
//Nhâp liêu cho phân tú hàng i, côt j
a[i][j] = Keyboard.readFloat();
}
//In máng hai chiêu ra màn hình
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a[i].length; j++)
System.out.print(a[i][j] + " ");
System.out.println();
}
}
}
Ví du 2: Nhâp vào ma trân vuông sau dó tính tông các phân tu trên duong chéo chính.
II. Xâu ký tu
Viêc xu lý các xâu ký tu trong Java duoc hô tro boi hai lop String và StringBuffer.
Lop String dùng cho nhùng xâu ký tu bat biên, nghia là nhung xâu chi doc và sau khi
duoc khoi tao giá tri thì nôi dung bên trong xâu không thê thay dôi duoc. Lop
StringBuffer duoc su dung dôi voi nhung xâu ký tu dông, tuc là có thê thay dôi duoc nôi
dung bên trong cua xâu.
Trang 71
1. Lóp String
Chuôi là môt dãy các ký tu. Lop String cung câp các phuong thuc dê thao tác voi
các chuôi. Nó cung câp các phuong thuc khoi tao (constructor) khác nhau:
String str1 = new String( );
//str1 chua môt chuôi rông.
String str2 = new String(“Hello World”);
//str2 chua “Hello World”
char ch[] = {‘A’,’B’,’C’,’D’,’E’};
String str3 = new String(ch);
//str3 chua “ABCDE”
String str4 = new String(ch,0,2);
//str4 chua “AB” vì 0- tính tu ký tu bát dâu, 2- là sô luong ký tu kê tu ký tu bát dâu.
Toán tu “+” duoc su dung dê công chuôi khác vào chuôi dang tôn tai. Toán tu “+”
này duoc goi nhu là “nôi chuôi”. O dây, nôi chuôi duoc thuc hiên thông qua lop
“StringBuffer”. Chúng ta së thao luân vê lop này trong phân sau. Phuong thuc “concat( )”
cua lop String cung có thê thuc hiên viêc nôi chuôi. Không giông nhu toán tu “+”, phuong
thuc này không thuong xuyên nôi hai chuôi tai vi trí cuôi cùng cua chuôi dâu tiên. Thay
vào dó, phuong thuc này tra vê môt chuôi moi, chuôi moi dó së chua giá tri cua ca hai.
Diêu này có thê duoc gán cho chuôi dang tôn tai. Ví du:
String strFirst, strSecond, strFinal;
StrFirst = “Charlie”;
StrSecond = “Chaplin”;
//….báng cách su dung phuong thuc concat( ) dê gán voi môt chuôi dang tôn tai.
StrFinal = strFirst.concat(strSecond);
Phuong thuc concat( ) chi làm viêc voi hai chuôi tai môt thoi diêm.
Các phuong thúc cua lóp String
Trong phân này, chúng ta së xem xét các phuong thuc cua lop String.
- char charAt(int index ) Phuong thuc này tra vê mot ký tu tai vi trí index trong chuoi.
Ví du:
String name = new String(“Java Language”);
char ch = name.charAt(5);
Biên “ch” chua giá tri “L”, tu dó vi trí các sô bát dâu tu 0.
- boolean startsWith(String s ) Phuong thuc này tra vê giá tri kiêu logic (Boolean), phu
thuoc vào chuoi có bát dau voi mot chuoi con cu thê nào dó không.
Ví du:
String strname = “Java Language”;
boolean flag = strname.startsWith(“Java”);
Trang 72
Biên “flag” chua giá tri true.
- boolean endsWith(String s ) Phuong thuc này tra vê mot giá tri kiêu logic (boolean),
phu thuoc vào chuoi kêt thúc báng mot chuoi con nào dó không.
Ví du:
String strname = “Java Language”;
boolean flag = strname.endsWith(“Java”);
Biên “flag” chua giá tri false.
- String copyValueOf( )
Phuong thuc này tra vê môt chuôi duoc rút ra tu môt mang ký tu duoc truyên nhu môt dôi
sô. Phuong thuc này cung lây hai tham sô nguyên. Tham sô dâu tiên chi dinh vi trí tu noi
các ký tu phai duoc rút ra, và tham sô thu hai chi dinh sô ký tu duoc rút ra tu mang. Ví du:
char name[] = {‘L’,’a’,’n’,’g’,’u’,’a’,’g’,’e’};
String subname = String .copyValueOf(name,5,2);
Bây gio biên “subname” chua chuôi “ag”.
- char [] toCharArray( )
Phuong thuc này chuyên chuôi thành môt mang ký tu. Ví du:
String text = new String(“Hello World”);
char textArray[] = text.toCharArray( );
- int indexOf(String sunString )
Phuong thuc này tra vê thu tu cua môt ký tu nào dó, hoác môt chuôi trong pham vi môt
chuôi. Các câu lênh sau biêu diên các cách khác nhau cua viêc su dung hàm.
String day = new String(“Sunday”);
int index1 = day.indexOf(‘n’);
//chua 2
int index2 = day.indexOf(‘z’,2);
//chua –1 nêu “z” không tìm thây tai vi trí 2.
int index3 = day.indexOf(“Sun”);
//chua muc 0
- String toUpperCase( )
Phuong thuc này tra vê chu hoa cua chuôi.
String lower = new String(“good morning”);
System.out.println(“Uppercase: ”+lower.toUpperCase( ));
- String toLowerCase( )
Phuong thuc này tra vê chu thuong cua chuôi.
String upper = new String(“JAVA”);
System.out.println(“Lowercase: “+upper.toLowerCase( ));
- String trim()
Phuong thuc này cát bo khoang tráng hai dâu chuôi. Hãy thu doan mã sau dê thây
su khác nhau truoc và sau khi cát bo khoang tráng.
Ten lop
Edited by Foxit Reader
Copyright(C) by Foxit Software Company,2005-2008
For Evaluation Only.
Trang 73
String space = new String(“ Spaces “);
System.out.println(space);
System.out.println(space.trim()); //Sau khi cát bo khoang tráng
- boolean equals(String s)
Phuong thuc này so sánh nôi dung cua hai dôi tuong chuôi.
String name1 = “Java”, name2 = “JAVA”;
boolean flag = name1.equals(name2);
Biên “flag” chua giá tri false.
- Các phuong thúc valueOf duoc nap chông dê cho phép chuyên môt giá tri thành xâu
static String valueOf(Object obj)//Chuyên môt dôi tuong thành xâu, báng cách goi dên
phuong thuc toString cua dôi tuong obj
static String valueOf(char[] characters)//Chuyên mang các ký tu thành xâu.
static String valueOf(boolean b)//Chuyên môt giá tri logic thành xâu, xâu nhân duoc là
“true” hoác “false” tuong ung voi giá tri true hoác false cua b
static String valueOf(char c)//Chuyên kí tu thành xâu
static String valueOf(int i)//chuyên môt sô nguyên thành xâu
static String valueOf(long l)//Chuyên môt giá tri long thành xâu
static String valueOf(float f)//chuyên môt giá tri float thành xâu
static String valueOf(double d)//chuyên môt giá tri double thành xâu
2. Lóp StringBuffer
Lop StringBuffer cung câp các phuong thuc khác nhau dê thao tác môt dôi tuong
dang chuôi. Các dôi tuong cua lop này rât mêm deo, dó là các ký tu và các chuôi có thê
duoc chèn vào giua dôi tuong StringBuffer, hoác nôi thêm du liêu vào tai vi trí cuôi. Lop
này cung câp nhiêu phuong thuc khoi tao. Chuong trình sau minh hoa cách su dung các
phuong thuc khoi tao khác nhau dê tao ra các dôi tuong cua lop này.
class StringBufferCons{
public static void main(String args[]){
StringBuffer s1 = new StringBuffer();
StringBuffer s2 = new StringBuffer(20);
StringBuffer s3 = new StringBuffer("StringBuffer¨);
System.out.println("s3 = "+ s3);
System.out.println(s2.length()); //chúa 0
System.out.println(s3.length()); //chúa 12
System.out.println(s1.capacity()); //chúa 16
System.out.println(s2.capacity()); //chúa 20
System.out.println(s3.capacity()); //chúa 28
}
}
“length()” và “capacity()” cua StringBuffer là hai phuong thuc hoàn toàn khác nhau.
Phuong thuc “length()” dê câp dên sô các ký tu mà dôi tuong thuc chua, trong khi
“capacity()” tra vê tông dung luong cua môt dôi tuong (mác dinh là 16) và sô ký tu
trong dôi tuong StringBuffer.
Dung luong cua StringBuffer có thê thay dôi voi phuong thuc “ensureCapacity()”. Dôi
sô int dã duoc truyên dên phuong thuc này, và dung luong moi duoc tính toán nhu sau:
NewCapacity = OldCapacity * 2 + 2
Edited by Foxit Reader
Copyright(C) by Foxit Software Company,2005-2008
For Evaluation Only.
Trang 74
Truoc khi dung luong cua StringBuffer duoc dát lai, diêu kiên sau së duoc kiêm tra:
- Nêu dung luong(NewCapacity) moi lon hon dôi sô duoc truyên cho phuong thuc
“ensureCapacity()”, thì dung luong moi (NewCapacity) duoc dát.
- Nêu dung luong moi nho hon dôi sô duoc truyên cho phuong thuc
“ensureCapacity()”, thì dung luong duoc dát báng giá tri tham sô truyên vào.
Chuong trình sau minh hoa dung luong duoc tính toán và duoc dát nhu thê nào.
class test{
public static void main(String args[]){
StringBuffer s1 = new StringBuffer(5);
System.out.println("Dung luong cúa bô nhó dêm = "+s1.capacity()); //chúa 5
s1.ensureCapacity(8);
System.out.println("Dung luong cúa bô nhó dêm = "+s1.capacity()); //chúa 12
s1.ensureCapacity(30);
System.out.println("Dung luong cúa bô nhó dêm = "+s1.capacity()); //chúa 30
}
}
Trong doan mã trên, dung luong ban dâu cua s1 là 5. Câu lênh
s1.ensureCapacity(8);
Thiêt lâp dung luong cua s1 dên 12 =(5*2+2) boi vì dung luong truyên vào là 8 nho hon
dung luong duoc tính toán là 12 .
s1.ensureCapacity(30);
Thiêt lâp dung luong cua “s1” dên 30 boi vì dung luong truyên vào là 30 thì lon hon dung
luong duoc tính toán (12*2+2).
Các phuong thúc lóp StringBuffer
Trong phân này, chúng ta së xem xét các phuong thuc cua lop StringBuffer voi môt
chuong trình.
- void append()
Phuong thuc này nôi thêm môt chuôi hoác môt mang ký tu vào cuôi cùng cua dôi
tuong StringBuffer. Ví du:
StringBuffer s1 = new StringBuffer(“Good”);
s1.append(“evening”);
Giá tri trong s1 bây gio là “goodevening”.
- void insert()
Phuong thuc này có hai tham sô. Tham sô dâu tiên là vi trí chèn. Tham sô thu hai
có thê là môt chuôi, môt ký tu (char), môt giá tri nguyên (int), hay môt giá tri sô thuc
(float) duoc chèn vào. Vi trí chèn së lon hon hay báng 0, và nho hon hay báng chiêu dài
cua dôi tuong StringBuffer. Bât ky dôi sô nào, tru ký tu hoác chuôi, duoc chuyên sang
chuôi và sau dó moi duoc chèn vào. Ví du:
StringBuffer str = new StringBuffer(“Java sion”);
str.insert(1,’b’);
Biên “str” chua chuôi “Jbava sion”.
- char charAt()
Phuong thuc này tra vê môt giá tri ký tu trong dôi tuong StringBuffer tai vi trí duoc chi
dinh.Ví du:
StringBuffer str = new StringBuffer(“James Gosling”);
char letter = str.charAt(6); //chúa “G”
Trang 75
- void setCharAt(int index, char value)
Phuong thuc này duoc su dung dê thay thê ký tu trong môt StringBuffer báng môt ký tu
khác tai môt vi trí duoc chi dinh.
StringBuffer name = new StringBuffer(“Jawa”);
name.setCharAt(2,’v’);
Biên “name” chua “Java”.
- void setLength()
Phuong thuc này thiêt lâp chiêu dài cua dôi tuong StringBuffer. Nêu chiêu dài duoc chi
dinh nho hon chiêu dài du liêu hiên tai cua nó, thì các ký tu thua së bi cát bot. Nêu chiêu
dài chi dinh nhiêu hon chiêu dài du liêu thì các ký tu null duoc thêm vào phân cuôi cua
StringBuffer
StringBuffer str = new StringBuffer(10);
str.setLength(str.length() +10);
- char [] getChars()
Phuong thuc này duoc su dung dê trích ra các ký tu tu dôi tuong StringBuffer, và sao chép
chúng vào môt mang. Phuong thuc getChars() có bôn tham sô sau:
Chi sô dâu: vi trí bát dâu, tu noi mà ký tu duoc lây ra.
Chi sô kêt thúc: vi trí kêt thúc
Mang: Mang dích, noi mà các ký tu duoc sao chép.
Vi trí bát dâu trong mang dích: Các ký tu duoc sao chép vào mang dích tu vi trí này.
Ví du:
StringBuffer str = new StringBuffer(“Leopard”);
char ch[] = new char[10];
str.getChars(3,6,ch,0);
Bây gio biên “ch” chua “par”
- void reverse()
Phuong thuc này dao nguoc nôi dung cua môt dôi tuong StringBuffer, và tra vê môt dôi
tuong StringBuffer khác. Ví du:
StringBuffer str = new StringBuffer(“devil”);
StringBuffer strrev = str.reverse();
Biên “strrev” chua “lived”.
III. Lóp StringTokenizer
Môt lop StringTokenizer có thê su dung dê tách môt chuôi thành các phân tu
(token) nho hon. Ví du, môi tu trong môt câu có thê coi nhu là môt token. Tuy nhiên, lop
StringTokenizer dã di xa hon viêc phân tách các tu trong câu. Dê tách ra các thành token
ta có thê tuy biên chi ra môt tâp dâu phân cách các token khi khoi tao dôi tuong
StringTokenizer. Nêu ta không chi ra tâp dâu phân cách thì mác dinh là dâu tráng (space,
tab, ...). Ta cung có thê su dung tâp các toán tu toán hoc (+, *, /, và -) trong khi phân tích
môt biêu thuc.
Bang sau tóm tát 3 phuong thuc tao dung cua lop StringTokenizer:
Phuong thuc xây dung Ý nghia
StringTokenizer(String) Tao ra môt dôi tuong StringTokenizer moi
Trang 76
dua trên chuôi duoc chi dinh.
StringTokenizer(String, Strìng) Tao ra môt dôi tuong StringTokenizer moi
dua trên (String, String) chuôi duoc chi dinh
và môt tâp các dâu phân cách.
StringTokenizer(String, String,
boolean)
Tao ra môt dôi tuong StringTokenizer dua
trên chuôi duoc chi dinh, môt tâp các dâu
phân cách, và môt co hiêu cho biêt nêu các
dâu phân cách së duoc tra vê nhu các token
hay không.
Các phuong thuc tao dung o trên duoc minh hoa trong các ví du sau:
StringTokenizer st1 = new StringTokenizer(“A Stream of words”);
StringTokenizer st2 = new StringTokenizer(“4*3/2-1+4”, “+-*/”, true);
StringTokenizer st3 = new StringTokenizer(“aaa,bbbb,ccc”, “,”);
Trong câu lênh dâu tiên, StringTokenizer cua “st1” së duoc xây dung báng cách su
dung các chuôi duoc cung câp và dâu phân cách mác dinh. Dâu phân cách mác dinh là
khoang tráng, tab, các ký tu xuông dòng. Các dâu phân cách này thì chi su dung khi phân
tách ván ban, nhu voi “st1”.
Câu lênh thu hai trong ví du trên xây dung môt dôi tuong StringTokenizer cho các
biêu thuc toán hoc báng cách su dung các ký hiêu *, +, /, và -.
Câu lênh thu 3, StringTokenizer cua “st3” su dung dâu phây nhu môt dâu phân cách.
Lop StringTokenizer cài dát giao diên Enumeration. Vì thê, nó bao gôm các
phuong thuc hasMoreElements() và nextElement(). Các phuong thuc có thê su dung cua
lop StringTokenizer duoc tóm tát trong bang sau:
Phuong thúc Muc dích
countTokens() Tra vê sô các token còn lai.
hasMoreElements() Tra vê True nêu còn có token dang duoc dánh dâu
trong chuôi. Nó thì giông hêt nhu hasMoreTokens.
hasMoreTokens() Tra vê True nêu còn có token dang duoc dánh dâu
trong chuôi. Nó giông hêt nhu hasMoreElements.
nextElement() Tra vê token kê tiêp trong chuôi. Nó thì giông nhu
nextToken.
nextToken() Tra vê Token kê tiêp trong chuôi. Nó thì giông nhu
nextElement.
nextToken(String) Thay dôi bô dâu phân cách báng chuôi duoc chi
dinh, và sau dó tra vê token kê tiêp trong chuôi.
Hãy xem xét chuong trình dã cho o bên duoi. Trong ví du này, hai dôi tuong
StringTokenizer dã duoc tao ra. Dâu tiên, “st1” duoc su dung dê phân tách môt biêu thuc
toán hoc. Thu hai, “st2” phân tách môt dòng cua các truong duoc phân cách boi dâu phây.
Ca hai tokenizer, phuong thuc hasMoreTokens() và nextToken() duoc su dung dê duyêt
qua tâp các token, và hiên thi các token.
import java.util.*;
public class StringTokenizerImplementer{
public static void main(String args[]){
// dãt môt biêu thúc toán hoc và tao môt tokenizer cho chuôi dó.
Trang 77
String mathExpr = "4*3+2/4¨;
StringTokenizer st1 = new StringTokenizer(mathExpr,¨*+/-", true);
//trong khi vân còn các token, hiên thi
System.out.println("Tokens of mathExpr: ");
while(st1.hasMoreTokens())
System.out.println(st1.nextToken());
//tao môt chuôi cúa các truòng duoc phân cách bói dâu phây và tao //môt
tokenizer cho chuôi.
String commas = "field1,field2,field3,and field4¨;
StringTokenizer st2 = new StringTokenizer(commas,¨,¨,false);
//trong khi vân còn token, hiên thi.
System.out.println("Comma-delimited tokens : ");
while (st2.hasMoreTokens())
System.out.println(st2.nextToken());
}
}
Kêt qua chay chuong trình duoc mô ta nhu hình duoi.
IV. Môt sô lóp co ban cua Java
Các lop co ban, hay su dung cua Java nhu: Object, các lop Wrapper (lop bao cua
các kiêu du liêu nguyên thuy), Math, String và lop StringBuffer. Nhung lop này duoc xây
dung trong gói java.lang (gói mác dinh cua Java, khi cân su dung các lop trong gói này ta
không cân phai import nó). Moi lop trong Java dêu là lop con cua lop Object .
Obj ect
Boolea Charact e Voi Numbe Mat h St rin St ringBuff
I nt eger Short Byt e Long Float Doubl e
. . .
Trang 78
Câu trúc phân câp môt sô lop trong gói java.lang
1. Lóp Object
Tât ca các lop duoc xây dung trong các chuong trình Java dêu hoác là truc tiêp
hoác gián tiêp duoc mo rông tu lop Object. Dây là lop co so nhât, dinh nghia hâu nhu tât
ca nhung phuong thuc phân co ban dê các lop con cháu cua nó su dung truc tiêp hoác viêt
dè.
Object cung cap các phuong thuc sau:
int hashCode()
Khi các dôi tuong duoc luu vào các bang bám (hash table), hàm này có thê su dung dê xác
dinh duy nhât giá tri cho môi dôi tuong. Diêu này dam bao tính nhât quán cua hê
thông khi thuc hiên chuong trình.
Class getClass()
Tra lai tên lop cua dôi tuong hiên thoi.
boolean equals(Object obj)
Cho lai kêt qua true khi dôi tuong hiên thoi và obj là cùng môt dôi tuong. Hàm này
thuong duoc viêt dè o các lop con cho phù hop voi ngu canh so sánh báng nhau trong
các lop mo rông dó.
protected Object clone() throws CloneNotSupportedException
Dôi tuong moi duoc tao ra có cùng các trang thái nhu dôi tuong hiên thoi khi su dung
clone(), nghia là tao ra ban copy moi cua dôi tuong hiên thoi.
String toString()
Nêu các lop con không viêt dè hàm này thì nó së tra lai dang biêu diên ván ban (textual)
cua dôi tuong. Hàm println() o lop PrintStream së chuyên các dôi sô cua nó sang dang ván
ban khi su dung hàm toString().
protected void finalize() throws Throwable
Hàm này duoc goi ngay truoc khi dôi tuong bi don vào “thùng rác”, nghia là truoc khi dôi
tuong dó bi huy bo.
2. Các lóp bao kiêu nguyên thuy (Wrapper class)
Các giá tri nguyên thuy không phai là dôi tuong trong Java. Dê có thê thao tác duoc
trên các giá tri nguyên thuy (giá tri sô, kí tu và logic) thì gói java.lang cung cap các lop
bao gói (Wrapper) cho tung kiêu dù liêu nguyên thuy (goi tát là lop bao). Các lop bao có
nhung dác tính chung sau:
Các toán tu tao lâp chung. Các lop bao (tru lop Character chi có môt toán tu tao lâp)
dêu có hai toán tu tao lâp:
Toán tu tao lâp su dung giá tri nguyên thuy dê tao ra dôi tuong tuong ung
Character charObj = new Character(‘a’);
Boolean boolObj = new Boolean(true);
Integer intObj = new Integer(2002);
Float floatObj = new Float(3.14F);
Double doubleObj = new Double(3.14);
Toán tu thu hai: chuyên các dôi tuong lop String biêu diên cho các giá tri nguyên
thuy vê các lop tuong ung. Các toán tu này së ném ra ngoai lê
NumberFormatException khi giá tri String truyên vào hàm tao không hop lê.
Boolean boolObj = new Boolean(“true”);
Integer intObj = new Integer(“2002”);
Trang 79
Float floatObj = new Float(“3.14F”);
Double doubleObj= new Double(“3.14”);
Có các hàm tiên ích chung: valueOf(String s), toString(), typeValue(), equals().
Môi lop (tru lop Character) dêu dinh nghia hàm static valueOf(String s) tra lai dôi
tuong tuong ung. Các hàm này ném ra ngoai lê NumberFormatException khi giá
tri String truyên vào phuong thuc không hop lê.
Boolean boolObj = Boolean.valueOf(“true”);
Integer intObj = Integer.valueOf(“2002”);
Float floatObj = Float.valueOf(“3.14F”);
Double doubleObj= Double.valueOf(“3.14”);
Các lop viêt dè hàm toString() tra lai là các dôi tuong String biêu diên cho các giá
tri nguyên thuy o dang xâu.
String charStr = charObj.toString(); // “a”
String boolStr = boolObj.toString(); // “true”
String intStr = intObj.toString(); // “2002”
String doubleStr = doubleObj.toString(); // “3.14”
Các lop dinh nghia hàm typeValue() tra lai các giá tri nguyên thuy tuong ung voi
các dôi tuong nguyên thuy.
boolean b = boolObj.booleanValue(); // true
int i = intObj.intValue(); // 2002
float f = floatObj.floatValueOf(); // 3.14F
double d = doubleObj.doubleValueOf(); // 3.14
char c = charObj.charValue(); // ‘a’
Các lop viêt dè hàm equals() dê thuc hiên so sánh báng nhau cua các dôi tuong
nguyên thuy.
Character charObj = new Character(‘a’);
boolean charTest = charObj.equals(‘b’); // false
Integer intObj1 = Integer.valueOf(“2010”);
boolean intTest = intObj.equals(intObj1); // false
Lop Boolean
Lop này dinh nghia hai dôi tuong Boolean.TRUE, Boolean.FALSE biêu diên cho hai giá
tri nguyên thuy true và false tuong ung.
Lop Character
Lop Character dinh nghia hai giá tri cuc tiêu, cuc dai Character.MIN_VALUE,
Character.MAX_VALUE và các giá tri kiêu ký tu Unicode. Ngoài ra lop này còn dinh
nghia môt sô hàm static dê xu lý trên các ký tu:
static boolean isLowerCase(char ch)// true nêu ch là ký tu thuong
static boolean isUpperCase(char ch)// true nêu ch là ký tu viêt hoa
static boolean isDigit(char ch) // true nêuch là chu sô
static boolean isLetter(char ch)// true nêu ch là chu cái
static boolean isLetterOrDigit(char ch) // true nêu ch là chu hoác là sô
static char toUpperCase(char ch)// Chuyên ch vê chu viêt hoa
Trang 80
static char toLowerCase(char ch)// Chuyên ch vê chu viêt thuong
static char toTitleCase(char ch) // Chuyên ch vê dang tiêu dê.
Các lop bao kiêu so
Các lop Byte, Short, Integer, Long, Float, Double là các lop con cua lop Number. Trong
các lop này dêu xác dinh hai giá tri:
<Lop bao>.MIN_VALUE
<Lop bao>.MAX_VALUE
là các gioi han cua các sô trong kiêu dó. Ví du,
byte minByte = Byte.MIN_VALUE; // -128
int maxInt = Integer.MAX_VALUE; // 2147483647
Trong môi lop bao có hàm typeValue() dê chuyên các giá tri cua các dôi tuong nguyên
thuy vê giá tri sô:
byte byteValue()
short shortValue()
int intValue()
long longValue()
float floatValue()
double doubleValue()
Trong môi lop bao còn có hàm static parseType(String s) dê chuyên các giá tri duoc biêu
diên duoi dang xâu vê các giá tri sô:
byte value1 = Byte.parseByte(“16”);
int value2 = Integer.parseInt(“2002”);
double value3 = Double.parseDouble(“3.14”);
Ví du: Viêt chuong trình dê nhâp vào môt dãy sô tùy ý và sáp xêp theo thu tu táng dân.
import java.io.*;
class SapXep{
static int[] day;
static void nhap(){
String str;
int n = day.length;
DataInputStream stream = new DataInputStream(System.in);
System.out.println("Nhap vao " + n + " so nguyen");
for (int k = 0; k < n; k++){
try{
System.out.print(k + ": ¨);
str = stream.readLine();
day[k] = Integer.valueOf(str).intValue();
}catch(IOException e){
System.err.println("I/O Error!");
}
}
}
static void hienThi(){
int n = day.length;
for (int k = 0; k < n; k++)
System.out.print(day[k] + " ");
System.out.println();
Trang 81
}
static void sapXep(){
int x, max, k;
for(int i =day.length-1; i > 0; i--){
max = day[i];k = i;
for (int j = 0; j < i; j++)
if (max < day[j]){
max = day[j];
k = j;
}
day[k] = day[i];
day[i] = max;
}
}
public static void main(String[] args){
String str;
int n;
DataInputStream stream = new DataInputStream(System.in);
System.out.print("\nCho biet bao nhieu so nhap vao: ");
try{
str = stream.readLine();
}catch(IOException e){
System.err.println("I/O Error!");
str = "0";
}
n = Integer.valueOf(str).intValue();
SapXep.day = new int[n];
nhap();
sapXep();
System.out.println("Day so duoc sap xep: ");
hienThi();
}
}
Lop Void
Lop này ký hiêu cho dôi tuong cua lop Class biêu diên cho giá tri void.
3. Lóp Math
Lop final class Math dinh nghia môt tâp các hàm tinh dê thuc hiên các chuc náng
chung cua toán hoc nhu các phép làm tròn sô, sinh sô ngâu nhiên, tìm sô cuc dai, cuc tiêu,
v.v.
Lop final class Math còn cung câp nhung háng sô nhu sô e (co sô cua logarithm), sô pi
thông qua Math.E và Math.PI.
Các hàm làm tròn và xu lý các giá tri gioi han
static int abs(int i)
static long abs(long l)
static float abs(float f)
static double abs(double d)
+ Hàm abs() duoc nap chông dê tra lai giá tri tuyêt dôi cua dôi sô.
static double ceil(double d)
Trang 82
+ Hàm ceil() tra lai giá tri nho nhât kiêu double mà không nho hon dôi sô và lai báng
sô nguyên. Ví du ceil(3.14) cho giá tri 4.0 là sô trân trên cua dôi sô.
static double floor(double d)
+ Hàm floor() tra lai giá tri lon nhât kiêu double mà không lon hon dôi sô và lai báng
sô nguyên. Ví du floor(3.14) cho giá tri 3.0 là sô sàn duoi cua dôi sô.
static int round(float f d)
static long round(double d)
+ Hàm round() duoc nap chông dê tra lai sô nguyên gân nhât cua dôi sô.
static int max(int a, int b)
static long max(long a, long b)
static float max(float a, float b)
static double max(double a, double b)
+ Hàm max() duoc nap chông dê tra lai giá tri cuc dai cua hai dôi sô.
static int min(int a, int b)
static long min(long a, long b)
static float min(float a, float b)
static double min(double a, double b)
+ Hàm min() duoc nap chông dê tra lai giá tri cuc tiêu cua hai dôi sô.
Các hàm luy thua
static double pow(double d1, double d2)
+ Hàm pow() tra lai giá tri là luy thua cua d1 và d2 (d1d2).
static double exp(double d)
+ Hàm exp() tra lai giá tri là luÿ thua co sô e và sô mu d (ed).
static double log(double d)
+ Hàm log() tra lai giá tri là lô-ga-rit tu nhiên (co sô e) cua d.
static double sqrt(double d)
+ Hàm sqrt() tra lai giá tri là cán bâc hai cua d , hoác giá tri NaN nêu dôi sô âm.
Các hàm luong giác
static double sin(double d)
+ Hàm sin() tra lai giá tri là sine cua góc d duoc cho duoi dang radian.
static double cos(double d)
+ Hàm cos() tra lai giá tri là cose cua góc d duoc cho duoi dang radian.
static double tan(double d)
+ Hàm tan() tra lai giá tri là tangent cua góc d duoc cho duoi dang radian.
Hàm sinh sô ngâu nhiên
static double random()
+ Hàm random() cho lai giá tri là sô ngâu nhiên trong khoang tu 0.0 dên 1.0.
Trang 83
V. Các lóp tâp hop
Tâp hop (Collection) trong Java cho phép luu lai tham chiêu dên các dôi tuong. Các
dôi tuong bât ky có thê duoc luu tru, tìm kiêm và duoc thao tác nhu là các phân tu cua tâp
hop.
Phân giao diên
Giao diên (interface) Collection là co so dê phát triên, mo rông thành các giao diên
khác nhu Set, List, SortedSet và Map và giao diên co so dê mo rông thành SortedMap.
Hình sau mô ta câu trúc phân câp theo quan hê kê thua cua các giao diên lõi.
Các giao diên lõi cua câu trúc Collection duoc mô ta trong bang sau:
interface Mô ta
Collection interface co so dinh nghia tat ca các phép toán co ban cho các lop
cân duy trì thuc hiên và cài dát chúng
Set Mo rông Collection dê cài dát câu trúc tâp hop, trong dó không có
phân tu duoc láp và chúng không duoc sáp xêp
SortedSet Mo rông Set dê cài dát câu trúc tâp hop duoc sáp, trong dó không có
phân tu duoc láp và chúng duoc sáp xêp theo thu tu
List Mo rông Collection dê cài dát câu trúc danh sách, trong dó các phân tu
duoc sáp xêp theo thu tu, và có láp
Map interface co so dinh nghia các phép toán dê các lop su dung và cài dát
các ánh xa tu khoá sang các giá tri
SortedMap Mo rông cua Map dê cài dát các ánh xa khoá theo thu tu
Phân cài dát
Gói java.util cung câp tâp các lop cài dát các giao diên lõi dê tao ra nhung câu trúc du
liêu thuong su dung nhu: Vector, HashTable, HashSet, LinkedList, TreeSet, v.v. Nhùng
lop này và giao diên lõi duoc xây dung theo câu trúc phân câp nhu trong hình H6-3.
< < int erface
> >
< < i nt erface
> >
< < int erface
> >
< < int erface
> >
< < int erface
> >
< < i nt erface
> >
Trang 84
Các giao diên lõi và các lop cài dát chúng
Trong hình trên ký hiêu à biêu diên cho quan hê kê thua giua các giao diên và -->
biêu diên cho su cài dát các giao diên.
Phân thuât toán
Lop java.util.Collection (cân phân biêt voi giao diên Collection) cung câp môt sô
hàm static thuc hiên nhùng thuat toán da xa cho nhùng phép toán khác nhau trên tâp hop,
kê ca sáp xêp, tìm kiêm và dich chuyên các phân tu.
Môt sô hàm trong sô dó là:
static int binarySearch(List list, Object key)
Su dung thuât toán tìm kiêm nhi phân dê xác dinh chi sô cua phân tu key trong
danh sách list.
static void fill(List list, Object obj)
Thay thê tât ca các phân tu trong danh sách list báng obj.
static void shuffle(List list)
Hoán vi các phân tu cua danh sách list môt cách ngâu nhiên.
static void sort(List list)
Sáp xêp các phân tu trong danh sách list theo thu tu táng dân.
1. Collection
Giao diên Collection duoc xây dung nhu là mâu hop dông cho tât ca các câu trúc
tâp hop có thê dua vào dó mà thuc thi và cài dát. Gói java.util cung câp các lop tâp hop và
cài dát hâu hêt các hàm cua Collection.
Các phép toán co so
int size();Xác dinh kích thuoc cua tap hop.
boolean isEmpty();Tra lai true nêu tap hop rong, nguoc lai false.
boolean contains(Object obj);Tra lai true nêu tap hop chua obj, nguoc lai false.
boolean add(Object obj); // Tùy chon
Tree Map
Hash Set
< <
i nt erface> >
Sor t ed Set
Arr ay Li st Vect or LinkedLi st
< <
i nt erface> >
Map
< <
int erf ace> >
Sor t ed Map
< <
int erf ace> >
Li st
HashMap
HasTabl e
< <
i nt erface> >
Set
Tree Set
< <
int erface> >
Col l ect i on
Trang 85
boolean remove(Object obj); // Tùy chon
Tra lai true nêu tâp hop thuc hiên thành công viêc bô sung (loai bo) obj, nguoc lai false.
Môt sô phép toán khác
Nhung phép toán sau thuc hiên trên tâp hop nhu môt don vi câu trúc du liêu.
boolean cotainAll(Collection c); // Tùy chon
Kiêm tra xem tap hop hiên thoi có chua ca tap hop c hay không.
boolean addAll(Collection c);// Tùy chon
Thuc hiên phép hop hai tap hop
boolean removeAll(Collection c); // Tùy chon
Thuc hiên phép tru hai tâp hop
boolean retainAll(Collection c); // Tùy chon
Thuc hiên phép giao hai tâp hop
void clear() // Tùy chon
Huy bo dôi tuong trong tâp hop các phép trên tra lai true nêu thuc hiên thành công
và cho kêt qua thuc hiên duoc minh hoa nhu trong hình H6-4, trong dó a, b là hai
tâp hop bât ky.
a.addAll(b) a.removeAll(b) a.retainAll(b)
Hình Các phép toán trên các tâp hop
2. Set (tâp hop)
Tâp hop Set là câu trúc du liêu, trong dó không có su láp lai và không có su sáp
xêp cua các phân tu. Giao diên Set không dinh nghia thêm các hàm moi mà chi gioi han
lai các hàm cua Collection dê không cho phép các phân tu cua nó duoc láp lai.
Gia su a, b là hai tâp hop (hai dôi tuong cua các lop cài dát Set). Kêt qua thuc hiên trên a,
b có thê mô ta nhu trong bang sau:
Các hàm trong
Set
Các phép hop tuong ung
a.containsAll(b) b ⊆ a ? (Tâp con)
a.addAll(b) a = a ∪ b (Hop tâp hop)
a.removeAll(b) a = a - b (Hiêu tâp hop)
a.retainAll(b) a = a ∩ b (Giao tâp hop)
a.clear() a = ∅ (Tâp rông)
Sau dây chúng ta xét môt sô lop thuc thi cài dát giao diên Set.
HashSet
Môt dang cài dát nguyên thuy cua Set là lop HashSet, trong dó các phân tu cua nó là
không duoc sáp. Lop này có các toán tu tao lâp:
HashSet():Tao ra môt tâp moi không có phân tu nào ca (tâp rông).
HashSet(Collection c)
a
b
a
a a a
Trang 86
Tao ra môt tâp moi chua các phân tu cua tâp hop c nhung không cho phép láp.
HashSet(int initCapacity)
Tao ra môt tâp moi rông có kích thuoc (kha náng chua) là initCapacity.
HashSet(int initCapacity, float loadFactor)
Tao ra môt tâp moi rông có kích thuoc (kha náng chua) là initCapacity và yêu tô
duoc nap vào là loadFactor.
Ví du 6.4 Khi thuc hiên các dôi sô duoc dua vào sau tên chuong trình theo dòng lênh.
Chuong trình bát dâu voi tap1 là rông và lây các ký tu cua dôi sô dâu tiên dê tao ra tap2.
So sánh hai tâp dó, thông báo kêt qua ra màn hình, sau dó công dôn tap2 vào tap1 và lai
tiêp tuc nhu thê dôi voi dôi sô tiêp theo cho dên hêt.
import java.util.*;
public class TapKT {
public static void main(String args[]) {
int nArgs = args.length; // Sô dôi sô cúa chuong trình
Set tap1 = new HashSet(); // Tao ra tâp thú nhât là rông
for (int i = 0; i < nArgs; i++){
String arg = args[i]; // Lây tùng dôi sô cúa chuong trình
Set tap2 = new HashSet();// Tao ra tâp thú 2
int size = arg.length(); // Sô ký tu trong môi dôi sô
for (int j = 0; j < size; j++)// Tâp thú 2 chúa các ký tu cúa arg
tap2.add(new Character(arg.charAt(j)));
// Tao ra tâp tapChung chính bãng tap1
Set tapChung = new HashSet(tap1);
tapChung.retainAll(tap2);// tapChung = tap1 ∩ tap2
boolean b = tapChung.size() == 0;
if (b)
System.out.println(tap2+" va "+tap1+" la roi nhau");
else {
// tap2 có phái là tâp con cúa tap1?
boolean isSubset = tap1.containsAll(tap2);
// tap1 có phái là tâp con cúa tap2?
boolean isSuperset = tap2.containsAll(tap1);
// tap1 có bãng tap2?
if (isSuperset && isSubset)
System.out.println(tap2 + " bang tap " + tap1);
else if (isSubset)
System.out.println(tap2+" la tap con cua "+tap1);
else if (isSuperset)
System.out.println(tap2+" la tap cha cua "+tap1);
else
System.out.println(tap2 + " va " + tap1 + " co "
+ tapChung + " la phan chung");
}
tap1.addAll(tap2);// hop tap2 vào tap1
}
}
}
Dich và thuc hiên chuong trình voi các dôi sô nhu sau:
java TapKT em voi em anh
së cho kêt qua:
[m, e] va [ ] la roi nhau
Trang 87
[v, i, o] va [m, e] la roi nhau
[m, e] la tap con cua [m, v, i, e, o]
[a, h, n] va [m, v, i, e, o] la roi nhau
3. List (danh sách)
Câu trúc List là dang tâp hop các phân tu duoc sáp theo thu tu (còn duoc goi là dãy
tuân tu) và trong dó cho phép láp (hai phân tu giông nhau). Ngoài nhung hàm mà nó duoc
kê thua tu Collection, List còn bô sung thêm nhung hàm nhu:
Object get(int index)
Cho lai phân tu duoc xác dinh boi index.
Object set(int index, Object elem) // Tùy chon
Thay thê phân tu duoc xác dinh boi index báng elem.
void add(int index, Object elem) // Tùy chon
Chèn elem vào sau phân tu duoc xác dinh boi index.
Object remove(int index) // Tùy chon
Bo di phân tu duoc xác dinh boi index.
boolean addAll(int index, Collection c) // Tùy chon
Chèn các phân tu cua tâp hop c vào vi trí duoc xác dinh boi index.
int indexOf(Object elem)
Cho biêt vi trí lân xuât hiên dâu tiên cua elem trong danh sách.
int lastIndexOf(Object elem)
Cho biêt vi trí lân xuât hiên cuôi cùng cua elem trong danh sách.
List subList(int fromIndex, int toIndex)
Lây ra môt danh sách con tu vi trí fromIndex dên toIndex .
ListIterator listIterator()
Cho lai các phân tu liên tiêp bát dâu tu phân tu dâu tiên.
ListIterator listIterator(int index)
Cho lai các phân tu liên tiêp bát dâu tu phân tu duoc xác dinh boi index.
Trong dó ListIterator là giao diên mo rông giao diên Iterator dã có trong java.lang.
Các lóp ArrayList, Vector và LinkedList
Ba lop này có nhung toán tu tao lâp dê tao ra nhung danh sách moi rông hoác có
các phân tu lây theo các tâp hop khác.
Vector và ArrayList là hai lop kiêu mang dông (kích thuoc thay dôi duoc). Hiêu suât su
dung hai lop này là tuong duong nhau, tuy nhiên nêu xét theo nhiêu khía canh khác thì
ArrayList là câu trúc hiêu qua nhât dê cài dát câu trúc danh sách List.
Ví du 6.5 Hê thông có môt dãy N_DIGIT (5) chu sô bí mât. Hãy viêt chuong trình nhâp
vào N_DIGIT chu sô dê doán xem có bao nhiêu chu sô trùng và có bao nhiêu vi trí các
chu sô trùng voi dãy sô cho truoc.
import java.util.*;
public class NhapDoanSo {
final static int N_DIGIT = 5;
public static void main(String args[]){
if(args.length != N_DIGIT) {
System.err.println("Hay doan " + N_DIGIT + " chu so!");
return;
}
List biMat = new ArrayList();// Tao danh sách biMat là rông
Trang 88
biMat.add("5"); // Bô sung các sô vào dãy biMat
biMat.add("3");
biMat.add("2");
biMat.add("7");
biMat.add("2");
List doan = new ArrayList();// Tao danh sách doan là rông
for(int i = 0; i < N_DIGIT; i++)
doan.add(args[i]); // Ðua các sô tù dôi sô chuong trình vào doan
List lap = new ArrayList(biMat);// Luu luu biMat sang lap
int nChua = 0;
// Ðêm sô các chü sô trùng nhau, nghïa là thuc hiên duoc phép bó di remove()
for(int i = 0; i < N_DIGIT; i++)
if (lap.remove(doan.get(i))) ++nChua;
int nViTri = 0;
ListIterator kiemTra = biMat.listIterator();
ListIterator thu = doan.listIterator();
// Tìm nhüng vi trí doán trúng trong hai dãy có lãp
while (kiemTra.hasNext())// Khi còn phân tú tiêp theo
// Kiêm tra xem lân luot các vi trí cúa hai dãy có trùng nhau hay không
if (kiemTra.next().equals(thu.next())) nViTri++;
// Thông báo kêt quá ra màn hình
System.out.println(nChua + " chu so doan trung.");
System.out.println(nViTri + " vi tri doan trung.");
}
}
Dich và thuc hiên chuong trình:
java NhapDoanSo 3 2 2 2 7
së cho kêt qua:
4 chu so doan trung
1 vi tri doan trung
4. Map (ánh xa)
Map dinh nghia các ánh xa tu các khoá (keys) vào các giá tri. Luu ý: các khóa phai
là duy nhât (không cho phép láp). Môi koá duoc ánh xa sang nhiêu nhât môt giá tri, duoc
goi là ánh xa don.
Các ánh xa không phai là các tâp hop, giao diên Map cung không phai là mo rông cua các
Collection. Song, phép ánh xa có thê xem nhu là môt loai tâp hop theo nghia: các khoá
(key) tao thành tâp hop và tâp hop các giá tri (value) hoác tâp các cáp <key, value>.
Giao diên Map khai báo nhung hàm sau:
Object put(Object key, Object value); // Tùy chon
Chèn vào môt cáp <key, value>
Object get(Object key);
Doc giá tri duoc xác dinh boi key nêu có ánh xa, nguoc lai cho null nêu không có
ánh xa ung voi key.
Object remove(Object key); // Tùy chon
Loai bo ánh xa duoc xác dinh boi key.
boolean containsKey(Object key);
Cho giá tri true nêu key duoc ánh xa sang môt giá tri nào dó, nguoc lai là false.
boolean containsValue(Object value);
Cho giá tri true nêu value duoc ánh xa boi môt key nào dó, nguoc lai là false.
Trang 89
int size();
Cho sô các cáp ánh xa <key, value>.
boolean isEmpty();
Cho giá tri true nêu ánh xa rông, nguoc lai là false.
Môt sô phép toán thuong dùng
void putAll(Map t); // Tùy chon
Sao lai các ánh xa tu t.
void clear(); // Tùy chon
Xoá di tât ca các ánh xa.
Set keySet();
Xác dinh tâp các khoá.
Collection values();
Xác dinh tâp hop các giá tri.
Set entrySet();
Xác dinh tâp các ánh xa <key, value>.
Các lóp HashMap và HashTable
Hai lop này cài dát giao diên Map và duoc xây dung trong java.lang. Chúng cho phép tao
ra các ánh xa moi có thê rông hoác có nhung kích thuoc tùy ý.
Ví du 6.6
Viêt chuong trình nhap vào các trong luong và in ra tan suat cua các trong luong
dó trong các nhóm cách nhau 5 don vi (kg).
import java.util.*;
public class NhomTrongluong {
public static void main(String args[]){
// Tao ra môt ánh xa dê luu tân suât cúa môi nhóm
Map demNhom = new HashMap();
int nArgs = args.length;
// Ðoc các trong luong duoc nhâp vào tù dôi sô và chia nhóm cách nhau 5 don vi.
for(int i = 0; i < nArgs; i++){
double trongL = Double.parseDouble(args[i]);
Integer nhomTL=new Integer((int)Math.round(trongL/5)*5);
Integer demCu = (Integer)demNhom.get(nhomTL);
// Tãng sô lân trong luong trong cùng nhóm, nêu là lân dâu (demCu = null) thì dãt là 1.
Integer demMoi = (demCu == null)?
new Integer(1): new Integer(demCu.intValue()+1);
demNhom.put(nhomTL, demMoi);
}
// Lây ra tâp các giá tri tù ánh xa demNhom
List keys = new ArrayList(demNhom.keySet());
// Sãp xêp lai theo các nhóm trong luong
Collections.sort(keys);
ListIterator keyIterator = keys.listIterator();
// Tìm tân suât cúa các trong luong duoc nhâp vào trong các nhóm
while(keyIterator.hasNext()) {
Integer nhom = (Integer) keyIterator.next();
Integer dem = (Integer) demNhom.get(nhom);
int demInt = dem.intValue();
// Sú dung hàm fill() cúa lóp Array dê tao ra xâu gôm demInt các dâu '*'
char[] bar = new char[demInt];
Trang 90
Arrays.fill(bar, '*');
System.out.println(nhom+"\t" + new String(bar));
}
}
}
Dich và chay chuong trình NhomTrongLuong voi các tham sô:
java NhomTrongLuong 75 72 93 12 34
së cho kêt qua:
*
*
1. **
95 *
Nhu vây, nhóm 10 kg có 1, 35 kg có 1, 75 kg có 2 và 95 kg có 1.
4. SortedSet (tâp duoc sáp) và SortedMap (ánh xa duoc sáp)
Các câu trúc tâp hop (set) và ánh xa (map) có giao diên dác biêt là SortedSet và
SortedMap nhu trong hình H6-5 dê cài dát nhung câu trúc có các phân tu duoc sáp theo
thu tu chi dinh.
Giao diên SortedSet
SortedSet là giao diên mo rong cua Set cung cap các hàm dê xu lý các tap duoc sáp.
SortedSet headSet(Object toElem);
Cho lai tâp duoc sáp gôm nhung phân tu dung truoc toElem.
SortedSet tailSet(Object fromElem);
Cho lai tâp duoc sáp gôm nhung phân tu cuôi dung sau fromElem.
SortedSet subSet(Object fromElem, Object toElem);
Cho lai tâp duoc sáp gôm nhung phân tu kê tu fromElem dên toElem.
Object first();Cho lai phan tu dau tiên (cuc tiêu) cua tap duoc sáp.
Object last();Cho lai phan tu cuoi cùng (cuc dai) cua tap duoc sáp.
Comparator comparator()
Cho lai thu tu so sánh cua câu trúc duoc sáp, cho null nêu các phân tu duoc sáp theo thu
tu tu nhiên (táng dân)
Giao diên SortedMap
SortedMap là giao diên mo rong cua Map cung cap các hàm dê xu lý các ánh xa duoc
sáp theo thu tu cua khoá (key).
SortedMap headMap(Object toKey);Cho lai ánh xa duoc sáp gom nhùng phan tu dung
truoc toKey.
SortedMap tailMap(Object fromKey);Cho lai ánh xa duoc sáp gom nhùng phan tu cuoi
dung sau fromKey.
SortedMap subMap(Object fromKey, Object toKey);Cho lai ánh xa duoc sáp gôm nhung
phân tu kê tu fromKey dên toKey.
Object firstKey();Cho lai phan tu dau tiên (cuc tiêu) cua ánh xa duoc sáp.
Object lastKey();Cho lai phan tu cuoi cùng (cuc dai) cua ánh xa duoc sáp.
TreeSet và TreeMap
Hai lop này cài dát hai giao diên SortedSet và SortedMap tuong ung. Chúng có bôn loai
toán tu tao lâp nhu sau:
TreeSet()
TreeMap()
Trang 91
Tao ra nhùng tap hoàc ánh xa moi và rong, duoc sáp theo thu tu tàng dan cua các
phân tu hoác cua khoá.
TreeSet(Comparator c)
TreeMap(Comparator c)
Tao ra nhùng tap hoàc ánh xa moi duoc sáp và xác dinh thu tu so sánh theo c.
TreeSet(Collection c)
TreeMap(Map m)
Tao ra nhùng tap hoàc ánh xa moi duoc sáp và có các phan tu lay tu c hoàc tu m
tuong ung.
TreeSet(SortedSet s)
TreeMap(SortedMap m)
Tao ra nhung tâp hoác ánh xa moi duoc sáp và có các phân tu lây tu s hoác tu m tuongung.
Trang 92
Chuong 3: XU LÝ NGOAI LE
Dôi voi nguoi lâp trình ho có thê gáp môt trong các lôi sau:
- Lôi cú pháp (syntac error)
- Lôi logic thuât toán
- Lôi lúc thuc thi ( runtime error)
- Dôi voi lôi cú pháp nguoi lâp trình có thê phát hiên và sua lôi, dua vào trình biên dich,
dây là lôi dê phát hiên và sua chua, tuy nhiêmn dây cung là lôi gây khó khán và chán nan
dôi voi nguoi moi hoc lâp trình.
- Dôi voi lôi thuât toán, dây là lôi khó phát hiên và sua chua nhât, tuy nhiên trong bài này
ta không bàn luân vê vân dê này.
- Dôi voi lôi lúc thuc thi, ta hoàn toàn có thê kiêm soát duoc chúng, thông thuong lôi
runtime thuong do nguyên nhân khách quan nhu: truy câp vào môt ô dia nhung ô dia này
lai chua sán sàng, hay thuc hiên phép chia nhung mâu sô lai báng 0, kêt nôi voi máy tính o
xa nhung máy dó lai không tôn tai…, khi môt lôi runtime xây ra JVM së phát sinh môt
ngoai lê, nêu môt chuong trình không cung câp mã su lý ngoai lê có thê kêt thúc không
bình thuong, trong bài hôm nay ta së bàn vê vân dê su lý ngoai lê trong java.
- Moi lop biêt lê trong java dêu duoc dân xuât tu lop co so Throwable, ta có thê tao ra lop
ngoai lê riêng báng cách mo rông lop Throwable
I. Muc dích cua viêc xu lý ngoai lê
Môt chuong trình nên có co chê xu lý ngoai lê thích hop. Nêu không, chuong trình së
bi ngát khi môt ngoai lê xay ra. Trong truong hop dó, tât ca các nguôn tài nguyên mà hê
thông dã câp không duoc giai phóng. Diêu này gây lãng phí tài nguyên. Dê tránh truong
hop này, tât ca các nguôn tài nguyên mà hê thông câp nên duoc thu hôi lai. Tiên trình này
dòi hoi co chê xu lý ngoai lê thích hop.
Ví du, xét thao tác vào ra (I/O) trong môt tâp tin. Nêu viêc chuyên dôi kiêu du liêu
không thuc hiên dúng, môt ngoai lê së xay ra và chuong trình bi huy mà không dóng tâp
tin lai. Lúc dó tâp tin dê bi hu hai và các nguôn tài nguyên duoc câp phát cho tâp tin
không duoc tra lai cho hê thông.
II. Mô hình su lý ngoai lê cua java
Mô hình su lý ngoai lê cua java dua trên ba hoat dông chính: dác ta ngoai lê, ném
ra ngoai lê, và bát ngoai lê.
- Môi phuong thuc dêu có thê phát sinh các ngoai lê, các ngoai lê có thê phát sinh cân
duoc mô ta chi tiêt trong lênh khai báo cua phuong thuc, viêc khai báo này duoc goi là dác
ta ngoai lê.
- Khi môt câu lênh trong phuong thuc gây lôi, mà nguoi lâp trình không cung câp mã xu
lý lôi, thì ngoai lê duoc chuyên dên phuong thuc goi phuong thuc dó, viêc này duoc goi là
ném ra biêt lê, ta có thê ném ra biêt lê môt cách tuong minh (diêu này së duoc gioi thiêu
sau).
- Sau khi JVM ném ra môt ngoai lê, thì hê thông thi hành java bát dâu tiên trình tìm mã xu
lý lôi. Mã xu lý lôi hay còn goi là mã xu lý biêt lê, java runtime së tìm mã xu lý lôi báng
cách lân nguoc tro lai chuôi các phuong thuc goi nhau, bát dâu tu phuong thuc hiên tai.
Chuong trình së kêt thúc nêu không tìm thây mã xu lý biêt lê. Quá trình tìm kiêm này goi
là bát biêt lê.
Trang 93
III. Dàc ta ngoai lê
Dác ta ngoai lê là khai báo cho trình biên dich biêt là phuong thuc này có thê gây ra
ngoai lê lúc thi hành.
Dê khai báo biêt lê ta su dung tu khoá throws trong khai báo phuong thuc, ví du:
public void myMethod() throws IOException, RemoteException
tu khoá throws chi cho trình biên dich java biêt ráng phuong thuc này có thê ném ra ngoai
lê IOException và RemoteException, nêu môt phuong thuc ném ra nhiêu ngoai lê thì các
ngoai lê duoc khai báo cách nhau boi dâu phây ‘,’
III. Ném ra ngoai lê
Môt phuong thuc sau khi dã khai báo các biêt lê, thì ban (hoác chuong trình thuc thi java)
có thê ném ra các dôi tuong biêt lê, có kiêu mà ta dã khai báo trong danh sách throws. Cú
pháp cua lênh ném ra ngoai lê:
throw ExceptionObject;
Chú ý:
- Ban phai chú ý giua lênh khai báo biêt lê và lênh ném ra ngoai lê
- Môt phuong thuc chi có thê ném ra các ngoai lê mà nó duoc khai báo
IV. Bàt ngoai lê
Môt ngoai lê (exception) trong chuong trình Java là dâu hiêu chi ra ráng có su xuât
hiên môt diêu kiên không bình thuong nào dó.
Khi môt ngoai lê xay ra, dôi tuong tuong ung voi ngoai lê dó duoc tao ra. Dôi tuong
này sau dó duoc truyên cho phuong thuc là noi mà ngoai lê xay ra. Dôi tuong này chua
thông tin chi tiêt vê ngoai lê. Thông tin này có thê duoc nhân vê và duoc xu lý. Các ngoai
lê này có thê là môt ngoai lê chuân cua Java hoác có thê là môt ngoai lê do ta tao ra. Lop
‘Throwable’ duoc Java cung câp là cha cua tât ca các ngoai lê trong Java (lop dâu tiên
trong cây thua kê).
Sau khi ban dã biêt cách khai báo và ném ra biêt lê, thì phân viêc quan trong nhât là
bát và xu lý biêt lê.
Vân dê dôi voi nguoi lâp trình java là phai biêt duoc doan mã nào cua anh ta có thê
gây ra lôi. Khi ho dã khoanh vùng duoc doan mã có thê gây ra lôi ho së dát doan mã, có
kha náng gây ra lôi dó trong khôi try ( thu làm), và dát doan mã xu lý lôi trong khôi catch
( bát giu). Khuôn dang tông quát nhu sau:
try{
// Các lênh có kha náng gây lôi
}
catch ( TypeException1 ex){
// Mã duoc thuc thi khi môt ngoai lê TypeException1 duoc phát sinh trong khôi try
}
catch ( TypeException2 ex){
// Mã duoc thuc thi khi môt ngoai lê TypeException2 duoc phát sinh trong khôi try
}
...
catch ( TypeExceptionN ex){
// Mã duoc thuc thi khi môt ngoai lê TypeExceptionN duoc phát sinh trong khôi try
} finally{
// khôi lênh nay luôn duoc thuc hiên cho dù ngoai lê có xay ra trong khôi try hay không.
}
Trang 94
Nêu không có môt ngoai lê nào phát sinh trong khôi try thì các mênh dê catch së bi
bo qua, trong truong hop môt trong các câu lênh bên trong khôi try gây ra môt ngoai lê thì,
thì java së bo qua các câu lênh còn lai trong khôi try dê di tìm mã xu lý ngoai lê, nêu kiêu
ngoai lê so khop voi kiêu ngoai lê trong mênh dê catch, thì mã lênh trong khôi catch dó së
duoc thuc thi, nêu không tìm thây môt kiêu ngai lê nào duoc so khop java së kêt thúc
phuong thuc dó và chuyên biêt lê dó ra phuong thuc dã goi phuong thuc này quá trình này
duoc tiêp tuc cho dên khi tìm thây mã xu lý biêt lê, nêu không tìm thây mã xu lý biêt lê
trong chuôi các phuong thuc goi nhau, chuong trình có thê châm dut và in thông báo lôi ra
luông lôi chuân System.err
Ví du:
Thuc hiên
khôi t ry
Tìm khôi xú lý lôi
( khôi cat ch) dê
t huc hiên
Nêu ngoai lê sinh r a
t rong khôi t r y là môt
t hê hiên cúa lóp
ngoai lê
Thuc hiên khôi
cat ch úng vói
ngoai lê 1
Nêu ngoai lê sinh r a
t rong khôi t r y là môt
t hê hiên cúa lóp
ngoai lê
Thuc hiên khôi
cat ch úng vói
ngoai lê 2
false
true
true
false
…………
Nêu ngoai lê sinh r a
t rong khôi t r y là môt
t hê hiên cúa lóp
ngoai lê
Thuc hiên khôi
cat ch úng vói
ngoai lê 1
true
Có ngoai xây
ra t rong khôi
t ry
yes
no
Thuc hiên
khôi finally
Trang 95
class TryClass{
public static void main(String args[]) {
int n=0;
try {
System.out.println(1/n);
}
catch(ArithmeticException ex)
{System.out.println("Loi chia cho 0¨);}
}
}
Khi chay chuong trình này ta se thu duoc môt dòng in ra màn hình nhu sau:
Loi chia cho 0
Trong doan chuong trình trên khi chia môt sô cho 0 së gáp ngoai lê ArithmeticException,
biêt duoc ngoai lê này có thê xây ra do vây ta bát nó và xu lý trong khôi
catch(ArithmeticException ex), o dây ex là môt dôi tuong cua lop ArithmeticException
chua các thông tin vê ngoai lê xây ra, ta có thê lây cá thông tin vê ngoai lê cháng han nhu
lây vê mô ta ngoai lê nhu sau:
System.out.println(a.getMessage()).
V. Khôi ‘finally’
Khi môt ngoai lê xuât hiên, phuong thuc dang duoc thuc thi có thê bi dung mà không
duoc hoàn thành. Nêu diêu này xay ra, thì các doan mã phía sau (ví du nhu doan mã có
chuc náng thu hôi tài nguyên, nhu các lênh dóng tâp viêt o cuôi phuong thuc) së không
bao gio duoc goi. Java cung câp khôi finally dê giai quyêt viêc này. Thông thuong khôi
‘finally’ chua các câu lênh mang tính chât don dep nhu: dóng kêt nôi CSDL, dóng têp
tin,….
try{
//Các lênh có kha náng ném ra ngoai lê
}
catch(Exception1 ex1){

}
catch(Exception2 ex2){

}
catch(Exceptionn exn){

}
finally{
//Mã lênh don dep
}
Khôi ‘finally’ là tuy chon, không bát buôc phai có. Khôi này duoc dát sau khôi ‘catch’
cuôi cùng. Chuong trình së thuc thi câu lênh dâu tiên cua khôi ‘finally’ ngay sau khi gáp
câu lênh ‘return’ hay lênh ‘break’ trong khôi ‘try’.
Trang 96
Khôi ‘finally’ bao dam lúc nào cung duoc thuc thi, bât châp có ngoai lê xay ra hay
không.
Hình minh hoa su thuc hiên cua các khôi ‘try’, ‘catch’ và ‘finally’.
try block
catch block finally block
finally block
No Exception Exception occurs
VI. Môt sô lóp ngoai lê chuân cua Java
Danh sách môt sô lóp ngoai lê
Tên lóp ngoai lê Ý nghia
Throwable Dây là lop cha cua moi lop ngoai lê trong Java
Exception Dây là lop con truc tiêp cua lop Throwable, nó
mô ta môt ngoai lê tông quát có thê xây ra
trong ung dung
RuntimeException Lop co so cho nhiêu ngoai lê java.lang
ArthmeticException Lôi vê sô hoc, ví du nhu ‘chia cho 0’.
IllegalAccessException Lop không thê truy câp.
IllegalArgumentException Dôi sô không hop lê.
ArrayIndexOutOfBoundsExeption Lôi truy câp ra ngoài mang.
NullPointerException Khi truy câp dôi tuong null.
SecurityException Co chê bao mât không cho phép thuc hiên.
ClassNotFoundException Không thê nap lop yêu câu.
NumberFormatException Viêc chuyên dôi tu chuôi sang sô không thành
công.
AWTException Ngoai lê vê AWT
IOException Lop cha cua các lop ngoai lê I/O
FileNotFoundException Không thê dinh vi tâp tin
EOFException Kêt thúc môt tâp tin.
NoSuchMethodException Phuong thuc yêu câu không tôn tai.
InterruptedException Khi môt luông bi ngát.
Trang 97
Chuong 4: LAP TRÌNH DA TUYEN
I. Các kiên thúc liên quan
1. Tiên trình ( process)
Tiên trình là môt thê hiên cua môt chuong trình dang xu lý. So huu môt con tro
lênh, tâp các thanh ghi và các biên. dê hoàn thành tác vu cua mình, môt tiên trình còn cân
dên môt sô tài nguyên khác nhu: CPU, bô nho, các tâp tin, các thiêt bi ngoai vi..
Cân phân biêt duoc giua tiên trình và chuong trình. Môt chuong trình là môt thê hiên thu
dông, chua các chi thi diêu khiên máy tính dê thuc hiên muc dích gì dó; khi cho thuc thi
chi thi này thì chuong trình së biên thành tiên trình
Có thê nói tóm tát tiên trình là môt chuong trình chay trên hê diêu hành và duoc quan lý
thông qua môt sô hiêu goi là the
2. Tiêu trình ( thread )
Môt tiêu trình là môt don vi xu lý co ban trong hê thông. Môi tiêu trình xu lý tuân
tu các doan code cua nó, so huu môt con tro lênh, môt tâp các thanh ghi và môt vùng nho
stack riêng, các tiêu trình chia se CPU voi nhau giông nhu cách chia se giua các tiên trình.
Môt tiên trình so huu nhiêu tiêu trình, tuy nhiên môt tiêu trình chi có thê thuôc vê môt tiên
trình, các tiêu trình bên trong cùng môt tiên trình chia se nhau không gian dia chi chung,
diêu này có nghia là các tiêu trình có thê chia se nhau các biên toàn cuc cua tiên trình. Môt
tiêu trình cung có thê có các trang thái giông nhu các trang thái cua môt tiên trình.
3. Hê diêu hành don nhiêm, da nhiêm
Ø HDH don nhiêm là HDH chi cho phép 1 tiên trình chay tai môt thoi diêm, ví du HDH
DOS là HDH don nhiêm.
Ø - HDH da nhiêm cho phép nhiêu tiên trình chay tai môt thoi diêm, ví du HDH
windows, Unix, Linux là các HDH da nhiêm
Ø HDH da nhiêm uu tiên: các tiên trình duoc câp phát thoi gian su dung CPU theo muc
uu tiên khác nhau
Ø HDH da nhiêm không uu tiên: các tiên trình không có muc uu tiên nào ca, chúng “tu
giác” nha quyên kiêm soát CPUsau khi kêt thúc phân công viêc
Chú ý: trong thuc tê môi máy thuong chi có 1 CPU, nên không thê có nhiêu tiên trình
chay tai môt thoi diêm. Nên thông thuong su da chuong chi là gia lâp. Chúng duoc gia lâp
báng cách luu tru nhiêu tiên trình trong bô nho tai môt thoi diêm, và diêu phôi CPU qua
lai giua các tiên trình.
4. Các trang thái cua tiên trình
Trang thái cua môt tiên trình tai môt thoi diêm duoc xác dinh boi hoat dông hiên
thoi cua tiên trình dó. Trong quá trình sông môt tiên trình thay dôi trang thái do nhiêu
nguyên nhân nhu: hêt thoi gian su dung CPU, phai cho môt su kiên nào dó xây ra, hay
doi môt thao tác nhâp/xuât hoàn tât…
Tai môt thoi diêm môt tiên trình có thê nhân môt trong các trang thái sau dây:
1. Tao moi: tiên trình dang duoc thành lâp
2. Running: các chi thi cua tiên trình dang duoc xu lý, hay nói cách khác tiên trình
dang so huu CPU
3. Blocked: tiên trình dang cho duoc câp tài nguyên, hay cho môt su kiên nào dó xây
ra
4. Ready: tiên trình dang cho câp CPU dê xu lý
5. Kêt thúc: tiên trình dã hoàn tât viêc xu lý
Trang 98
5. Miên gáng ( Critical Section )
a) Vân dê tranh châp tài nguyên
Ta xét tình huông sau:
Ø gia su A có 500$ trong tài khoan ngân hàng
Ø A quyêt dinh rút ra 100$ tu tài khoan ngân hàng, thao tác cua A gôm 2 buoc:
1) lây ra 100$
2) giam sô tài khoan di 100$
Ø Tình huông giua 2 thao tác 1 và
2, B tra A 300$, do vây B câp
nhât vào trong tài khoan cua A là 800$ ( =500$ +300$), sau dó A tiêp tuc công viêc 2,
nó câp nhât lai trong tài khoan là 400$, nhu vây B dã tra A 300$, nhung A không nhân
duoc.
b) Miên gáng (Critical Section)
Doan chuong trình trong dó có thê xây ra các mâu thuân truy xuât trên tài nguyên
dung chung duoc goi là miên gáng ( Critical Section )
6. Khoá chêt (deadlock)
Môt tâp các tiên trình duoc dinh nghia là o trong tình trang khoá chêt nêu nhu, môi tiên
trình trong tâp hop dêu dêu cho doi môt sô tài nguyên dang bi nám giu boi các tiên
trình khác, nhu vây không có tiên trình nào có thê tiêp tuc xu lý, cung nhu giai phóng
tài nguyên cho các tiên trình khác su dung, tât ca các tiên trình trong tâp hop dêu bi
khoá vinh viên!.
II. Lâp trình da tuyên trong Java
Voi Java ta có thê xây dung các chuong trình da luông. Môt ung dung có thê bao gôm
nhiêu luông. Môi luông duoc gán môt công viêc cu thê, chúng duoc thuc thi dông thoi voi
các luông khác.
Có hai cách dê tao ra luông
Cách 1: Tao ra môt lop kê thua tu lop Thread và ghi dè phuong thuc run cua lop
Thread nhu sau:
class MyThread extends Thread{
public void run(){
//Mã lênh cua tuyên
}
Mí i t¹ o KÕt thóc
Runni ng Ready
Bl ocked
S¬ ®å chuyÓn tr¹ ng th¸ i cña mét ti Õn tr×nh
A
500
$
1
2 500-
50
Trang 99
}
Cách 2: Tao ra môt lop triên khai tu giao diên Runnable, ghi dè phuong thuc run
class MyThread implements Runnable{
public void run(){
//Mã lênh cua tuyên
}
}
1. Lóp Thread
Lop Thread chua phuong thuc tao dung Thread() cung nhu nhiêu phuong thuc huu ích
có chuc náng chay, khoi dông, tam ngung, tiêp tuc, gián doan và ngung tuyên. Dê tao ra
và chay môt tuyên ta cân làm 2 buoc:
Ø Mo rông lop Thread và Ghi dè phuong thuc run()
Ø Goi phuong thuc start() dê bát dâu thuc thi tuyên
Lop Thread không có nhiêu phuong thuc lám, chúng chi có môt vài phuong thuc huu
dung duoc liêt kê sau:
Ø public void run()
duoc java goi dê thuc thi tuyên thi hành, ban phai ghi dè phuong thuc này dê thuc thi
nhiêm vu cua tuyên, boi vì phuong thuc run()cua lop Thread chi là phuong thuc rông
Ø public void start()
khi ta tao ra tuyên nó chua thuc su chay cho dên khi, phuong thuc start() duoc goi, khi
start() duoc goi thì phuong thuc run() cung duoc kích hoat
Ø public void stop()
có chuc náng ngung tuyên thi hành, phuong thuc này không an toàn, ban nên gán null
vào biên Thread dê dê dung tuyên, thay vì su dung phuong thuc stop()
Ø public void suspend()
Có chuc náng tam ngung tuyên, trong java 2, phuong thuc này ít duoc su dung, boi vì
phuong thuc này không nha tài nguyên mà nó lám giu, do vây có thê nguy co dân dên
deadlock ( khoá chêt ), ban nên dùng phuong thuc wait(), dê tam ngung tuyên thay vì
su dung phuong thuc suspend()
Ø public void resume()
Tiêp tuc vân hành tuyên nêu nhu nó dang bi ngung, nêu tuyên dang thi hành thì
phuong thuc này bi bo qua, thông thuong phuong thuc này duoc dùng kêt hop voi
phuong thuc suspend(), kê tu java 2 phuong thuc này cùn voi phuong thuc suspend()bi
tu chôi, do vây ban nên dùng phuong thuc notify () thay vì su dung phuong thuc
resume()
Ø public static void sleep( long millis) Threadows InterruptedException
dát tuyên thi hành vào trang thái ngu, trong khoang thoi gian xác dinh báng mili giây.
chú ý sleep() là phuong thuc tinh.
Ø public void interrupt()
làm gián doan tuyên thi hành
Ø public static boolean isInterrupt()
kiêm tra xem tuyên có bi ngát không
Ø public void setpriority( int p)
ân dinh dô uu tiên cho tuyên thi hành, dô uu tiên duoc xác dinh là môt sô nguyên thuôc
doan [1,10]
Ø public final void wait() throws InterruptException
Trang 100
dát tuyên vào trang thái cho môt tuyên khác, cho dên khi có môt tuyên khác thông báo
thì nó lai tiêp tuc, dây là phuong thuc cua lop co so Object
Ø public final void notify ()
dánh thuc tuyên dang cho, trên dôi tuong này
Ø public final void notifyAll() dánh thuc tât ca các tuyên dang cho trên dôi tuong này
Ø isAlive() Tra vê True, nêu luông là vân còn tôn tai (sông)
Ø getPriority() Tra vê muc uu tiên cua luông
Ø join() Doi cho dên khi luông kêt thúc
Ø isDaemon() Kiêm tra nêu luông là luông môt luông chay ngâm (deamon)
Ø setDeamon(boolean on) Dánh dâu luông nhu là luông chay ngâm
Ví du: Ta tao ra 2 tuyên thi hành song song, môt tuyên thuc hiên viêc in 200 dòng “Dai
hoc su pham kÿ thuât Hung Yên”, trong khi tuyên này dang thuc thi thì có môt tuyên khác
vân tiêp tuc in 200 dòng chu “chào mung ban dên voi java”
public class Hello{
public static void main ( String[] args ){
new ChaoDH ().start ();
new ChaoJV ().start ();
}
}
class ChaoDH extends Thread{
public void run (){
for ( int i = 1; i <= 200; i++ )
System.out.println ( "Dai hoc su pham kÿ thuât Hung Yên" );
}
}
class ChaoJV extends Thread{
public void run (){
for ( int i = 1; i <= 200; i++ )
System.out.println ( "chào mung ban dên voi java" );
}
}
khi ta chay chuong trình thây kêt qua xen kë nhau nhu
………………..
Dai hoc su pham kÿ thuât Hung Yên
Dai hoc su pham kÿ thuât Hung Yên
chào mung ban dên voi java
Dai hoc su pham kÿ thuât Hung Yên
chào mung ban dên voi java
Dai hoc su pham kÿ thuât Hung Yên
chào mung ban dên voi java
chào mung ban dên voi java
…………...
Trang 101
2. Vòng dòi cua Thread
Hình sau thê hiên trang thái cua tuyên trong vòng doi cua chúng
3. Luông chay ngâm (deamon)
Môt chuong trình Java kêt thúc chi sau khi tât ca các luông thuc thi xong. Trong
Java có hai loai luông:
- Luông nguoi su dung
- Luông chay ngâm (deamon)
Nguoi su dung tao ra các luông nguoi su dung, trong khi các luông deamon là các
luông chay nên. Luông deamon cung câp các dich vu cho các luông khác. Máy ao Java
thuc hiên tiên trình thoát, khi dó chi còn duy nhât luông deamon vân còn sông. Máy ao
Java có ít nhât môt luông deamon là luông “garbage collection” (thu luom tài nguyên -
don rác). Luông don rác thuc thi chi khi hê thông không có tác vu nào. Nó là môt luông có
quyên uu tiên thâp. Lop luông có hai phuong thuc dê làm viêc voi luông deamon:
- public void setDaemon(boolean on)
- public boolean isDaemon()
4. Giao diên Runnable
O muc truoc ban dã tao ra các luông thuc hiên song song voi nhau, trong java ta
còn có thê tao ra các tuyên thi hành song song báng cách triên khai giao diên Runnable.
Chác ban së tu hoi, dã có lop Thread rôi tai sao lai còn có giao diên Runnable nua, chúng
khác gì nhau?, câu tra loi o chô, java không hô tro kê thua bôi, nêu chuong trình cua ban
vua muôn kê thua tu môt lop nào dó, lai vua muôn da tuyên thì ban bát buôc phai dùng
giao diên Runnable, cháng han nhu ban viêt các Applet, ban vua muôn nó là Applet, lai
vua muôn thuc thi nhiêu tuyên, thì ban vua phai kê thua tu lop Applet, nhung nêu dã kê
thua tu lop Applet rôi, thì ban không thê kê thua tu lop Thread nua.
Ta viêt lai ví du trên, nhung lân này ta không kê thua lop Thread, mà ta triên khai
giao diên Runnable
public class Hello{
public static void main ( String[] args ){
Thread t = new Thread ( new ChaoDH () );
t.start ();
Thread t1 = new Thread ( new ChaoJV () );
t1.start ();
}
Trang 102
}
class ChaoDH implements Runnable{
public void run (){
ChaoDH thu = new ChaoDH ();
for ( int i = 1; i <= 200; i++ ) {
System.out.println("Ðai hoc su pham kÿ thuât Hung Yên");
}
}
}
class ChaoJV implements Runnable{
public void run (){
for ( int i = 1; i <= 200; i++ ) {
System.out.println ( "chào mùng ban dên vói java" );
}
}
}
Cho chay ví du này ta thây kêt qua ra không khác gì voi ví du truoc.
5. Thiêt lâp dô uu tiên cho tuyên
Khi môt tuyên duoc tao ra, nó nhân môt dô uu tiên mác dinh, dôi khi ta muôn diêu
chinh dô uu tiên cua tuyên dê dat duoc muc dích cua ta, thât don gian, dê dát dô uu tiên
cho môt tuyên ta chi cân goi phuong thuc setPriority() và truyên cho nó môt sô nguyên sô
này chính là dô uu tiên mà ban cân dát.
Ta viêt lai ví du trên nhu sau: Thêm vào phuong thuc main() 2 dòng lênh:
t.setPriority(1); //Tuyên này có dô uu tiên là 1
t1.setPriority(10); // Tuyên này có dô uu tiên là 1
Chay lai chuong trình này sau khi sua và truoc khi sua ta thây tuyên t1 duoc câp thoi gian
su dung CPU nhiêu hon tuyên t, lý do là ta dã dát dô uu tiên cua tuyên t1, lon hon dô uu
tiên cua tuyên t
Chú ý:
1. dô uu tiên cua môt tuyên biêu thi boi môt sô nguyên nám trong doan tu 1 dên 10,
môt lôi së phát sinh nêu ta gán cho nó dô uu tiên, nám ngoài khoang này
2. 2) nêu môt tuyên không duoc dát dô uu tiên thì nó së nhân dô uu tiên mác dinh
( báng 5 ), ta có thê kiêm tra diêu này báng cách goi phuong thuc getPriority()
6. Nhóm tuyên (Thread Group)
- Nhóm tuyên là môt tâp hop gôm nhiêu tuyên, khi ta tác dông dên nhóm tuyên ( cháng
han nhu tam ngung, …) thì tât ca các tuyên trong nhóm dêu nhân duoc cùng tác dông
dó, diêu này là tiên loi khi ta muôn quan lý nhiêu tuyên thuc hiên các tác vu tuong tu
nhau.
Ø Dê tao môt nhóm tuyên ta cân:
+ tao ra môt nhóm tuyên báng cách su dung phuong thuc tao dung cua lop
ThreadGroup()
ThreadGroup g=new ThreadGroup(“ThreadGroupName”);
ThreadGroup g=
new ThreadGroup(ParentThreadGroup,“ThreadGroupName”);
Dòng lênh trên tao ra môt nhóm tuyên g có tên là “ThreadGroupName”, tên cua tuyên
là môt chuôi và không trùng voi tên cua môt nhóm khác.
+ dua các tuyên vào nhóm tuyên dùng phuong thuc tao dung cua lop Thread() :
Thread =new Thread (g, new ThreadClass(),”ThisThread”);
Trang 103
7. Dông bô các tuyên thi hành
Khi nhiêu tuyên truy câp dông thoi vào tài nguyên dùng chung, mà tài nguyên này
lai không thê chia se, cho nhiêu tuyên, khi dó tài nguyên dùng chung có thê bi hong. Ví
du, môt luông có thê cô gáng doc du liêu, trong khi luông khác cô gáng thay dôi du liêu.
Trong truong hop này, du liêu có thê bi sai.
Trong nhung truong hop này, ban cân cho phép môt luông hoàn thành tron ven tác
vu cua nó, và rôi thì moi cho phép các luông kê tiêp thuc thi. Khi hai hoác nhiêu hon môt
luông cân thâm nhâp dên môt tài nguyên duoc chia se, ban cân chác chán ráng tài nguyên
dó së duoc su dung chi boi môt luông tai môt thoi diêm.
Boi trong java không có biên toàn cuc, chúng ta chi có thuôc tính cua dôi tuong, tât
ca các thao tác có thê dân dên hong hóc dêu thuc hiên qua phuong thuc, do vây java cung
câp tu khoá synchronized, tu khoá này duoc thêm vào dinh nghia cua phuong thuc báo
cho java biêt dây là môt phuong thuc dông bô, môi dôi tuong së có môt bô quan lý khoá,
bô quan lý khoá này chi cho 1 phuong thuc synchronized cua dôi tuong dó chay tai môt
thoi diêm
Mâu chôt cua su dông bô hóa là khái niêm “monitor” (giám sát), hay còn goi
“semaphore” (co hiêu). Môt “monitor” là môt dôi tuong mà duoc khóa dôc quyên. Chi
môt luông có thê có monitor tai môi thoi diêm. Tât ca các luông khác cô gáng thâm nhâp
vào monitor së bi trì hoãn, cho dên khi luông dâu tiên thoát khoi monitor. Các luông khác
duoc báo cho doi monitor. Môt luông có thê monitor môt dôi tuong nhiêu lân.
Trang 104
Chuong 5: NHAP XUÁT (Input/Output)
Môt chuong trình thuong xuyên làm viêc voi du liêu, dê có thê luu tru lâu dài chúng ta
phai luu tru và nhân lai du liêu tu thiêt bi luu tru ngoài, nguôn thông tin ngoài không chi
gôm du liêu duoc luu tru trên dia tu, dia CD mà nó có thê là du liêu cua môt chuong trình
khác, hoác có thê là duoc luu tru trên mang… dù chúng duoc luu tru o dâu chúng cung
chi có 1 sô dang nhu: dôi tuong, kí tu, hình anh hoác âm thanh, dù du liêu duoc luu tru
duoi hình thuc nào, luu tru o dâu thì java dêu truu tuong hoá thành các luông, diêu này là
rât tinh vi nó làm cho ta không cân phai quan tâm du liêu duoc luu tru o dâu, duoi dang
thuc nhu thê nào, nó dông nhât moi nguôn du liêu voi nhau:
Dê nhân vê các thông tin, môt chuong trình mo môt luông liên kêt voi dôi tuong nguôn(
têp tin, bô nho, Socket) và doc các thông tin tuân tu.
Tuong tu dê ghi thông tin ra các thiêt bi ngoài báng cách mo môt luông dên dôi tuong dích
và ghi thông tin ra môt cách tuân tu nhu
Luông là su truu tuong hoá o muc cao, do vây bât kê du liêu duoc doc vào tu dâu hoác ghi
ra dâu, thì thuât toán doc/ghi tuân tu dêu tua nhu sau:
Trang 105
I. Lóp luông
Java dua ra nhiêu lop luông, dê xu lý moi loai du liêu, java chia luông ra thanh 2 loai:
luông byte ( byte stream) và luông kí tu (character stream), lop InputStream và
OutputStream là hai lop co so cho moi luông nhâp xuât huong byte, và lop Reader/ Writer
là hai lop co so cho viêc doc ghi huong kí tu.
Lop RandomAccessFile kê thua tu lop Object và triên khai giao diên, InputStream và
OutputStream, dây là lop duy nhât hô tro ca doc lân ghi.
1.1. Lóp nhâp, xuât huóng kí tu
Reader và Writer là hai lop co so truu tuong cho luông huong kí tu, hai lop này cung câp
môt giao diên chung cho tât ca các lop doc/ ghi huong kí tu, môi lân doc/ ghi ra luông là
doc 2 byte tuong ung voi môt kí tu unicode, Sau day là mô hình phân câp các lop doc/ ghi
huong kí tu
1.2. Luông huóng byte
Dê có thê doc ghi 1 byte, ta phai su dung luông huong byte, hai lop InputStream và
OutputStream là hai lop co so truu tuong cho các luông huong byte, môi lân doc/ ghi ra
luông là doc/ ghi 8 bit du liêu ra luông, Hình sau thê hiên môi quan hê phân câp giua lop
doc/ ghi huong byte
Trang 106
Su tuong tu giua hai luông huong byte và huong kí tu
Lop Reader và InputStream có môt giao diên giông nhau, chúng chi khác nhau vê kiêu du
liêu doc vào, ví du lop Reader có các phuong thuc sau giúp cho viêc doc môt kí tu hoác
môt mang các kí tu
int read()
int read(char cbuf[])
int read(char cbuf[], int offset, int length)
Thì trong lop InputStream cung có các phuong thuc voi tên tuong tu cho viêc doc
môt byte hoác môt mang các byte
int read()
int read(byte cbuf[])
int read(byte cbuf[], int offset, int length)
Cung tuong tu vây lop Writer và OutputStream cung có môt giao diên tuong tu
nhau, ví du lop Writer dinh nghia các phuong thuc dê ghi môt kí tu, môt mang các kí tu ra
luông
int write(int c)
int write(char cbuf[])
int write(char cbuf[], int offset, int length)
Thì lop OutputStream cung có các phuong thuc tuong ung, dê ghi môt byte, môt
mang byte ra luông
int write(int c)
int write(byte cbuf[])
int write(byte cbuf[], int offset, int length)
Xu lý têp tin
Dê xu lý têp tin ngoai trú, ta su dung các luông liên quan dên têp tin nhu
FileInputStream và FileOutputStream cho viêc doc ghi têp huong byte, FileReader và
FileWriter cho viêc doc ghi huong kí tu, thông thuong muôn su dung luông têp tin ta su
dung hàm tao cua các lop tuong ung dê liên kêt luông voi môt têp tin cu thê.
Trang 107
public void FileInputStream ( String FileName)
public void FileInputStream ( File file)
public void FileOutputStream ( String FileName)
public void FileOutputStream (File file)
public void FileWriter ( String FileName)
public void FileWriter (File file)
public void FileReader ( String FileName)
public void FileReader (File file)
Ví du: Viêt chuong trình file copy, thuc hiên viêc copy môt têp, ta së viêt chuong trình này
su dung ca 2 luông huong byte và huong kí tu
import java.io.*;
// chuong trình copy sú dung luông huóng kí tu
public class CopyCharacter {
public static void main(String[] args) throws IOException {
File inputFile = new File("C:/in.txt");
File outputFile = new File("C:/out.txt");
FileReader in = new FileReader(inputFile);
FileWriter out = new FileWriter(outputFile);
int c;
while ((c = in.read())! = -1) out.write(c);
in.close();
out.close();
}
}
import java.io.*; // Chuong trình copy sú dung luông huóng byte
public class CopyBytes {
public static void main(String[] args) throws IOException {
File inputFile = new File("farrago.txt");
File outputFile = new File("outagain.txt");
FileInputStream in = new FileInputStream(inputFile);
FileOutputStream out = new FileOutputStream(outputFile);
int c;
while ((c = in.read())! = -1) out.write(c);
in.close();
out.close();
}
}
Luông dû liêu
Dê doc/ ghi các kiêu du liêu nguyên thuy, ta su dung luông DataInputStream và
DataOutputStream, lop DataInputStream triên khai giao diên DataInput, còn lop
DataOutputStream triên khai giao diên DataOuput
Các phuong thuc sau duoc dinh nghia trong giao diên DataOutput
void write(byte[] b) Ghi môt mang byte ra luông
void write(byte[] b, int off, int len) Ghi môt mang byte ra luông kê tu vi trí off,
Trang 108
len byte
void write(int b) Ghi môt byte ra luông
void writeBoolean(boolean v) Ghi môt giá tri logic ra luông
void writeByte(int v) Ghi ra luông phân thâp cua v
void writeBytes(String s) Ghi môt xâu ra luông
void writeChar(int v) Ghi môt kí tu ra luông
void writeChars(String s) Ghi môt xâu kí tu ra luông
void writeDouble(double v) Ghi môt sô double ra luông
void writeFloat(float v) Ghi môt sô thuc ra luông
void writeInt(int v) Ghi môt sô nguyên ra luông
void writeLong(long v) Ghi môt sô long ra luông
void writeShort(int v) Ghi môt sô short ra luông
void writeUTF(String str) Chi môt xâu kí tu Unicode ra luông
Các phuong thúc sau duoc dinh nghîa trong giao diên DataInput:
boolean readBoolean() doc môt giá tri logic tu luông
byte readByte() doc môt byte tu luông
char readChar() doc môt kí tu tu luông
double readDouble() doc môt sô double tu luông
float readFloat() doc môt sô float tu luông
void readFully(byte[] b) doc môt mang byte tu luông và ghi vào
mang
voidreadFully(byte[] b, int off, int len) doc len byte tu luông và ghi vào mang
tu vi trí off
int readInt() doc môt sô nguyên
String readLine() doc môt xâu kí tu cho dên khi gáp kí tu
xuông dòng và bo qua kí tu xuông dòng
long readLong() doc môt sô long
short readShort() doc môt sô short
int readUnsignedByte() doc môt sô nguyên không dâu trong
khoang 0..255
in treadUnsignedShort() doc môt sô nguyên không dâu trong
doan tu 0..65535
String readUTF() doc môt xâu kí tu Unicode
int skipBytes(int n) Bo qua n byte tu luông
Sau dây là môt ví du nho vê luông nhâp xuât du liêu, ví du này ghi du liêu ra têp rôi lai doc
lai:
import java.io.*;
public class DataIODemo {
public static void main(String[] args) throws IOException {
// write the data out
DataOutputStream out = new DataOutputStream(new FileOutputStream("c:/TestIO.txt"));
out.writeInt(10); // ghi sô nguyên
out.writeLong(123456789); // ghi sô long
Trang 109
out.writeDouble(123.456789); // ghi sô thuc chính xác kép
out.writeFloat(123.456789f); // ghi sô thuc chính xác don
out.writeBoolean(true); // ghi giá tri logic
out.writeUTF("Day la mot xau ki tu"); // ghi môt xâu
out.close();
// read it in again
DataInputStream in = new DataInputStream(new
FileInputStream("c:/TestIO.txt"));
try {
System.out.println("Gia tri nguyen " + in.readInt()); // doc lai sô nguyên
System.out.println("Gia tri long " + in.readLong()); // doc lai sô nguyên dài
System.out.println("Gia tri double " + in.readDouble());// doc lai sô thuc chính xác kép
System.out.println("Gia tri float " + in.readFloat()); // doc lai sô thuc chính xác don
System.out.println("Gia tri boolean " + in.readBoolean()); // doc lai giá tri logic
System.out.println("Gia tri xau " + in.readUTF()); // doc lai môt xâu unicode
}
catch (EOFException e) { System.out.println("loi");}
in.close();
}
}
1.3. Luông in ân
Vì các luông xuât ghi du liêu ra duoi dang nhi phân do vây ban không thê dùng lênh
type, hoác các chuong trình soan thao asciii dê xem duoc, trong java có thê su dung luông
in ân dê xuât du liêu ra duoi dang asciii. Lop PrintStream và PrintWriter së giúp ta làm viêc
này. Hai lop này thuc hiên chuc náng nhu nhau, dêu xuât ra du liêu dang asciii.
Mot so phuong thuc cua lop PrintStream:
boolean checkError() dôn hêt du liêu ra và kiêm tra lôi luông
void close() dóng luông
void flush() dôn du liêu trong vùng dêm ra
void print(boolean b) ghi giá tri logic ra luông
void print(char c) ghi kí tu
void print(char[] s) ghi môt mange kí tu
void print(double d) ghi môt sô thuc dô chính xác kép
void print(float f) ghi môt sô thuc
void print(int i) ghi môt sô nguyên
void print(long l) ghi môt sô nguyên dài
void print(Object obj) ghi môt dôi tuong
void print(String s) ghi môt xâu
void println() tao ra môt dòng trông
void println(boolean x) ghi giá tri logic ra luông và xuông dòng
void println(char x) ghi kí tu và xuông dòng
Trang 110
void println(char[] x) ghi môt mange kí tu và xuông dòng
void println(double x) ghi môt sô thuc dô chính xác kép và xuông dòng
void println(float x) ghi môt sô thuc và xuông dòng
void println(int x) ghi môt sô nguyên và xuông dòng
void println(long x) ghi môt sô nguyên dài và xuông dòng
void println(Object x) ghi môt dôi tuong và xuông dòng
void println(String x) ghi môt xâu và xuông dòng
protected void setError() dát trang thái lôi cua luông là true
void write(byte[] buf, int off, int
len)
ghi mang byte tu vi trí off len kí byte ra luông
void write(int b) ghi môt byte ra luông
Hàm tao cua lóp PrintStream:
PrintStream(OutputStream out) tao ra môt luông moi
PrintStream(OutputStream out, boolean autoFlush) tao ra môt luông moi voi chuc náng
AutoFlush ( tu dôn)
Môt sô phuong thuc cua lop PrintWriter
boolean checkError() dôn hêt du liêu ra và kiêm tra lôi luông
void close() dóng luông
void flush() dôn du liêu trong vùng dêm ra
void print(boolean b) ghi giá tri logic ra luông
void print(char c) ghi kí tu
void print(char[] s) ghi môt mange kí tu
void print(double d) ghi môt sô thuc dô chính xác kép
void print(float f) ghi môt sô thuc
void print(int i) ghi môt sô nguyên
void print(long l) ghi môt sô nguyên dài
void print(Object obj) ghi môt dôi tuong
void print(String s) ghi môt xâu
void println() tao ra môt dòng trông
void println(boolean x) ghi giá tri logic ra luông và xuông dòng
void println(char x) ghi kí tu và xuông dòng
void println(char[] x) ghi môt mange kí tu và xuông dòng
void println(double x) ghi môt sô thuc dô chính xác kép và xuông dòng
void println(float x) ghi môt sô thuc và xuông dòng
void println(int x) ghi môt sô nguyên và xuông dòng
Trang 111
void println(long x) ghi môt sô nguyên dài và xuông dòng
void println(Object x) ghi môt dôi tuong và xuông dòng
void println(String x) ghi môt xâu và xuông dòng
protected void setError() dát trang thái lôi cua luông là true
void write(byte[] buf, int off, int
len)
ghi mang byte tu vi trí off len kí byte ra luông
void write(int b) ghi môt byte ra luông
void write(int c) Ghi môt kí tu don
void write(String s) Ghi môt xâu
void write(String s, int off, int len) Ghi môt xâu len kí tu tính tu vi trí off
Các hàm tao cua lóp PrintWriter
- PrintWriter(OutputStream out) tao ra môt PrintWriter không có chuc náng tu dôn tu môt
dôi tuong OutputStream.
- PrintWriter(OutputStream out, boolean autoFlush) tao ra môt PrintWriter voi chuc náng
tu dôn tu môt dôi tuong OutputStrea.
- PrintWriter(Writer out) tao ra môt PrintWriter không có chuc náng tu dôn tu môt dôi
tuong Writer
- PrintWriter(Writer out, boolean autoFlush) tao ra môt PrintWriter voi chuc náng tu dôn tu
môt dôi tuong Writer
Sau dây là môt ví du vê luông in ân, ví du này in ra môt têp môt sô nguyên, môt sô
thuc và môt xâu kí tu, sau khi chay chuong trình ban có thê su dung lênh type cua DOS dê
xem
import java.io.*;
public class DataIODemo1 {
public static void main(String[] args) throws IOException {
// write the data out
PrintWriter out = new PrintWriter(new FileOutputStream("c:/a.txt"));
out.println(10);
out.println(1.2345);
out.print("xau ki tu");
out.close();
}
}
1.4. Luông dêm
Vì các thao tác voi ô cung, mang thuong lâu hon rât nhiêu so các thao tác voi bô nho
trong, do vây chúng ta cân phai có môt kÿ thuât nào dó dê táng tôc dô doc/ghi, kÿ thuât dó
chính là vùng dêm, voi vùng dêm ta së giam duoc sô lân doc ghi luông, trong java ta có thê
tao ra vùng dêm voi các lop
BufferInputStream, BufferOutputStream, BufferReader, BufferWriter, thông thuong ban së
nôi các luông cua ban vào luông dêm.
Trang 112
Các phuong thuc tao dung luông dêm:
public BufferInputStream( InputStream )
public BufferInputStream (InputStream in, int bufferSize)
public BufferOutputStream ( OutputStream out)
public BufferOutputStream ( OutputStream out, int bufferSize)
public BufferReader ( Reader in)
public BufferReader ( Reader in, int bufferSize)
public BufferWriter ( Writer out)
public BufferWriter ( Writer out, int bufferSize)
1êp tin truy câp ngâu nhiên
Tât ca các luông xét trên chi có thê doc, hoác ghi, chúng không thê doc ghi dông
thoi, chi duy nhât có môt lop cho phép ta doc ghi dông thoi, dó là lop RandomAccessFile,
lop này triên khai giao diên InputData và OutputData, nên chúng có tât ca các phuong thuc
cua ca 2 lop này, ngoài ra chúng còn có các phuong thuc sau:
- public void seek(long pos) chuyên con tro dên vi trí pos tính tu vi trí dâu tiên, chú ý vi trí
dâu tiên tính tu 0
- public long getFilePointer() tra vê vi trí con tro têp tính báng byte, kê ta dâu têp
- public long length() tra vê dô dài cua têp
- public void writeChar(int v) ghi kí tu unicode ra têp voi byte cao duoc ghi truoc
- public final void writeChars(String s) ghi môt xâu kí tu ra têp
Tuong tu giông C/C++ khi ban mo môt têp truy câp ngâu nhiên ban phai chi rõ chê dô làm
viêc là doc ‘r’, hay ghi ‘w’ hay doc ghi dông thoi ‘rw’, ví du nhu ban muôn mo têp a.txt
theo chê dô doc ghi dông thoi thì ban dùng cú pháp RandomAccessFile =new
RandomAccessFile(“C:/ a.txt”, “rw”)
Chuong trình duoi dây minh hoa cách dùng lop RandomAccessFile. Nó ghi môt giá
tri boolean, môt int, môt char, môt double toi môt file có tên ‘abc.txt’. Nó su dung phuong
pháp seek( ) dê tìm vi trí dinh vi bên trong tâp tin (bát dâu tu 1). Sau dó nó doc giá tri sô
nguyên, ký tu và double tu tâp tin và hiên thi chúng ra màn hình.
import java.lang.System;
import java.io.RandomAccessFile;
import java.io.IOException;
public class rndexam{
public static void main (String args[ ]) throws IOException {
RandomAccessFile rf;
rf = new RandomAccessFile("abc.txt¨, "rw¨);
rf.writeBoolean(true);
rf.writeInt(67868);
rf.writeChars("J¨);
rf.writeDouble(678.68);
//Sú dung phuong thúc seek() dê di chuyên con tró dên byte thú hai
rf.seek(1);
System.out.println(rf.readInt());
System.out.println(rf.readChar());
System.out.println(rf.readDouble());
Trang 113
rf.seek(0);
System.out.println(rf.readBoolean));
rf.close();
}
}
Kêt qua xuât ra cua chuong trình:
II. Lóp File
Lop File cung câp giao diên chung dê xu lý hê thông têp dôc lâp voi môi truong cua
các máy tính. Môt ung dung có thê su dung các chuc náng chính cua File dê xu lý têp hoàc
các thu muc (directory) trong hê thong têp. Dê xu lý các nôi dung cua các têp thì su dung
các lop FileInputStream, FileOutputStream và RandomAccessFile.
Lop File dinh nghia các thuôc tính phu thuôc vào môi truong (platform) duoc su dung dê xu lý
têp và tên goi các duong dân trong các thu muc môt cách dôc lâp voi môi truong.
public static final char separatorChar
public static final String separator
Dinh nghia các ký hiêu hoác các xâu su dung dê ngán cách các thành phân trong tên
cua duong dân. Ký hiêu ‘/’ dê ngán cách cho Unix, ‘\’ duoc su dung dê ngán cách các
muc cua duong dân trong Window.
Ví du: C:\book\Java là tên duong dân trong Window.
public static final char pathSeparatorChar
public static final String pathSeparator
Dinh nghia các ký hiêu hoác các xâu su dung dê ngán cách các têp hoác tên thu muc
trong danh sách cua các duong dân. Ký hiêu ngán cách ‘:’ cho Unix, ‘;’ duoc su dung
dê phân cách các duong dân trong Window.
Ví du: C:\book; C:\Java; D:\Anh\ABC; A:\Docs là danh sách các duong dân trong Window.
File(String pathName)
Gán duong dân có tên pathName cho dôi tuong cua lop File. pathName có thê là
duong dân tuyêt dôi (có du ca tên ô dia, tên cua tât ca các muc lân luot theo cây thu
muc) hoác duong dân tuong doi (bát dau tu thu muc hiên thoi).
Ví du:
File ch1 = new File(File.separator + “book” + File.separator + “chuong1”);
File(File direct, String filename)
Trang 114
Gán têp có tên filename o thu muc direct cho dôi tuong cua lop File. Nêu direct là
null thì filename duoc xu lý o thu muc hiên thoi, nguoc lai tên duong dân së là dôi
tuong direct ghép voi separator và filename.
Ví du:
File mucNhap = new File(“book” + File.separator + “duThao”);
File ch2 = new File(mucNhap, “chuong1”);
Lop File có thê su dung dê truy vân vào các hê thông têp dê biêt duoc các thông tin vê têp
và các thu muc.
Lop File cung câp các hàm dê nhân duoc các biêu diên phu thuôc vào môi truong cua
duong dân và các thành phân cua duong dân.
String getName()
Hàm getName() cho lai tên cua têp trong thu muc chi dinh. Ví du, tên cua
“C:\java\bin\javac” là “javac”.
St r i ng get Pat h( )
Hàm getPath() cho lai tên cua duong dân (tuyêt dôi hoác tuong dôi) chua têp chi dinh.
String getAbsolutePath()
Hàm getAbsolutePath() cho lai tên cua duong dân tuyêt dôi chua têp chi dinh.
long lastModified()
Hàm này cho lai thoi gian dang sô long cua lân sua dôi têp lân cuôi cùng.
long length()
Hàm này cho lai kích thuoc cua têp tính theo byte.
boolean equals(Object obj)
Hàm này so sánh tên các duong dân cua các dôi tuong têp, cho kêt qua true nêu
chúng dông nhât voi nhau.
boolean exists()
boolean isFile()
Hai hàm này cho kêt qua true nêu têp dó tôn tai trên duong dân hiên thoi.
boolean isDirectory()
Hàm này cho kêt qua true nêu thu muc dó tôn tai trên ô dia hiên thoi.
boolean createNewFile() throws IOException
Môt têp moi là rông duoc tao ra o thu muc hiên thoi chi khi têp này chua có.
boolean mkdir()
boolean mkdirs()
Tao ra các duong dân duoc xác dinh trong dôi tuong cua File.
boolean renameTo(File dest)
Hàm này dôi tên têp hiên thoi thành dest.
String[] list()
Hàm này hiên thi danh sách các têp o thu muc hiên thoi.
boolean delete()
Hàm này xoá têp hiên thoi.
Ví du 8.1 Viêt chuong trình dê doc và hiên thi các têp trong môt thu muc.
import java.io.*;
public class DirectoryLister{
public static void main(String args[]){
File entry;
if (args.length==0){
Trang 115
System.err.println("Hay cho biet ten duong dan?");
return;
}
entry = new File(args[0]); // Tao ra dôi tuong cúa File lây tên tù agrs[0]
listDirectory(entry); // Hiên thi các muc trong danh muc chi dinh
}
public static void listDirectory(File entry) {
try {
if(!entry.exists()) {
System.out.println(entry.getName() +"not found.");
return;
}
if (entry.isFile()){
// Nêu dôi sô cúa chuong trình là môt têp thì hiên thi têp dó
System.out.println(entry.getCanonicalPath());
} else if(entry.isDirectory()){
// Nêu dôi sô cúa chuong trình là môt danh muc thì doc ra (list())
String[] fileName = entry.list();
if (fileName ==null)return;
for (int i = 0; i<fileName.length; i++){
// Tao ra dôi tuong cúa File dê xú lý tùng muc
File item = new File(entry.getPath(), fileName[i]);
// Goi dê qui hàm listDirectory()dê hiên thi tùng têp.
listDirectory(item);
}
}
}catch(IOException e){System.out.println("Error:" +e);
}
}
}
Dich xong có thê chay trong môi truong DOS:
java DirectoryLister c:\users\lan
Tât ca các têp trong danh muc c:\users\lan së duoc hiên lên.
Môt sô ví du úng dung
Ví du 1:Ví du minh hoa viêc nhâp dû liêu tù bàn phím
package app001;
import java.lang.*;
import java.io.*;
import java.util.*;
public class InputOutput
{ public static void main(String srgs[]) throws IOException
{ BufferedReader kInput=new BufferedReader(new InputStreamReader(System.in));
String ten,nam;
do {
System.out.print("Nhap ho va ten:");ten=kInput.readLine();
System.out.print("Nhap nam sinh:");nam=kInput.readLine();
Trang 116
}while ((ten==null)||(nam==null));
kInput.close();
int ns=Integer.parseInt(nam);
System.out.println("Ho ten ban vua nhap ="+ten);
System.out.println("Nam sinh ban vua nhap ="+ns);
}
}
Ví du 2 Xây dung gói nhâp dû liêu cho riêng mình
package app002;
import java.io.*;
import java.util.*;
public class MyInput{
static private StringTokenizer stok;
static private BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
public static int readInt(){
int i = 0;
try{ String str = br.readLine();
stok = new StringTokenizer(str);
i = new Integer(stok.nextToken()).intValue();
}
catch (IOException ex){
System.out.println(ex);
}
return i;
}
public static double readDouble(){
double d = 0;
try{
String str = br.readLine();
stok = new StringTokenizer(str);
d = new Double(stok.nextToken()).doubleValue();
}
catch (IOException ex){
System.out.println(ex);
}
return d;
}
public static String readString(){
String S=" ";
try{ S = br.readLine();}
catch (IOException ex){
System.out.println(ex);
}
return S;
}
}
Trang 117
Ví du 3 Su dung gói nhâp dû liêu trong chuong trình Java
import app002.MyInput;
public class TestInput{
public static void main(String[] args){
System.out.print("Enter an integer: ");
int i = MyInput.readInt();
System.out.println("\nYou entered i = " + i);
System.out.print("Enter a double: ");
double d = MyInput.readDouble();
System.out.println("\nYou entered d = " + d);
System.out.print("Enter a String: ");
String SS=MyInput.readString();
System.out.println("\nYou entered S = " + SS);
}
}
Ví du 4. Minh hoa viêc doc, ghi file Text
package app001;
import java.lang.*;
import java.io.*;
import java.util.*;
import app001.*;
public class IOFile {
public static void main(String args[]) throws IOException
{ BufferedReader FileInput=new BufferedReader(new FileReader("C:\\filein.txt"));
PrintWriter FileOut=new PrintWriter(new BufferedWriter(new
FileWriter("C:\\fileout.txt")));
String ten=" ",nam="345";
long n=0;
while (FileInput.ready()==true) //==While (not eof())
{ ten = FileInput.readLine();
nam = FileInput.readLine();
System.out.println("Ho ten=" + ten);
System.out.println("nam sinh=" + nam);
}
FileInput.close();
int ns = Integer.parseInt(nam);
FileOut.println(ten);
FileOut.println(nam);
FileOut.close();
Man ng1=new Man(ten,ns);
ng1.hienthi();
ng1.HienThiNgay();
}
}
Ví du 5: Minh hoa su dung luông
Trang 118
package app002;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.File;
import java.io.IOException;
public class FileIOExam0 {
public static void main(String args[]) throws IOException
{String s="Welcome to File Input Output Stream...";
//Mo file abc.txt de doc
FileOutputStream os=new FileOutputStream("C:\\abc.txt");
for(int i=0;i<s.length();i++) os.write(s.charAt(i)); //Ghi tung byte
os.close(); //Dong file abc.txt
//Mo file abc.txt de doc
FileInputStream is=new FileInputStream("C:\\abc.txt");
int ibyts=is.available(); //Lay so byte cua file abc.txt
byte ibuf[]=new byte[ibyts]; //Khai bao dung bo dem du lieu
int byrd=is.read(ibuf,0,ibyts); //Doc ibyts du lieu ra luong
System.out.println("They are:"+new String(ibuf));//Du lieu trong file
System.out.println("Input Stream has:" + ibyts+" available bytes");
System.out.println("Number of Bytes read are:"+byrd);
is.close();
//Xoa file abc.txt
// File f1=new File("c:\\abc.txt");
// f1.delete();
}
}
Ví d 6: Sú dung file ngâu nhiên
package welcome;
import java.lang.System;
import java.io.RandomAccessFile;
import java.io.IOException;
public class RandomAaccessFile0
{
public static void main(String args[]) throws IOException
{ RandomAccessFile rf=new RandomAccessFile("c:\\abcd.txt","rw");
rf.writeBoolean(true);
rf.writeInt(2345);
rf.writeChars("A");
rf.writeDouble(456.78);
// int a[10]={2,4,6,9,1,5,8,0,12,90};
int A[]=new int[10] ;
A[0]=2;A[1]=1;A[2]=9;A[3]=7;A[4]=8;A[5]=3;A[6]=4;A[7]=5;A[8]=12;A[9]=21;
for(int i=0;i<10;i++)
rf.writeInt(A[i]);
rf.seek(0);
System.out.println(rf.readBoolean());
System.out.println(rf.readInt());
Trang 119
System.out.println(rf.readChar());
System.out.println(rf.readDouble());
for(int i=0;i<10;i++) System.out.println(rf.readInt());
rf.close();
}
}
Trang 120
Chuong 6: LAP TRÌNH DO HOA AWT
Môt kha náng cua Java là cho phép ta xây dung các ung dung có giao diên dô hoa
hay còn goi là GUI (Grapthical User Interface). Khi Java duoc phát hành, các thành phân
dô hoa duoc tâp trung vào thu viên mang tên Abstract Window Toolkit (AWT). Dôi voi
môi hê nên, thành phân AWT së duoc ánh xa sang môt thành phân nên cu thê, báng cách su
dung truc tiêp mã native cua hê nên, chính vì vây nó phu thuôc rât nhiêu vào hê nên và nó
còn gây lôi trên môt sô hê nên. Voi ban phát hành Java 2, các thành phân giao diên duoc
thay báng tâp hop các thành phân linh hoat, da náng, manh më, dôc lâp voi hê nên thuôc
thu viên Swing. Phân lon các thành phân trong thu viên Swing dêu duoc tô vë truoc tiêp
trên canvas báng mã lênh cua Java, ngoai tru các thành phân là lop con cua lop
java.awt.Window hoác Java.awt.Panel vôn phai duoc vë báng GUI trên nên cu thê. Thành
phân Swing ít phu thuôc vào hê nên hon do vây ít gáp lôi hon và dác biêt nó su dung ít tài
nguyên cua hê thông hon các thành phân trong thu viên awt. Mác dù các thành phân awt
vân duoc hô tro trong Java 2 nhung, tuy nhiên Sun khuyên ban nên su dung các thành phân
Swing thay cho các thành phân awt, tuy nhiên các thành phân trong thu viên Swing không
thê thay tât ca các thành phân trong thu viên awt. Chúng chi thay thê môt phân cua awt
nhu: Button, Panel, TextFeild, v.v. Còn các lop tro giúp khác trong awt nhu : Graphics,
Color, Font, FontMetrics, v.v. vân không thay dôi. Bên canh dó các thành phân Swing còn
su dung mô hình su lý su kiên cua awt.
I. Giói thiêu vê hê thông dô hoa cua Java
1. Giói thiêu chung
Thiêt kê API cho lâp trình dô hoa cua Java là môt ví du hoàn hao vê cách dùng lop, su
kê thua và giao diên. API cho lâp trình dô hoa bao gôm môt tâp rât nhiêu lop nhám tro giúp
xây dung các thành phân giao diên khác nhau nhu: cua sô,nút ân, ô ván ban, menu, hôp
kiêm, v.v. Môi quan hê kê thua giua các thành phân này duoc mô ta trong hình sau:
Componient Dây là lop (truu tuong) cha cua moi lop giao diên nguoi dùng. Lop này
cung câp các thuôc tính, hành vi co ban nhât cua tât ca các thành phân giao diên.
Container Là môt vât chua dùng dê ghép nhóm các thành phân giao diên khác. Môi
vât chua có môt lop quan lý hiên thi, lop quan lý hiên thi có trách nhiêm bô trí cách
thuc hiên thi các thành phân bên trong. Hai vât chua hay duoc su dung nhât la
JFrame và JPanel.
Jcomponient Là lop cha cua moi thành phân Swing ligth weight, duoc vë truc tiêp
lên canvas báng mã lênh Java.
Window Duoc su dung dê tao ra môt cua sô, Thông thuong ta hay su dung hai lop
con cua nó là JFrame và JDialog.
JFrame là cua sô không lông bên trong cua sô khác.
JDialog là môt cua sô duoc hiên thi duoi dang modal.
JAplet là lop cha cua moi lop ung dung aplet.
JPanel là môt vât chua, luu giu các thành phân giao diên nguoi dùng.
Graphics là lop truu tuong cung câp ngu canh dô hoa dê vë các dôi tuong dô hoa
nhu: Duong tháng, duong tròn, hình anh…
Trang 121
Color lop này biêu diên môt mâu sác.
Font lop này biêu thi cho môt font dô hoa.
FontMetrics là môt lop truu tuong dùng dê xác dinh các thuôc tính cua Font.
Tât ca các thành phân dô hoa trong thu viên Swing duoc nhóm trong gói javax.swing. Da
sô các thành phân trong thu viên Swing dêu có tiêp dâu ngu là ‘J’, Ví du môt nút lênh trong
thu viên Swing có tên là JButton, môt memu có tên là JMenu.
Tât ca nhung lop khác duoc liêt kê trong hình duoi dây
Chú ý: Dung pha trôn các thành phân giao diên swing và awt trong cùng môt ung dung.
Cháng han nhu dung nên dát môt JButton vào môt Panel và dung nên dát Button vào
JPanel. Viêc làm này có thê gây lôi.
Obj ect
A W T E v e n t
Font
Font Met ri c
Color
Grapt hi cs
Componi ent Cont ainer Panel Appl et
Window Fr ame
Di alog
JComponent
JAppl et
JFr ame
JDi alog
Các t hành phân
khác t rong gói
j avax. swing duoc kê
t hùa t ù JComponent
Layout Manage
r
BorderLayout
FlowLayout
GridLayout
CardLayout
GridBagLayout
Trang 122
Môt lop duoc kê thua tu lop JComponent duoc thê hiên trong hình sau:
2. Môt sô phuong thúc cua lóp Component
Lop Component cung câp các thuôc tính, phuong thuc chung cho các lop con cua
nó. Sau dây là môt sô phuong thuc cua lop Component :
- Dimension getSize(): cho lai dôi tuong thuôc lop Dimension gôm width (chiêu rông),
height (chiêu cao) xác dinh kích thuoc cua mot thành phan tính theo pixel.
- void setSize(int width, int height) và void setSize(Dimension d) dát lai kích thuoc cua
thành phân.
- Point getLocation(): cho lai toa dô (kiêu Point) trên cùng bên trái (toa dô gôc) cua thành
phân dang xét.
JComponent
JText Component
AbstracButton JMenuItem JCheckBoxMen
JtoggleButton
JMenu
JRadioMenu
JBut t on
JEditorPane
JTextField
JTextArea
JPasswordField
JTextPane
JCheckBox
JRadioButto
JLabel
JList
JCompoBox JMenuBar
JOptionPane JScrollBar JCcollPane
JFileChooser
JPopupMenu JSeparator JSlider
JTabbedPane
JRootPane JPane
JprogressBar
JToolBar
JSplitBar
JTable
JTree
JColorChooser
JInternalFrame
JToolTip JtableHeader JLayeredPane
Trang 123
- void setLocation(int x, int y) và void setLocation(Point p): dát lai các toa dô duoc chi
dinh cho môt thành phân.
- Rectangle getBounds(): cho lai duong biên là hình chu nhât Rectangle bao gôm toa dô
gôc và chiêu dài, chiêu rông cua hình chu nhât.
- void setBounds(int x, int y) và void setBounds(Rectangle r):dát lai duong biên cho môt
thành phân.
- void setForeground(Color c):duoc su dung dê dát màu vë cho thành phân dô hoa
- void setBackground(Color c):dàt màu nên cho thành phan do hoa. Các tham sô cua hai
hàm này là dôi tuong cua lop Color së duoc gioi thiêu o phân sau.
- Font getFont(): duoc su dung dê biêt duoc font cua các chu dang xu lý trong thành
phân dô hoa.
- void setFont(Font f):dát lai font chu cho môt thành phân.
- void setEnabled(boolean b):Nêu dôi sô b cua hàm getEnabled() là true thì thành phân
dang xét hoat dông bình thuong, nghia là có kha náng kích hoat (enable), có thê tra loi các
yêu câu cua nguoi su dung và sinh ra các su kiên nhu mong muôn. Nguoc lai, nêu là false
thì thành phân tuong ung së không kích hoat duoc, nghia là không thê tra loi duoc các yêu
câu cua nguoi su dung.
- Luu ý: Tât ca các thành phân giao diên khi khoi tao dêu duoc kích hoat
- void setVisible(boolean b):Môt thành phân dô hoa có thê duoc hiên thi lên màn hình
(nhìn thây duoc) hoác bi che giâu tùy thuôc vào dôi sô cua hàm setVisible() là true hay
false.
3. Lóp Container
Lop Container là lop con cua lop truu tuong Component. Các lop chua (lop con cua
Container) cung câp tât ca các chuc náng dê xây dung các giao diên dô hoa ung dung, trong
dó có phuong thuc add() duoc nap chông dùng dê bô sung môt thành phân vào vât chua và
phuong thuc remove() cung duoc nap chông dê gõ bo môt thành phân ra khoi vât chua.
4. Tao ra Frame
Lop JFrame là lop con cua lop Frame (Frame là lop con cua lop Window) duoc su
dung dê tao ra nhung cua sô cho các giao diên ung dung GUI.
Kich ban chung dê tao ra môt cua sô là:
- Tao ra môt frame có tiêu dê gì dó, ví du “My Frame” :
JFrame myWindow= new JFrame(“My Frame”);
- Xây dung môt câu trúc phân câp các thành phân báng cách su dung hàm
myWindow.getContentPane().add() dê bô sung thêm JPanel hoác nhung thành phân
giao diên khác vào Frame:
Ví du: myWindow.getContentPane().add(new JButton(“OK”));// Dua vào môt nút
(JButton) có tên “OK” vào frame
- Dát lai kích thuoc cho frame su dung hàm setSize():
myWindow.setSize(200, 300);// Dát lai khung frame là 200 ( 300
- Gói khung frame dó lai báng hàm pack():
myWindow.pack();
- Cho hiên frame:
myWindow.setVisible(true);
Trang 124
II. Trình quan lý hiên thi trong Java
Khi thiêt kê giao diên dô hoa cho môt ung dung, chúng ta phai quan tâm dên kích
thuoc và cách bô trí (layout) các thành phân giao diên nhu: JButton, JCheckbox,
JTextField, v.v. sao cho tiên loi nhat doi voi nguoi su dung. Java có các lop dam nhiêm
nhung công viêc trên và quan lý các thành phân giao diên GUI bên trong các vât chua.
Bang sau cung câp bôn lop quan lý layout (cách bô trí và sáp xêp) các thành phân GUI.
Tên lóp Mô ta
FlowLayout Xêp các thành phân giao diên truoc tiên theo hàng tu trái qua phai,
sau dó theo côt tu trên xuông duoi. Cách sáp xêp này là mác dinh
dôi voi Panel, JPanel ,Applet và JApplet.
GridLayout Các thành phân giao diên duoc sáp xêp trong các ô luoi hình chu
nhât lân luot theo hàng tu trái qua phai và theo côt tu trên xuông
duoi trong môt phân tu chua. Môi thành phân giao diên chua trong
môt ô.
BorderLayout Các thành phân giao diên (ít hon 5) duoc dát vào các vi trí theo các
huong: north (bác), south (nam), west (tây), east (dông) và center
(trung tâm)). Cách sáp xêp này là màc dinh dôi voi lop Window,
Frame, Jframe, Dialog và JDialog.
GridBagLayout Cho phép dát các thành phân giao diên vào luoi hình chu nhât,
nhung môt thành phân có thê chiêm nhiêu nhiêu hon môt ô.
null Các thành phân bên trong vât chua không duoc sáp lai khi kích
thuoc cua vât chua thay dôi.
Các phuong pháp thiêt dát layout
Dê lây vê layout hay dê dát lai layout cho vât chua, chúng ta có thê su dung hai phuong
thuc cua lop Container:
LayoutManager getLayout();
void setLayout(LayoutManager mgr);
Các thành phân giao diên sau khi dã duoc tao ra thì phai duoc dua vào môt phân tu chua
nào dó. Hàm add() cua lop Container duoc nap chông dê thuc hiên nhiêm vu dua các
thành phân vào phân tu chua.
Component add(Component comp)
Component add(Component comp, int index)
Cmponent add(Component comp, Object constraints)
Cmponent add(Component comp, Object constraints, int index)
Trong dó, dôi sô index duoc su dung dê chi ra vi trí cua ô cân dát thành phân giao diên
comp vào. Dôi sô constraints xác dinh các huong dê dua comp vào phân tu chua.
Nguoc lai, khi cân loai ra khoi phân tu chua môt thành phân giao diên thì su dung các hàm
sau:
void remove(int index)
Trang 125
void remove(Component comp)
void removeAll()
1. Lóp FlowLayout
Lop FlowLayout cung câp các hàm tao lâp dê sáp hàng các thành phân giao diên:
FlowLayout()
FlowLayout(int aligment)
FlowLayout(int aligment, int horizongap, int verticalgap)
public static final int LEFT
public static final int CENTER
public static final int RIGHT
Dôi sô aligment xác dinh cách sáp theo hàng: tu trái, phai hay trung tâm,
horizongap và verticalgap là khoang cách tính theo pixel giùa các hàng các côt.
Truong hop mác dinh thì khoang cách giua các hàng, côt là 5 pixel.
2. Lóp GridLayout
Lop GridLayout cung câp các hàm tao lâp dê sáp hàng các thành phân giao diên:
GridLayout()
GridLayout(int rows, int columns)
GridLayout(int rows, int columns, int hoiongap, int verticalgap)
Tao ra môt luoi hình chu nhât có rows ( columns ô có khoang cách giua các hàng
các côt là horizongap, verticalgap. Môt trong hai dôi sô rows hoàc columns có thê là
0, nhung không thê ca hai, GridLayout(1,0) là tao ra luoi có môt hàng.
3.Lóp BorderLayout
Lop BorderLayout cho phép dát môt thành phân giao diên vào môt trong bôn huong: bác
(NORTH), nam (SOUTH), dông (EAST), tây (WEST) và o giùa (CENTER).
BorderLayout()
BorderLayout(int horizongap, int verticalgap)
Tao ra môt layout mác dinh hoác có khoang cách giua các thành phân (tính báng
pixel) là horizongap theo hàng và verticalgap theo côt.
Component add(Component comp)
void add(Component comp, Object constraint)
public static final String NORTH
public static final String SOUTH
public static final String EAST
public static final String WEST
public static final String CENTER
Truong hop mác dinh là CENTER, nguoc lai, có thê chi dinh huong dê dát các thành
phân comp vào phân tu chua theo constraint là môt trong các háng trên.
III. Xu lý su kiên trong Java
Các ung dung voi GUI thuong duoc huong dân boi các su kiên (event). Viêc nhân
môt nút, mo, dóng các Window hay gõ các ký tu tu bàn phím, v.v. dêu tao ra các su kiên
(event) và duoc gui toi cho chuong trình ung dung. Trong Java các su kiên duoc thê hiên
báng các dôi tuong. Lop co so nhât, lop cha cua tât ca các lop con cua các su kiên là lop
java.util.EventObject.
Trang 126
Hình H7-20 Các lop xu lý các su kiên
Các lop con cua AWTEvent duoc chia thành hai nhóm:
Các lop mô ta vê ngu nghia cua các su kiên,
Các lop su kiên o muc thâp.
1. Ý nghîa cua các lóp
a. ActionEvent
Su kiên này duoc phát sinh boi nhung hoat thuc hiên trên các thành phân cua GUI. Các
thành phân gây ra các su kiên hành dông bao gôm:
- JButton - khi mot nút button duoc khích hoat,
- JList - khi mot muc trong danh sách duoc kích hoat dúp,
- JmenuItem, JcheckBoxMenu, JradioMenu - khi mot muc trong thuc don duoc chon,
- JTextField - khi gõ phím ENTER trong truong vàn ban (text).
b. AdjustmentEvent
Su kiên này xây ra khi ta diêu chinh (adjustment) giá tri thanh cuôn (JScollBar)
Scrollbar - khi thuc hiên môt lân cán chinh trong thanh truot Scrollbar.
Lop này có phuong thuc int getValue(): cho lai giá tri hiên thoi duoc xác dinh boi lân cán
chinh sau cùng.
c. ItemEvent
Các thành phân cua GUI gây ra các su kiên vê các muc gôm có:
j ava.l ang.Obj ect
j ava. ut il.Event Obj ect
j ava.awt .event
Act ionEvent Adj ust ment Event Component Even
t
I t emEvent Text Event
Cont ainerEvent FocusEvent
I nput Event
Paint Event
WindowEvent
KeyEvent MouseEven
t
j ava. awt . AWTEvent
Trang 127
- JCheckbox - khi trang thái cua hôp kiêm tra Checkbox thay dôi.
- CheckboxMenuItem - khi trang thái cua hôp kiêm tra Checkbox ung voi muc cua
thuc don thay dôi.
- JRadioButton- khi trang thái cua hôp chon (Option) thay dôi.
- JList - khi môt muc trong danh sách duoc chon hoác bi loai bo chon.
- JCompoBox - khi môt muc trong danh sách duoc chon hoác bi loai bo chon.
Lop ItemEvent có phuong thuc Object getItem(): Cho lai doi tuong duoc chon hay vua bi
bo chon.
d. TextEvent
Các thành phân cua GUI gây ra các su kiên vê text gôm có:
TextArea - khi kêt thúc báng nhân nút ENTER,
TextField - khi kêt thúc báng nhân nút ENTER.
e. ComponentEvent
Su kiên này xuât hiên khi môt thành phân bi ân di/hiên ra hoác thay thay dôi lai kích thuoc.
Lop ComponentEvent có phuong thuc:
Component getComponent()
Cho lai doi tuong tham chiêu kiêu Component.
f. ContainerEvent
Su kiên này xuât hiên khi môt thành phân duoc bô sung hay bi loai bo khoi vât chua
(Container).
g. FocusEvent
Su kiên loai này xuât hiên khi môt thành phân nhân hoác mât focus.
h. KeyEvent
Lop KeyEvent là lop con cua lop truu tuong InputEvent duoc su dung dê xu lý các
su kiên liên quan dên các phím cua bàn phím. Lop này có các phuong thuc:
int getKeyCode()
- Dôi voi các su kiên KEY_PRESSED hoác KEY_RELEASED, hàm này duoc su dung dê
nhân lai giá tri nguyên tuong ung voi mã cua phím trên bàn phím.
char getKeyChar()
- Dôi voi các su kiên KEY_PRESSED, hàm này duoc su dung dê nhân lai giá tri nguyên,
mã Unicode tuong ung voi ký tu cua bàn phím.
i. MouseEvent
Lop MouseEvent là lop con cua lop truu tuong InputEvent duoc su dung dê xu lý các tín
hiêu cua chuôt. Lop này có các phuong thuc:
int getX()
int getY()
Point getPoint()
Các hàm này duoc su dung dê nhân lai toa dô x, y cua vi trí liên quan dên su kiên do
chuôt gây ra.
void translatePoint(int dx, int dy)
Hàm translate() duoc su dung dê chuyên toa dô cua su kiên do chuôt gây ra dên (dx,
dy).
int getClickCount()
Trang 128
Hàm getClickCount() dêm sô lân kích chuôt.
j. PaintEvent
Su kiên này xuât hiên khi môt thành phân duoc vë lai, thuc tê su kiên này xây ra khi
phuong thuc paint()/ update() duoc goi dên.
k. WindowEvent
Su kiên loai này xuât hiên khi thao tác voi các Window, cháng han nhu: dóng,
phóng to, thu nho.. môt cua sô. Lop này có phuong thuc:
Window getWindow()
Hàm này cho lai doi tuong cua lop Window ung voi su kiên liên quan dên Window
dã xay ra.
Kiêu su kiên Nguôn gây ra su kiên Phuong thuc dang ký, gõ bo
dôi tuong láng nghe
Giao diên
Listener láng
nghe tuong ung
AcitionEvent
JButton
JList
TexField
addComponentlistener
removeActiontListener
AcitionListener
AdjustmentEvent
JScrollbar addAdjustmentListener
removeAdjustmentListener
AdjustmentListe
ner
ItemEvent JCheckbox
JCheckboxMenuItem
JRadioButton
JList
JCompoBox
addItemListener
removeItemListener
ItemListener
TextEvent JTextArea
JTexField
JTextPane
JEditorPane
addTexListener
removeTextListener
TextListener
ComponentEvent Component
addComponentListener
removeComponentListener
ComponentListe
ner
ContainerEvent
Container addContainerListener
removeContainerListener
ContainerListen
er
FocusEvent
Component addFocusListener
removeFocusListener
FocusListener
KeyEvent
Component addkeyListener
removeKeyListener
KeyListener
MouseEvent
Component addMouseListener MouseMotionLi
Trang 129
remoMouseListener
addMouseMotionListener
remoMouseMotionListener
stener
WindowEvent
Window addWindowListener
removeWindowListener
WindowListener
3. Môt sô lóp diêu hop
Giao diên Listener làng nghe
Lop diêu hop tuong ung
AcitionListener
Không có lop diêu hop tuong ung
AdjustmentListener AdjustmentAdapter
ItemListener Không có lop diêu hop tuong ung
TextListener
Không có lop diêu hop tuong ung
ComponentListener ComponentAdapter
ContainerListener ContainerAdapter
FocusListener FocusAdapter
KeyListener KeyAdapter
MouseMotionListener MouseMotionAdapter
WindowListener WindowAdapter
Môt sô ví du minh hoa
/* The applet enables the user to enter the interest rate,the number of years,
and the loan amount. Clicking the compute button displays the monthly payment
and the total payment.
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.border.TitledBorder;
import java.applet.Applet;
import javax.swing.*;
public class StudentApp extends JFrame implements ActionListener{
private JTextField tRate = new JTextField(10);
private JTextField tYear = new JTextField(10);
private JTextField tLoan = new JTextField(10);
private JTextField tTotal = new JTextField(10);
private JButton compute = new JButton("Compute mortgage");
public static void main(String[] args){
StudentApp fr = new StudentApp();
fr.setSize(400, 200);
fr.setTitle("Mortgage Application");
//fr.center();
fr.setVisible(true);
}
Trang 130
public StudentApp(){
tTotal.setEditable(false);
JPanel p1 = new JPanel();
p1.setLayout(new GridLayout(5,2));
p1.add(new Label("Interest Rate"));
p1.add(tRate);
p1.add(new Label("Years"));
p1.add(tYear);
p1.add(new Label("Loan Amount"));
p1.add(tLoan);
p1.add(new Label("Total Payment"));
p1.add(tTotal);
p1.setBorder(new TitledBorder("Enter interest rate, year and loan amount"));
JPanel p2 = new JPanel();
p2.setLayout(new FlowLayout(FlowLayout.RIGHT));
p2.add(compute);
// Add the components to the applet
getContentPane().add(p1,BorderLayout.CENTER);
getContentPane().add(p2,BorderLayout.SOUTH);
// Register listener
compute.addActionListener(this);
}
// Handler for the compute button
public void actionPerformed(ActionEvent e){
if(e.getSource() == compute){
// Get values from text fields
double interest = (Double.valueOf(tRate.getText())).doubleValue();
int year = (Integer.valueOf(tYear.getText())).intValue();
double loan = (Double.valueOf(tLoan.getText())).doubleValue();
// Compute the total and displays it
double m = loan * interest * year;
tTotal.setText(String.valueOf(m));
}
}
}
Sú dung ListBox và nút lênh
import java.awt.*;
import java.awt.event.*;
class ChoiceList extends Frame implements ActionListener{
Label l1 = new Label("What is your favorite color");
Choice colors = new Choice();
Button bt = new Button("Exit");
public ChoiceList(String title){
super(title);
setLayout(new FlowLayout());
add(bt);
add(l1);
Trang 131
colors.addItem("White");
colors.addItem("Red");
colors.addItem("Orange");
colors.addItem("Green");
colors.addItem("Yellow");
colors.addItem("Blue");
add(colors);
bt.addActionListener(this);
}
public void actionPerformed(ActionEvent ev){
if(ev.getSource() == bt){
System.exit(0);
}
}
// public void mouseExited(MouseEvent m){}
public static void main(String args[]){
ChoiceList t = new ChoiceList("Choice List");
t.setSize(300, 200);
t.show();
}
}
/* ClockGroup.java
* display a group of international clocks
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import javax.swing.Timer;
import java.text.*;
public class ClockGroup extends JApplet implements ActionListener{
private ClockPanel clockP1, clockP2, clockP3;
private JButton btResum, btSus;
public static void main(String[] arg){
JFrame fr = new JFrame("Clock Group Demo");
ClockGroup app = new ClockGroup();
fr.getContentPane().add(app, BorderLayout.CENTER);
app.init();
app.start();
fr.setSize(600, 350);
fr.setVisible(true);
}
public void init(){
// Panel p1 for holding 3 clocks
JPanel p1 = new JPanel();
p1.setLayout(new GridLayout(1,3));
// Create a clock for Berlin
p1.add(clockP1 = new ClockPanel());
clockP1.setTitle("Berlin");
Trang 132
clockP1.clock.setTimeZoneID("ECT");
clockP1.clock.setLocale(Locale.GERMAN);
// Create a clock for SanFrancisco
p1.add(clockP2 = new ClockPanel());
clockP2.setTitle("San Francisco");
clockP2.clock.setTimeZoneID("PST");
clockP2.clock.setLocale(Locale.US);
// Create a clock for Taipei
p1.add(clockP3 = new ClockPanel());
clockP3.setTitle("Taipei");
clockP3.clock.setLocale(Locale.CHINESE);
clockP3.clock.setTimeZoneID("CTT");
// Panel p2 for holding 2 group buttons
JPanel p2 = new JPanel();
p2.setLayout(new FlowLayout());
p2.add(btResum = new JButton("Resume All"));
p2.add(btSus = new JButton("Suspend All"));
// Add p1, p2 into the applet
getContentPane().setLayout(new BorderLayout());
getContentPane().add(p1,BorderLayout.CENTER);
getContentPane().add(p2,BorderLayout.SOUTH);
// Register listener
btResum.addActionListener(this);
btSus.addActionListener(this);
}
public void actionPerformed(ActionEvent e){
if(e.getSource() == btResum){
// Start all clock
clockP1.resume();
clockP2.resume();
clockP3.resume();
}
else if (e.getSource() == btSus){
// Start all clock
clockP1.suspend();
clockP2.suspend();
clockP3.suspend();
}
}
}
class ClockPanel extends JPanel implements ActionListener{
private JLabel labelT;
protected Clock clock = null;
private JButton btResum, btSus;
public ClockPanel(){
JPanel bt = new JPanel();
bt.add(btResum = new JButton("Resum"));
bt.add(btSus = new JButton("Suspend"));
// Set BorderLayout for the ClockPanel
Trang 133
setLayout(new BorderLayout());
// Add title label to the north of the panel
add(labelT = new JLabel(), BorderLayout.NORTH);
labelT.setHorizontalAlignment(JLabel.CENTER);
// Add the clock to the center of the panel
add(clock = new Clock(),BorderLayout.CENTER);
add(bt,BorderLayout.SOUTH);
// Register
btResum.addActionListener(this);
btSus.addActionListener(this);
}
public void setTitle(String title){
labelT.setText(title);
}
public void actionPerformed(ActionEvent e){
if(e.getSource() == btResum){
clock.resume();
}
else if (e.getSource() == btSus){
clock.suspend();
}
}
public void resume(){
if(clock != null) clock.resume();
}
public void suspend(){
if(clock != null) clock.suspend();
}
}
class Clock extends StillClock implements ActionListener{
protected Timer timer;
public Clock(){
this(Locale.getDefault(), TimeZone.getDefault());
}
public Clock(Locale l, TimeZone t){
super(l, t);
timer = new Timer(1000,this);
timer.start();
}
public void resume(){
timer.start();
}
public void suspend(){
timer.stop();
}
public void actionPerformed(ActionEvent e){
repaint();
}
}
Trang 134
// Display a clock in JPanel
class StillClock extends JPanel{
protected TimeZone timeZ;
protected int xC, yC;
protected int clockR;
protected DateFormat form;
public StillClock(){
this(Locale.getDefault(), TimeZone.getDefault());
}
public StillClock(Locale l, TimeZone t){
setLocale(l);
this.timeZ = t;
}
public void setTimeZoneID(String newT){
timeZ = TimeZone.getTimeZone(newT);
}
// Override the paintComponent to display a clock
public void paintComponent(Graphics g){
super.paintComponent(g);
clockR = (int)(Math.min(getSize().width,getSize().height)*0.7*0.5);
xC = (getSize().width)/2;
yC = (getSize().height)/2;
// Draw circle
g.setColor(Color.black);
g.drawOval(xC-clockR, yC - clockR, 2*clockR,2*clockR);
g.drawString("12", xC - 5, yC - clockR);
g.drawString("9", xC - clockR-10, yC + 3);
g.drawString("3", xC + clockR, yC + 3);
g.drawString("6", xC + 3, yC + clockR + 10);
// Get current time using GregorianCalendar
GregorianCalendar cal = new GregorianCalendar(timeZ);
// Draw second hand
int second = (int) cal.get(GregorianCalendar.SECOND);
int sLen = (int)(clockR *0.9);
int xS = (int)(xC+sLen*Math.sin(second*(2*Math.PI/60)));
int yS = (int)(yC-sLen*Math.cos(second*(2*Math.PI/60)));
g.setColor(Color.red);
g.drawLine(xC, yC, xS, yS);
// Draw minut hand
int minute = (int) cal.get(GregorianCalendar.MINUTE);
int mLen = (int)(clockR *0.75);
int xM = (int)(xC+mLen*Math.sin(minute*(2*Math.PI/60)));
int yM = (int)(yC-mLen*Math.cos(minute*(2*Math.PI/60)));
g.setColor(Color.blue);
g.drawLine(xC, yC, xM, yM);
// Draw hour hand
int hour = (int) cal.get(GregorianCalendar.HOUR_OF_DAY);
int hLen = (int)(clockR *0.6);
int xH = (int)(xC+hLen*Math.sin((hour+minute/60.0)*(2*Math.PI/12)));
Trang 135
int yH = (int)(yC-hLen*Math.cos((hour+minute/60.0)*(2*Math.PI/12)));
g.setColor(Color.green);
g.drawLine(xC, yC, xH, yH);
// Set display form in specified style, locale, and timzone
form = DateFormat.getDateTimeInstance(
DateFormat.MEDIUM,DateFormat.LONG, getLocale());
form.setTimeZone(timeZ);
// Display current date
String today = form.format(cal.getTime());
FontMetrics fm = g.getFontMetrics();
g.drawString(today, (getSize().width-fm.stringWidth(today))/2,
yC+clockR+30);
}
}
Sú dung các diêu khiên
package welcome;
import java.awt.*;
import java.awt.event.*;
public class ComponentTest extends Frame implements
ActionListener,MouseListener
{ TextField tf1=new TextField(30);
TextField tf2 = new TextField(40);
Label label1 = new Label("This is a way to use component...");
Checkbox b1 = new Checkbox("Red", true);
Checkbox b2 = new Checkbox("Blue", true);
CheckboxGroup cb = new CheckboxGroup();
Checkbox bg1 = new Checkbox("Small", cb, true);
Checkbox bg2 = new Checkbox("Large", cb, true);
TextArea ta = new TextArea(3, 25);
Choice colors = new Choice();
Button btnResult = new Button("Double is");
Button btnExt = new Button("Exit");
PopupMenu optionsMenu = new PopupMenu("Options");
public ComponentTest(String title) {
super(title);
setLayout(new FlowLayout());
add(label1);
add(ta);
add(tf1);
add(tf2);
add(b1);
add(b2);
add(bg1);
add(bg2);
colors.addItem("While");
colors.addItem("Red");
colors.addItem("Oranges");
Trang 136
colors.addItem("Green");
colors.addItem("Yellow");
colors.addItem("Blue");
colors.addItem("Black");
add(colors);
add(btnResult);
add(btnExt);
btnResult.addActionListener(this);
btnExt.addActionListener(this);
MenuBar mbar = new MenuBar();
setMenuBar(mbar);
Menu fileMenu = new Menu("File");
mbar.add(fileMenu);
fileMenu.addActionListener(this);
MenuItem newItem = new MenuItem("New");
fileMenu.add(newItem);
MenuItem openItem = new MenuItem("Open");
fileMenu.add(openItem);
fileMenu.addSeparator();
MenuItem saveItem = new MenuItem("Save");
fileMenu.add(saveItem);
fileMenu.addSeparator();
MenuItem exitItem = new MenuItem("Exit");
fileMenu.add(exitItem);
exitItem.addActionListener(this);
Menu editMenu = new Menu("Edit");
mbar.add(editMenu);
editMenu.addActionListener(this);
MenuItem cutItem = new MenuItem("Cut");
editMenu.add(cutItem);
MenuItem copyItem = new MenuItem("Copy");
editMenu.add(copyItem);
fileMenu.addSeparator();
MenuItem paseItem = new MenuItem("Pase");
editMenu.add(paseItem);
editMenu.add(optionsMenu);
//PopupMenu optionsMenu=new PopupMenu("Options");
optionsMenu.addActionListener(this);
MenuItem readItem = new MenuItem("Read Only");
optionsMenu.add(readItem);
optionsMenu.addSeparator();
Menu formatMenu = new Menu("Format text");
optionsMenu.add(formatMenu);
optionsMenu.addSeparator();
CheckboxMenuItem insertItem = new CheckboxMenuItem("Insert", true);
formatMenu.add(insertItem);
formatMenu.addSeparator();
CheckboxMenuItem overtypeItem = new CheckboxMenuItem("Over type", false);
Trang 137
formatMenu.add(overtypeItem);
formatMenu.addSeparator();
}
public void actionPerformed(ActionEvent ae) {
if (ae.getSource() == btnResult) {
int num = Integer.parseInt(tf1.getText()) * 2;
tf2.setText(String.valueOf(num));
}
if (ae.getSource() == btnExt) {
System.exit(0);
}
if (ae.getActionCommand().equals("Exit")) {
System.exit(0);
}
if (ae.getActionCommand().equals("Open")) {
System.out.println("You pressed the menuItem Open...");
label1.setText("Open");
}
}
public void mouseEntered(MouseEvent m) { }
public void mouseExited(MouseEvent m) { }
public void mouseClicked(MouseEvent m) {
optionsMenu.show(this, m.getX(), m.getY());
}
public void mouseReleased(MouseEvent m) { }
public void mousePressed(MouseEvent m) { }
public static void main(String args[]) {
ComponentTest c = new ComponentTest("Vi du dung thu vien java.awt.*");
c.setSize(500, 300);
c.show();
}
}
/*
The program has 4 buttons labeled Add, Sub, Mul, Div and also create a menu
to perform the same operation. The user will also create to perform the
same operation. The user can choose the operation either from buttons or
from menu selections. Fig. The following contains a sample run of the
program.
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MenuDemo1 extends JFrame implements ActionListener{
private JTextField num1, num2, res;
private JButton btAdd, btSub, btMul,btDiv;
private JMenuItem mAdd, mSub,mMul, mDiv, mClose;
public static void main(String[] arg){
MenuDemo1 fr = new MenuDemo1();
fr.pack();
Trang 138
fr.setVisible(true);
}
public MenuDemo1(){
setTitle("Menu Demo");
JMenuBar mb = new JMenuBar();
setJMenuBar(mb);
JMenu opMenu = new JMenu("Operation");
opMenu.setMnemonic('O');
mb.add(opMenu);
JMenu exitMenu = new JMenu("Exit");
exitMenu.setMnemonic('E');
mb.add(exitMenu);
opMenu.add(mAdd = new JMenuItem("Add", 'A'));
opMenu.add(mSub = new JMenuItem("Sub", 'S'));
opMenu.add(mMul = new JMenuItem("Mul", 'M'));
opMenu.add(mDiv = new JMenuItem("Div", 'D'));
exitMenu.add(mClose = new JMenuItem("Close", 'C'));
mAdd.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A,
ActionEvent.CTRL_MASK));
mSub.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,
ActionEvent.CTRL_MASK));
mMul.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M,
ActionEvent.CTRL_MASK));
mDiv.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D,
ActionEvent.CTRL_MASK));
JPanel p1 = new JPanel();
p1.setLayout(new FlowLayout());
p1.add(new JLabel("Number 1"));
p1.add(num1 = new JTextField(4));
p1.add(new JLabel("Number 2"));
p1.add(num2 = new JTextField(4));
p1.add(new JLabel("Result"));
p1.add(res = new JTextField(4));
res.setEditable(false);
JPanel p2 = new JPanel();
p2.setLayout(new FlowLayout());
p2.add(btAdd = new JButton("Add"));
p2.add(btSub = new JButton("Sub"));
p2.add(btMul = new JButton("Mul"));
p2.add(btDiv = new JButton("Div"));
getContentPane().setLayout(new BorderLayout());
getContentPane().add(p1, BorderLayout.CENTER);
getContentPane().add(p2, BorderLayout.SOUTH);
btAdd.addActionListener(this);
btSub.addActionListener(this);
Trang 139
btMul.addActionListener(this);
btDiv.addActionListener(this);
mAdd.addActionListener(this);
mSub.addActionListener(this);
mMul.addActionListener(this);
mDiv.addActionListener(this);
mClose.addActionListener(this);
}
public void actionPerformed(ActionEvent e){
String comm = e.getActionCommand();
if(e.getSource() instanceof JButton){
if("Add".equals(comm))
calculate('+');
else if ("Sub".equals(comm))
calculate('-');
else if ("Mul".equals(comm))
calculate('*');
else if ("Div".equals(comm))
calculate('/');
}
else if (e.getSource() instanceof JMenuItem){
if("Add".equals(comm))
calculate('+');
else if ("Sub".equals(comm))
calculate('-');
else if ("Mul".equals(comm))
calculate('*');
else if ("Div".equals(comm))
calculate('/');
else if ("Close".equals(comm))
System.exit(0);
}
}
private void calculate(char op){
int n1 = (Integer.parseInt(num1.getText().trim()));
int n2 = (Integer.parseInt(num2.getText().trim()));
int r = 0;
switch( op){
case '+': r = n1 + n2; break;
case '-': r = n1 - n2; break;
case '*': r = n1 * n2; break;
case '/': r = n1 / n2; break;
}
res.setText(String.valueOf(r));
}
}
Lâp trình menu
Trang 140
/*
The program has 4 buttons labeled Add, Sub, Mul, Div and also create a menu
to perform the same operation. The user will also create to perform the
same operation. The user can choose the operation either from buttons or
from menu selections. Fig. The following contains a sample run of the
program.
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MenuDemo1 extends JFrame implements ActionListener{
private JTextField num1, num2, res;
private JButton btAdd, btSub, btMul,btDiv;
private JMenuItem mAdd, mSub,mMul, mDiv, mClose;
public static void main(String[] arg){
MenuDemo1 fr = new MenuDemo1();
fr.pack();
fr.setVisible(true);
}
public MenuDemo1(){
setTitle("Menu Demo");
JMenuBar mb = new JMenuBar();
setJMenuBar(mb);
JMenu opMenu = new JMenu("Operation");
opMenu.setMnemonic('O');
mb.add(opMenu);
JMenu exitMenu = new JMenu("Exit");
exitMenu.setMnemonic('E');
mb.add(exitMenu);
opMenu.add(mAdd = new JMenuItem("Add", 'A'));
opMenu.add(mSub = new JMenuItem("Sub", 'S'));
opMenu.add(mMul = new JMenuItem("Mul", 'M'));
opMenu.add(mDiv = new JMenuItem("Div", 'D'));
exitMenu.add(mClose = new JMenuItem("Close", 'C'));
mAdd.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A,
ActionEvent.CTRL_MASK));
mSub.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,
ActionEvent.CTRL_MASK));
mMul.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M,
ActionEvent.CTRL_MASK));
Trang 141
mDiv.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D,
ActionEvent.CTRL_MASK));
JPanel p1 = new JPanel();
p1.setLayout(new FlowLayout());
p1.add(new JLabel("Number 1"));
p1.add(num1 = new JTextField(4));
p1.add(new JLabel("Number 2"));
p1.add(num2 = new JTextField(4));
p1.add(new JLabel("Result"));
p1.add(res = new JTextField(4));
res.setEditable(false);
JPanel p2 = new JPanel();
p2.setLayout(new FlowLayout());
p2.add(btAdd = new JButton("Add"));
p2.add(btSub = new JButton("Sub"));
p2.add(btMul = new JButton("Mul"));
p2.add(btDiv = new JButton("Div"));
getContentPane().setLayout(new BorderLayout());
getContentPane().add(p1, BorderLayout.CENTER);
getContentPane().add(p2, BorderLayout.SOUTH);
btAdd.addActionListener(this);
btSub.addActionListener(this);
btMul.addActionListener(this);
btDiv.addActionListener(this);
mAdd.addActionListener(this);
mSub.addActionListener(this);
mMul.addActionListener(this);
mDiv.addActionListener(this);
mClose.addActionListener(this);
}
public void actionPerformed(ActionEvent e){
String comm = e.getActionCommand();
if(e.getSource() instanceof JButton){
if("Add".equals(comm))
calculate('+');
else if ("Sub".equals(comm))
calculate('-');
else if ("Mul".equals(comm))
calculate('*');
Trang 142
else if ("Div".equals(comm))
calculate('/');
}
else if (e.getSource() instanceof JMenuItem){
if("Add".equals(comm))
calculate('+');
else if ("Sub".equals(comm))
calculate('-');
else if ("Mul".equals(comm))
calculate('*');
else if ("Div".equals(comm))
calculate('/');
else if ("Close".equals(comm))
System.exit(0);
}
}
private void calculate(char op){
int n1 = (Integer.parseInt(num1.getText().trim()));
int n2 = (Integer.parseInt(num2.getText().trim()));
int r = 0;
switch( op){
case '+': r = n1 + n2; break;
case '-': r = n1 - n2; break;
case '*': r = n1 * n2; break;
case '/': r = n1 / n2; break;
}
res.setText(String.valueOf(r));
}
}
Trang 143
Chuong 7 LAP TRÌNH CO SO DÙ LIEU
I. Tông quan
Môt hua hen lon cua java là kha náng xây dung các ung dung CSDL dôc lâp voi hê
nên, công nghê này duoc biêt dên voi cái tên JDBC (Java Database Connectivity),
JDBC duoc thiêt kê tuong dôi don gian.
Mô hình JDBC dua ra môt tâp các lop và các phuong thuc dê giao tiêp voi ngôn du
liêu. JDBC API duoc tích hop vào ngay nên java nên ban không cân phai cài dát gì
thêm khi truy câp CSDL.
II. Các kêu trình diêu khiên JDBC
Các trình diêu khiên JDBC có thê phân thành 4 kiêu sau phu thuôc vào cách thuc
hoat dông, cách kêt nôi voi CSDL.
Kiêu 1 : JDBC su dung câu nôi ODBC (JDBC-ODBC Bridge )
ODBC là môt công nghê cua Microsoft dùng dê kêt nôi dên các hê co so du liêu
thông qua trình diêu khiên Driver cua hê co so du liêu dó. Môi hê co so du liêu cung
câp môt trình diêu khiên (Driver) có kha náng làm viêc (doc, câp nhât,..) duoc co so
du liêu cua chúng . Trình diêu khiên này së duoc dáng ký voi bô quan lý ODBC .
ODBC API là môt tâp các hàm API dê truy câp vào CSDL thông qua các trình diêu
khiên, nguoi lâp trình së su dung các hàm API trong giao diên này dê truy câp vào
CSDL.
Câu nôi JDBC – ODBC là môt trình diêu khiên su dung mã java dê goi lai các hàm
trong JDBC API. Báng cách này ban có thê kêt nôi duoc voi nhiêu hê quan tri co so
du liêu khác nhau.
Dê có thê kêt nôi vào môt hê CSDL cu thê nào dó (cháng han nhu: Access, SQL
Server, MySQL…) su dung câu nôi JDBC-ODBC ban cân phai có:
- Trình diêu khiên (Driver) cua dùng dê truy câp vào hê CSDL dó. Thông thuong
trình diêu khiên này duoc cung câp boi chính các hãng san xuât hê CSDL và nó
thuong duoc cài dát vào trong máy khi ban cài dát hê quan tri CSDL.
- Câu nôi JDBC-ODBC, dây là trình diêu khiên duoc cung câp miên phí boi hãng
Sun và nó duoc cài dát tu dông khi ban cài dát JDK.
Trang 144
Vì ráng trình diêu khiên ODBC phai duoc cài dát vào trong máy truoc khi ban có thê
su dung nên nó chi thích hop cho các ung dung máy don, hoác duoc chay trên máy
chu trong mô hình nhiêu tâng (Multi - tier), không thích hop cho các ung dung chay
trên máy khách nhu: Aplet, Fat Client.
Kiêu 2 : JDBC kêt nôi truc tiêp vói các trình diêu khiên co so dû liêu .
Kiêu kêt nôi này su dung mã java truc tiêp goi các hàm trong trình diêu khiên dác
thù cua môi hê co so du liêu mà không phai qua trung gian ODBC . Do vây kiêu kêt
nôi này nhanh và hiêu qua hon câu nôi JDBC – ODBC, nhung phai có trình diêu
khiên co so dác thù do nhà phát triên cung câp hoác cua môt hãng thu ba nào dó.
Java Application ,
Applet , Ser vlet
JDBC Driver
ODBC
Database driver
Database

JAVA
Mã Native
{
{
{
Mô hình truy câp CSDL qua câu nôi JDBC
Trang 145
Kiêu 3 : JDBC kêt nôi thông qua các úng dung mang trung gian
Voi kiêu kêt nôi này, máy chu së chiu trách nhiêm kêt nôi voi co so du liêu .
Máy khách chi su dung nhung trình diêu khiên gon nhe (thin) có kha náng giao tiêp
voi ung dung trung gian thông qua mang dê truy vân du liêu .
Kiêu 4 : JDBC kêt nôi thông qua các trình diêu khiên hoàn toàn mã java
Java Application ,
Applet , Servlet
JDBC Driver
Database driver

JAVA
Mã Native
{
{
D atab ase
Mô hình kêt nôi truc tiêp
Java Application ,
Applet , Servlet
JDBC Driver
Java Middle Ware
Java Native driver
Dat abase

JAVA
Mã JAVA
{
{
M¹ ng
Trang 146
Kiêu này cho phép máy khách su dung trình diêu khiên gon nhe nôi kêt truc tiêp vào trình
diêu khiên co so du liêu dác thù trên máy chu o xa thông qua mang Internet .
III. Các lóp trong JDBC API dùng dê truy câp CSDL
JDBC API bao gôm các lop và các giao diên duoc chua trong hai gói: java.sql và
javax.sql. Gói java.sql chua các giao diên và gói cho phép ta thuc hiên các thao tác co ban
dôi voi CSDL, gói javax.sql chua các lop và giao diên giúp ta thuc hiên các tính náng cao
câp.
1. Môt sô giao diên và lóp trong gói java.sql
a) Môt sô giao diên
Tên giao diên Mô ta ý nghia
CallableStatement Giao diên chua các phuong thuc cho phép ta làm viêc voi thu
tuc luu tru nôi
DatabaseMetaData Cho phép ta xem các thông tin vê CSDL
PreparedStatement Giao diên này cho phép ta thuc thi các câu lênh SQL chua
tham sô
ResultSetMetaData
Connection Thê hiên môt kêt nôi dên CSDL
Driver Giao diên mà môi trình diêu khiên phai cài dát
ResultSet Thê hiên môt tâp các ban ghi lây vê tu CSDL
Statement Giao diên cho phép ta thuc hiên các phát biêu SQL
Java Application ,
Applet , Servlet
JDBC Driver
Java Native driver
CSDL

JAVA
Mã JAVA
{
{
Internet
Trang 147
b) Mét sô lóp
Tên lóp Ý nghia
Date Lop biêu diên kiêu DATE
DriverPropertyInfo Chua các thuôc tính cua trình diêu khiên dã nap
Timestamp Lop biêu diên cho SQL TimeTemp
DriverManager Lop quan lý các trình diêu khiên
Time Lop biêu diên kiêu DATE
Types Lop dinh nghia các háng tuong ung voi các kiêu du liêu SQL, hay
còn goi là kiêu du liêu JDBC
2. Môt sô lóp và giao diên trong gói javax.sql
Tham khao tài liêu vê JDBC
IV. Kêt nôi CSDL vói JDBC
Dê có thê làm viêc voi CSDL, môt chuong trình java (hay bât cu chuong trình viêt
báng ngôn ngu nào khác) phai tuân theo các buoc sau:
Mo kêt nôi dên CSDL.
Thuc hiên các lênh làm viêc voi CSDL nhu: truy vân, câp nhât…
Dóng kêt nôi, giai phóng tài nguyên.
Các buoc dê xây dung môt ung dung CSDL voi JDBC:
1. Chuân bi
a) Cài dát JDBC và trình diêu khiên:
Môt ung java chi có thê kêt nôi và làm viêc duoc voi du liêu trong CSDL thông qua
các trình diêu khiên và các thu viên JDBC API.
Truoc khi truy câp vào hê CSDL nào ban phai có trong tay trình diêu khiên tuong
ung voi hê CSDL dó. Ban có thê download các trình diêu khiên cho môt sô hê CSDL quen
thuôc tu dia chi java.sun.com/jdbc
b) Cài dát CSDL
Ban cân lua chon và cài dát môt hê quan tri CSDL, dê quan tri phân du liêu cua
chuong trình. Dây là lua chon cua ban tuy theo tính chât cua du liêu trong chuong trình
cung nhu muc tiên ban có dê có thê mua duoc hê quan tri dó.
Sau khi ban lua chon duoc hê quan tri CSDL phù hop ban tiên hành cài dát CSDL:
tao bang, view, thu tuc luu tru..
Chú ý: Dê có thê truy câp vào CSDL cua hê quan tri CSDL nào thì ban phai có trong
tay trình diêu khiên tuong ung.
2. Thiêt lâp kêt nôi
Dây là buoc quan trong nhât bao gôm hai buoc:
Trang 148
a) Nap trình diêu khiên
JDBC su dung môt bô trình quan lý diêu kiên (DiverManager), môi trình diêu khiên
(Driver) cho phép ta làm viêc voi môt CSDL cu thê, cho nên nêu ban có 3 CSDL do
3 nhà cung câp khác nhau cung câp thì ban cân phai có 3 trình diêu khiên khác nhau.
Dê nap và dáng ký trình diêu khiên ban su dung lênh Class.forName(URL)
Trong dó URL là môt chuôi mô ta các thông tin vê tên cua trình diêu khiên dùng kêt
nôi voi co so du liêu, cháng han lênh
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
dùng dê nap trình diêu khiên JDBC-ODBC
Chú ý: Vói môi trình diêu khiên khác nhau thì URL cua phuong thúc Class.forName()
së khác nhau. Nên dê có thê nap dúng trình diêu khiên ban nên thao khao tài liêu di kèm
cua các trình diêu khiên, dê biêt duoc URL tuong ung.
b) Tao môt kêt nôi
Buoc tiêp theo ban tao môt kêt nôi dên CSDL thông qua trình diêu khiên mà ban
vua nap o buoc trên. Doan mã dùng dê tao môt kêt nôi thông thuong nhu sau:
Connection con = DriverManager.getConnection(url, "myLogin", "myPassword");
Trong dó :
- url là chuôi chua thông tin kêt nôi dên CSDL, nêu ban su dung câu nôi JDBC-ODBC thì
url là “jdbc:odbc:DataSourceName”, cháng han tôi dã tao môt DNS tên là TestDB voi tên
truy câp là theht, mât khâu truy câp là theht thì câu lênh kêt nôi dên CSDL là
Connection con = DriverManager. getConnection(“jdbc:odbc:TestDB”,"theht", "theht");
- myLogin là tên truy câp, nêu mât không có mât khâu ban có thê truyên cho nó môt xâu
rông
- myPassword là mât khâu truy câp, nêu mât không có mât khâu ban có thê truyên cho nó
môt xâu rông
Chú ý: Thông thuòng chuôi URL có dinh dang nhu sau:
jdbc:subprotocol:subname
Trong dó:
subprotocol là giao thuc con tuong ung voi loai CSDL
subname là tên cua nguôn du liêu (Thông thuong nó là tên cua CSDL)
Môt vài ví du:
Ví du 1: Nap trình diêu khiên và kêt nôi dên CSDL cua MySQL
Trang 149
Trình diêu khiên dê tury cap vào CSDL cua MySQL, ban có thê download tai dia chi
MySQL.com, sau khi download ban có mot têp tin duy nhat dã duoc nén theo chuan jar, dàt
classpath tro dên têp tin này
- Nap tình diêu khiên cua MySQL
Class.forName("com.mysql.jdbc.Driver");
- Kêt nôi dên CSDL
Connection conn = DriverManager.getConnection(
"jdbc:mysql://ServrName/DBName?user=UserName&password=Pass");
- ServerName: là tên cua máy chu CSDL
- DBName: là tên cua CSDL
- UserName: là tên truy câp CSDL
- Pass: là mât khâu truy câp
Ví du 2: Nap trình diêu khiên và kêt nôi dên CSDL cua SQL Server 7.0, 2000
Có rât nhiêu trình diêu khiên cho MS SQL Server, da phân các trình diêu khiên dêu là các
san phâm thuong mai, có môt trình diêu khiên mà ta nên su dung dó là trình diêu khiên do
chính hãng Microsoft cung câp, trình diêu khiên này hoàn toàn Free và hô tro dây du các
tính náng cua Sql Server.
- Dia chi download www.microsoft.com
- Sau khi download và tiên hành cài dát ban së có 3 têp tin trong thu muc cài dát:
install_dir/lib/msbase.jar
install_dir/lib/msutil.jar
install_dir/lib/mssqlserver.jar
install_dir: là thu muc cài dàt
- Dát classpath tro dên 3 têp tin trên
- Nap trình diêu khiên
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
- Kêt nôi dên CSDL
Connection conn = DriverManager.getConnection(
" jdbc:microsoft:sqlserver://ServerName:ServerPort;DatabaseName=DBName",
"UserName","Password");
hoác
Connection conn = DriverManager.getConnection
"jdbc:microsoft:sqlserver://ServerName:ServerPort;User=UserName;Password=Pass
word;DatabaseName=DBName");
Trang 150
+ ServerName: Là tên cua máy chu SQL
+ ServerPort: Sô hiêu công cua SQL, nêu trong quá trình cài dát mà ban không dát
lai thì giá tri này là 1433
+ UserName: Tài khoan dáng nhâp vào SQL
+ Password: Mât khâu tuong ung voi tài khoan dáng nhâp
- Chuyên CSDL làm viêc
conn.setCatalog("DBName");
+ DBName: là tên CSDL
Ví du hoàn chinh
import java.sql.*;
class Test{
public static void main(String[] args) {
try {
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
Connection conn = DriverManager.getConnection(
"jdbc:microsoft:sqlserver://theht:1433;DatabaseName=AA;user=sa;password=");
Statement st=conn.createStatement();
ResultSet rs=st.executeQuery("Select * from t");
while(rs.next()) System.out.println(rs.getString("a")+ rs.getString("b"));
} catch (SQLException ex) {}
} catch (ClassNotFoundException ex) { }
}
Ví du 3: Nap trình diêu khiên và kêt nôi dên CSDL cua Access voi câu nôi JDBC-ODBC
cua Sun System
Ðê truy cap vào CSDL cua Access ta không can phai tai xuong và cài dàt vào máy driver
nào ca vì nó duoc tích hop vào Java, trình diêu khiên này do sun cung cap nó có tên là cau
noi JDBC-ODBC
- Nap trình diêu khiên
Class.forName("sun.jdbc.odbc. JdbcOdbcDriver ");
- Mo kêt noi báng cách su dung DataSource Name
+ Vào control panel chay chuong trình ODBC DataSource 32 bit
+ Tao môt DataSource Name có tên là MyDB
Connection conn = DriverManager.getConnection(" jdbc:odbc:MyDB");
- Mo kêt noi báng cách su dung File DataSource
Connection conn = DriverManager.getConnection(“jdbc:odbc:Driver={Microsoft
Access Driver (*.mdb)};DBQ=C:/Path/DatabaseName.mdb";”)
MyDB: tên cua DataSource Name mà ban dã tao
Path: duong dân dên CSDL
Trang 151
DatabaseName: tên CSDL
Ví du hoàn chinh
import java.sql.*;
import java.util.*;
class Test {
public static void main(String a[]) {
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Properties props = new Properties(); //Charset dê làm viêc vói Unicode
props.put("charSet", "UTF8");
props.put("user", "guest");
props.put("password", "guest");
String url =
"jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=C:/MyDB.mdb";
Connection con = DriverManager.getConnection(url, props);
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
//Tao báng
stmt.executeUpdate("Create Table tbl(a text(50), b text(50))");
//Chèn 1 bán ghi vào CSDL
stmt.execute("Insert Into tbl values('Xin chào'','Toi là Access')");
ResultSet rs = stmt.executeQuery("Select * from tbl");
if (rs.next()) {
System.out.println(rs.getString("a") + "\t" + rs.getString("b"));
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
Ví du 4: Nap trình diêu khiên và kêt nôi dên CSDL cua Oracle 8i, 9i
Trình diêu khiên dê tury cap vào CSDL cua Oracle, ban có thê tìm thay nó trong thu muc
%ORACLE_HOME%/JDBC/lib
Class.forName("oracle.jdbc.OracleDriver ");
// Lây vê kêt nôi dên CSDL
Connection conn = DriverManager.getConnection("jdbc:oracle:oci8:@theht",
"theht","abc");
- @theht là tên cua máy chu CSDL
- theht là tên truy câp CSDL
- abc là mât khâu truy câp
Trang 152
V. Tuong tác vói CSDL
Tât ca các lênh mà ta dùng dê tác dông lên CSDL dêu có thê thuc hiên thông qua
môt trong ba dôi tuong sau:
Dôi tuong Mô ta
Satement Dùng dê thuc thi các lênh SQL không có tham sô
PreparedStatement Dùng dê thuc thi các lênh SQL có chua tham sô
CallableStatement Dùng dê làm viêc voi thu tuc luu tru nôi
1. Tao ra môt JDBC Statements
Môt dôi tuong Statements së giúp ban gui môt lênh SQL dên hê quan tri CSDL, sau
khi tao dôi tuong Statements ban có thê thuc hiên các lênh SQL nhu SELECT dê lây
vê du liêu hay UPDATE dê câp nhât du liêu, dê tao dôi tuong Statements ban su
dung phuong thuc createStatement cua dôi tuong connection mà ban vua tao ra
trong buoc II.
Statement stmt = con.createStatement();
Tai thoi diêm này ban chua có phát biêu SQL nào dê truyên dên CSDL, bây gio
chúng ta së su dung phuong thuc execute cua dôi tuong này dê thuc thi môt lênh
SQL, cháng han nhu doan lênh sau su dung phuong thuc executeUpdate dê thuc thi
môt câu lênh truy vân câp nhât
stmt.executeUpdate("CREATE TABLE COFFEES"+"(COF_NAME VARCHAR(32),
SUP_ID INTEGER, PRICE FLOAT, " +
"SALES INTEGER, TOTAL INTEGER)");
Trong java 2 ban có thê tao ra các tâp kêt qua có thê câp nhât và có thê cuôn con tro
theo ca hai chiêu, dê tao ra tâp kêt qua có thê câp nhât duoc và cho phép cuôn ca hai chiêu
ban su dung mâu sau:
Statement stmt = con.createStatement(ResultSetType, ConcurencyType);
Trong dó :
Tham sô ResultSetType cho biêt tâp kêt qua (ResultSet) nhân duoc khi thuc thi câu lênh
executeQuery() có cuôn duoc hay không.
Tham sô ConcurencyType tính chât cua tâp kêt qua (ResultSet) nhân duoc khi thuc thi
câu lênh executeQuery() có cho phép câp nhât hay không. Thuc ra viêc có câp nhât
duoc hay không còn phu thuôc vào trình diêu khiên và hê quan tri có hô tro câp nhât
hay không.
Sau dây là bang các giá tri mà tham sô ResultSetType có thê nhân
Trang 153
Kiêu ResultSet
TYPE_FORWARD_ONLY
Cho biêt ResultSet nhân duoc chi có thê duyêt theo môt
chiêu tu BOF dên EOF
TYPE_SCROLL_INSENSITIVE
Cho phép duyêt theo ca hai chiêu nhung không thây
duoc su thay dôi du liêu cua nguoi dùng khác
TYPE_SCROLL_SENSITIVE
Cho phép duyêt theo ca hai chiêu nhung thây duoc su
thay dôi du liêu cua nguoi dùng khác
Sau dây là bang các giá tri mà tham sô ConcurencyType có thê nhân
Kiêu ConcurencyType
CONCUR_READ_ONLY
Cho biêt ResultSet không thê câp nhât duoc, hay chi doc
CONCUR_UPDATEABLE
Cho biêt ResultSet có thê câp nhât duoc
a) Thuc hiên các lênh DDL (Data Difinetion Language)
Dê thuc thi các lênh DDL ban su dung phuong thuc executeUpdate cua dôi tuong
Statement theo mâu:
stmt.executeUpdate(DDL_SQL_STRING);
Trong dó:
stmt là môt dôi tuong thuôc lop Statement
DDL_SQL_STRING là môt câu lênh DDL
Chú ý: Phuong thuc executeUpdate tra vê giá tri 0 nêu câu lênh mà nó thuc thi là môt câu
lênh DDL
b) Thuc thi các lênh câp nhât CSDL
Dê thuc thi các lênh câp nhât nhu: INSERT, UPDATE, DELETE ban su dung
phuong thuc executeUpdate() cua dôi tuong Statement theo mâu:
stmt.executeUpdate(DML_SQL_STRING);
Trong dó:
stmt: là môt dôi tuong thuôc lop Statement
DML_SQL_STRING là môt câu lênh câp nhât
Chú ý: Phuong thúc executeUpdate tra vê môt sô nguyên thê hiên sô ban ghi duoc anh
huong sau lênh này, dê biêt duoc sô ban ghi duoc anh huong ban có thê thuc hiên theo mâu
sau:
[int recordEffect=] stmt.executeUpdate(DML_SQL_STRING);
Ví du1: Thêm môt ban ghi vào bang sinhvien
stmt.executeUpdate(“INSERT INTO sinhvien(masv, tensv) values (\“01\”, \”Nguyên
vàn An”);
Ví du2: Xoá các ban ghi cua bang sinhvien có masv=01
stmt.executeUpdate(“DELETE sinhvien WHERE masv=01”);
Trang 154
Ví du 3: Sua lai tên cua sinh viên có masv=01 thành Nguyên Ván B
stmt.executeUpdate(“UPDATE sinhvien SET tensv=\”Nguyên Vàn B\” WHERE
masv=01”);
Câp nhât lai dû liêu
Dê câp nhât lai du liêu ban su dung mênh dê UPDATE SQL, thuc thi chúng thông
qua phuong thuc executeUpdate
Ví du 4: ban muôn công thêm phu câp cho tât ca các nguoi có trình dô dai hoc lên 10 dông
ban làm
stmt.executeUpdate( "UPDATE COFFEES " + "SET CP=PC+10 WHERE
td=’dh’”);
Thêm ban ghi vào bang CSDL
Dê chèn du liêu vào bang ban su dung phuong thuc executeUpdate cua dôi tuong
Statement, ví du ban muôn chèn thêm môt ban ghi vào bang COFFEES ban làm sau:
Statement stmt = con.createStatement();
stmt.executeUpdate("INSERT INTO COFFEES VALUES ('Colombian', 101, 7.99, 0,
0)");
Xoá ban ghi trong CSDL
Dê xoá du liêu tu bang CSDL ban su dung phuong thuc executeUpdate cua dôi
tuong Statement. Ví du ban muôn tât ca các ban ghi cua bang COFFEES ban làm
sau:
Statement stmt = con.createStatement();
stmt.executeUpdate( "DELETE FROM COFFEES");
c) Thuc thi câu lênh truy vân (Query Language)
Dê thuc thi câu lênh truy vân ban su dung phuong thuc executeQuery() cua dôi
tuong Statement theo mâu sau:
ResultSet rs=stmt.executeQuery(QUERY_SQL_STRING);
Trong dó:
stmt: là môt dôi tuong thuôc lop Statement
QUERY_SQL_STRING là môt câu lênh truy vân du liêu
rs là môt dôi tuong cua lop ResultSet
Chú ý: Phuong thuc executeQuery tra vê môt tâp kêt qua tu CSDL duoc chua trong dôi
tuong ResultSet, nên thông thuong ban së lây vê tham chiêu dên kêt tâp qua báng cách:
ResultSet rs=stmt.executeQuery(QUERY_SQL_STRING);
Trang 155
Ví du sau lây vê tât ca các ban ghi cua bang SinhVien và hiên thi ra màn hình
ResultSet rs=stmt.executeQuery(“SELECT * FROM SinhVien”);
While(rs.next())
{ //.. Xu lý tâp kêt qua
}
d) Xu lý tâp kêt qua ResultSet
Các phuong thúc dùng dê di chuyên con tro
Các phuong thuc sau dùng dê di chuyên con tro:
Phuong thúc Ý nghia
next
Di chuyên con tro sang ban ghi kê trong tâp ban ghi, phuong thuc tra
vê true nêu viêc di chuyên là thành công nguoc lai cho false
previous
Di chuyên con tro vê ban ghi truoc ban ghi hiên tai, phuong thuc tra vê
true nêu viêc di chuyên là thành công nguoc lai cho false
last
Di chuyên con tro vê ban ghi cuôi cùng trong tâp ban ghi, phuong thuc
tra vê true nêu viêc di chuyên là thành công nguoc lai cho false
first
Di chuyên con tro vê ban ghi dâu tiên trong tâp ban ghi, phuong thuc
tra vê true nêu viêc di chuyên là thành công nguoc lai cho false
afterLast
Di chuyên con tro vê truoc ban ghi dâu tiên trong tâp b¶n ghi
beforeFirst
Di chuyên con tro vê sau ban ghi cuôi cùng trong tâp ban ghi
absolute(int pos)
Di chuyên con tro vê ban ghi thu pos tính tu ban ghi dâu tiên nêu pos
là sô duong, hoác di chuyên vê ban ghi thu pos tính tu ban ghi cuôi
cùng nêu pos là sô â
relative(int pos)
Di chuyên con tro vê truoc ban ghi hiên tai pos ban ghi nêu pos là sô
âm, hoác di chuyên vê phía sau pos ban ghi so voi ban ghi hiên tai nêu
pos là sô duong
Su dung các phuong thúc getXXX
Ta su dung phuong thuc getXXX dê nhân vê giá tri hiên tai cua môt côt tuong ung, tuy
theo kiêu du liêu cua côt mà ban su dung phuong thuc getXXX tuong ung, ví du nêu
côt có kiêu là VARCHAR thì ban su dung phuong thu getString
Ví du: liêt kê tât ca các ban ghi cua bang COFFEES
String query = "SELECT COF_NAME, PRICE FROM COFFEES";
ResultSet rs = stmt.executeQuery(query);
while (rs.next())
{ // su dung phuong thuc getString vì côt //COF_NAME có kiêu VARCHAR
String s = rs.getString("COF_NAME");
float n = rs.getFloat("PRICE");
// Su dung phuong thuc getFloat vì côt PRICE có kiêu float
Trang 156
System.out.println(s + " " + n);
}
Chú ý: Ban có thê su dung thu tu côt khi lây vê du liêu thay cho tên côt
Cháng han trong ví du trên ban có thê thay
String s = rs.getString("COF_NAME"); boi
String s = rs.getString(1);
Và float n = rs.getFloat("PRICE"); boi
float n = rs.getFloat(2)
Sau dây là bang các phuong thúc tuong úng vói kiêu dû liêu SQL
T S I B R F D D N B C V L B V L D T T
I MN I E L O E U I H A O I A O A I I
N A T G A O U C MT A R N N R N T MM
Y L E I L A B I E R C G A B G E E E
I L G N T L MR H V R I V S
N I E T E A I A A Y N A T
T N R L C R R A R A
T C R B M
H Y I P
A N
R A
R
Y
getByte X x x x x x x x x x x x x
getShort x X x x x x x x x x x x x
getInt x x X x x x x x x x x x x
getLong x x x X x x x x x x x x x
getFloat x x x x X x x x x x x x x
getDouble x x x x x X X x x x x x x
getBigDecimal x x x x x x x X X x x x x
getBoolean x x x x x x x x x X x x x
getString x x x x x x x x x x X X x x x x x x x
getBytes X X x
getDate x x x X x
Trang 157
getTime x x x X x
getTimestamp x x x x x X
getAsciiStream x x X x x x
getUnicodeStream x x X x x x
getBinaryStream x x X
getObject x x x x x x x x x x x x x x x x x x x
Trong bang trên vi trí duoc dánh “x” trên hàng cua phuong thuc getXXX, thì ta có
thê su dung phuong thuc này dê nhân vê giá tri cua côt có kiêu du liêu tuong ung, vi
trí dánh “X” thì phuong thuc dó là phuong thuc su dung thích hop nhât
Câp nhât tâp ResultSet
Trong phân truoc ta dùng các lênh SQL- DML dê câp nhât truc tiêp vào bang cua
CSDL. Trong phân này ta su dung các phuong thuc trong JDBC 2.0 dê thuc hiên cung
công viêc dó.
Diêu ban cân phai chú ý là ta câp nhât du liêu cua bang thông qua các ResultSet, thê
nên các ResultSet này cân phai là các ResultSet câp nhât duoc.
Ta có các phuong thuc updateXXX() khác nhau ung voi các kiêu du liêu mà JDBC
hô tro. Tuong tu nhu phuong thuc getXXX() khi ta nhân thông tin tu bang. Nhu
updateFloat(),updateInt(),updateString(), …
Sau khi gán gía tri cho các truong báng các phuong thuc updateXXX() tuong ung,
ban xác nhân viêc câp nhât báng phuong thuc updateRow(). Phuong thuc này hoat dông
tuong tu nhu phuong thuc commit(), phuong thuc updateRow() có nhiêm vu ghi lai su thay
dôi dôi voi voi hàng hiên tai (dang sua) vào trong bang CSDL trên dia.
Nhu vây khác voi các lênh SQL-DML, co chê câp nhât này chi có tác dung dôi voi
ban ghi hiên hành. Thê nên dê sua lai ban ghi nào ban phai di chuyên con tro ban ghi vào
ban ghi cân sua báng môt trong các phuong thuc dã liêt trong phân truoc.
Ta cung có môt phuong thuc tuong tu nhu phuong thuc rollback() là phuong thuc
cancelRowUpdate(). Khi goi phuong thuc này các thay dôi do goi phuong thuc
updateXXX() kê tu sau câu lênh updateXXX() lân truoc së bi vô hiêu hoá.
Ví du: Câp nhât ResultSet
rs.first(); // Nhay dên ban ghi dâu tiên
rs.updateString(“tensv”, “Nguyên Van Hung”); // gán gía tri moi cho côt tensv
rs.updateRow(); // Xác nhân su thay dôi
rs.last(); // Nhay dên ban ghi cuôi cùng
rs.updateString(“tensv”, “Nguyên Van Dat”); // gán gía tri moi cho côt tensv
rs.cancelRowUpdate(); // Huy bo viêc câp nhât trên
Thêm ban ghi mói
Trang 158
Ngoài viêc su dung các lênh SQL-DML dê thêm các ban ghi trong bang. ta còn có
thê thêm chúng báng cách thông qua các phuong thuc cua dôi tuong ResultSet câp nhât
duoc.
Môt ResultSet câp nhât duoc luôn tôn tai môt ban ghi dác biêt goi là insertrow dê
dùng cho viêc thêm môt ban ghi moi. Ban ghi này không là môt thành phân cua ResultSet.
Thuc chât nó chi là môt vùng dêm dê thêm môt ban ghi moi.
Các buóc dê thêm môt ban ghi mói vào tâp ResultSet
Di chuyên con tro dên ban ghi tam insertrow báng phuong thuc moveToInsertRow();
Thuc hiên viêc diên các giá tri vào các côt tuong ung báng các phuong thuc
updateXXX();
Sau khi chác chán ráng các giá tri thêm vào là dúng. Ta goi phuong thuc insertRow()
dê xác nhân viêc thêm moi ban ghi vào bang và ResultSet.
Ví du: Thêm ban ghi vào ResultSet
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // Nap trình diêu khiên
Connection cn=DriverManager.getConnection("jdbc:odbc:t"); // Lây vê kêt nôi
Statement st=cn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE); //Tâp ResultSet có thê câp nhât duoc
ResultSet rs=st.executeQuery("SELECT * FROM sinhvien"); //Lây vê tâp ResultSet
rs.moveToCurrentRow(); //Buóc 1: Di chuyên con tro dên ban ghi tam dê thêm moi
rs.updateString("masv","005"); //Buóc 2: Gán gía tri cho các côt báng phuong
//updateXXX() tuong ung
rs.updateString("tensv","Nguyên Tu Hào");
rs.updateDate("namsinh",new Date(2004,5,30));
rs.insertRow(); //Buóc 3: Xác nhân su thêm moi
Chú ý:
+ Nêu khi gán giá tri cho các côt mà ta bo sót môt sô côt không gán giá tri khi dó các
côt dó së nhân các giá tri NULL. Khi dó nêu côt dó có thuôc tính không cho phép nhân gía
tri NULL thì ban së nhân duoc môt ngoai lê SQLException.
+ Không có phuong thuc dê ta huy bo viêc thêm moi ban ghi. Tuy nhiên dê huy bo
viêc thêm moi ban chi cân di chuyên con tro ban ghi ra khoi ban ghi tam báng môt trong
các phuong thuc di chuyên chuyên con tro.
Xoá ban ghi
Dê xoá môt ban ghi ban có thê su dung các lênh SQL-DML, ban có thê thuc hiên
viêc này báng các phuong thuc cua dôi tuong ResultSet.
Các buoc dê xoá môt ban ghi khoi ResultSet
Trang 159
Di chuyên con tro dên ban ghi cân xoá
Goi phuong thuc deleteRow();
Chú ý: Tuv vào trình diêu khíên mà viêc xoá duoc thuc hiên ngay hay chí là dánh dâu
xoá. dê biêt chác chán ban nên tham khao tài liêu di kèm voi Driver ban su dung.
Ví du: Xoá ban ghi
rs.first(); // Xóa ban ghi dâu tiên
rs.deleteRow();
rs.absolute(3); // Xoá ban ghi thu 3
rs.deleteRow();
rs.last(); // Xoá ban ghi cuôi cùng
rs.deleteRow();
2. Su dung dôi tuong Prepared Statements
Khi nào su dung dôi tuong Prepared Statements?, câu tra loi duoc phân tích sau:
- Môi khi thuc thi môt lênh SQL thì DBMS lai phai phân tích lai cú pháp cua lênh, sau dó
tôi uu lênh SQL, công viêc này mât rât nhiêu thoi gian, nêu ban cân chèn 100 dòng vào
CSDL, thê thì ban phai su dung 100 lênh executeUpdate dê chèn 100 dòng, do vây phai
mât 100 lân phân tích lênh, 100 lân tôi uu hoá lênh, ban së dát câu hoi có các nào mà chi
cân phân tích lênh, tôi uu lênh chi môt lân mà thôi, vâng cách dó chính là dôi tuong
Prepared Statements.
- Dôi khi ban muôn thuc hiên môt lênh SQL mà các thông sô cu thê lai chua biêt, trong
truong hop này bát buôc ban phai su dung truy vân tham sô hoá, tuy nhiên dôi tuong
Statement lai không hô tro truy vân tham sô hoá
Ví du: Sau câp nhât môt sô dòng cua bang COFFEES su dung dôi tuong Prepared
Statements
PreparedStatement updateSales;
String updateString = "update COFFEES set SALES = ? where COF_NAME like ?";
updateSales = con.prepareStatement(updateString);
int [] salesForWeek = {175, 150, 60, 155, 90};
String [] coffees = {"Colombian", "French_Roast", "Espresso",
"Colombian_Decaf", "French_Roast_Decaf"};
int len = coffees.length;
for(int i = 0; i < len; i++) {
updateSales.setInt(1, salesForWeek[i]);
updateSales.setString(2, coffees[i]);
updateSales.executeUpdate();
Trang 160
}
Nhu ban thây qua ví du trên dê:
+ Lây vê dôi tuong PreparedStatement ban su dung phuong thuc prepareStatement
cua dôi tuong Connection và truyên vào môt câu lênh SQL chua tham sô
+ Gán giá tri cho các tham sô ban su dung phuong thuc setXXX(index, value)
+ Thuc thi truy vân voi các tham sô vua cung câp ban goi phuong thuc
executeUpdate() cua doi tuong prepareStatement.
3. Goi thu tuc luu trû báng JDBC
JDBC cho phép ban goi môt thu tuc luu tru trong CSDL, tu trong ung dung viêt
báng java, dê có thê goi môt thu tuc luu tru truoc tiên ban tao ra môt dôi tuong
CallableStatement dôi tuong này có phuong thuc prepareCall giúp ban có thê goi thu
tuc luu tru nôi
Các buoc: 1. CallableStatement cs = con.prepareCall("{call tên_thu_tuc_luu_tru}");
2. Goi thu tuc executeXXX() tuong ung dê thuc thi thu tuc luu tru.
VI. Quan lý giao dich
Khi môt kêt nôi duoc tao, nó duoc dát trong trang thái auto- commit, tuc là nó tu
dông commit sau khi thuc thi thành công môt lênh don, tuy nhiên ban có thê dát lai
chê dô auto- commit dê ban có thê quyêt dinh commit hay rollback lai môt nhóm
lênh. Nhu doan mã sau:
con.setAutoCommit(false);
Ví du:
// Tát chê dô auto-commit
con.setAutoCommit(false);
// tác dông lên CSDL
PreparedStatement updateSales = con.prepareStatement(
"UPDATE COFFEES SET SALES = ? WHERE COF_NAME LIKE ?");
updateSales.setInt(1, 50);
updateSales.setString(2, "Colombian");
updateSales.executeUpdate();
PreparedStatement updateTotal = con.prepareStatement(
"UPDATE COFFEES SET TOTAL = TOTAL + ? WHERE COF_NAME LIKE ?");
updateTotal.setInt(1, 50);
updateTotal.setString(2, "Colombian");
updateTotal.executeUpdate();
// Xác nhân commit
con.commit();
// dát lai chê dô auto-commit
con.setAutoCommit(true);
Ví du: Lóp truy câp AccessDriver
Trang 161
import java.sql.*;
import java.util.*;
import java.io.*;
public class AccessDriver {
public static void main(String[] args) throws SQLException,IOException{
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //Nap trinh dieu khien Access
}
catch (ClassNotFoundException ex) {
System.out.print("Error: " + ex.getMessage());
}
try {
Properties pro = new Properties();
pro.put("charSet", "UTF8"); //ma unicode
String urldb ="jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=c:/data.mdb";
Connection conn = DriverManager.getConnection(urldb, pro);
PreparedStatement pst = conn.prepareStatement("Insert into test(a,b) values (?,?)");
pst.setString(1, "0021");
pst.setString(2, "Tran Thi Hong Ha");
boolean yes = pst.execute(); //PreparedStatement interface thuc thi sql co tham so
dau vao
System.out.println(yes);
Statement st =
conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
//st.executeUpdate("Create Table Test (a text(10),b text(255))");
st.executeUpdate( "Insert Into Test(a,b) values ('1234','Nguyen Xuan Truong')");
// st.executeUpdate("update test set b='dhrhrtr' where a='0021'");
st.executeUpdate("Delete from test where a='12'");
String sql = "Select * from test";
ResultSet rs = st.executeQuery(sql); //lay ve tap ban ghi
//cap nhat du lieu bang ResultSet
// rs.moveToCurrentRow();
rs.moveToInsertRow();
rs.updateString("a", "rs.update");
rs.updateString("b", "Cap nhat du lieu bang 455454ResultSet");
//rs.updateRow();
rs.insertRow();
//Xoa du lieu bang ResultSet
rs.absolute(3); //System.out.println("Rs.absolute(1) " + rs.getString(1));
rs.deleteRow();
//Updatable test
ResultSetMetaData rd = rs.getMetaData();
if (rs.getConcurrency() == ResultSet.CONCUR_UPDATABLE)
System.out.println("Rs is Updatable");
else System.out.println("Rs is ReadOnly");
int cols = rd.getColumnCount();
System.out.println("Start----->rd.getColumnLabel");
for (int i = 1; i <= cols; i++) //return feildName
System.out.print(rd.getColumnLabel(i) + ( (i == cols) ? "\n" : "\t"));
Trang 162
System.out.println("End----->rd.getColumnLabel");
while (rs.next()) { //hien thi thong tin, in xuoi
System.out.println(rs.getString("a") + " " + rs.getString("b"));
}
System.out.println("--------------------------------");
rs.last(); //in nguoc lai
while (rs.previous()) {
System.out.println(rs.getString("a") + " " + rs.getString("b"));
}
rs.close();
conn.close();
}
catch (SQLException ex) {
System.out.print("Error: maxlenght 10 " + ex.getMessage());
}
}
}
Ví du: Lop truy câp SQLDriver
import java.sql.*;
public class SQLDriver {
public static void main(String []a){
try{ //Nap trinh dieu khien SQLServer
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
}
catch(ClassNotFoundException ex){
System.out.println("Can not load driver " +ex.getMessage());
System.exit(0);
} //jdbc:microsoft:sqlserver://server1:1433;user=test;password=secret
String
url="jdbc:microsoft:sqlserver://xuantruong:1433;DatabaseName=BOOK;user=sa;passwor
d=";
try{ Connection conn=DriverManager.getConnection(url);
Statement st=conn.createStatement();
ResultSet rs=st.executeQuery("Select * from tblSach");
while(rs.next()){
System.out.println(rs.getString(1)+"\t\t"+rs.getString(2));
}
rs.close();
conn.close();
}
catch(SQLException ex){
System.out.println("Can not connection to database " + ex.getMessage());
System.exit(0);
}
System.out.println("OK");
}
}
Ví du:Lóp truy câp JdbcOdbcDriver
Trang 163
package com.borland.samples.welcome;
import java.sql.*;
import javax.sql.*;
public class Connect {
public static void main(String args[]) throws ClassNotFoundException,SQLException {
System.out.println("Ket noi CSDL");
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String url="jdbc:odbc:myDatabase";
Connection conn=DriverManager.getConnection(url,"login","password");
Statement stmt=conn.createStatement();
//Them record vao bang
String sql0="INSERT INTO KhachHang(Id,TenKH,DiaChi,Luong) VALUES('8','Hoang
Anh','HP','900')";
stmt.executeUpdate(sql0);
//Cap nhat du lieu (Tang luong cho cac cong nhan)
String sql2="UPDATE Khachhang SET Luong=Luong+luong*0.1";
int n=stmt.executeUpdate(sql2);
if (n < 1) System.out.println("Khong co ban ghi nao duong cap nhat");
else System.out.println("Co "+ n +" ban ghi nao duong cap nhat");
//Doc Record ra mh
String sql="SELECT Id,TenKH,DiaChi,Luong FROM KhachHang";
ResultSet rs=stmt.executeQuery(sql);
while (rs.next())
{ int id=rs.getInt("Id");
double l=rs.getDouble("Luong");
String s=rs.getString("TenKH");
String d=rs.getString("DiaChi");
System.out.println("ID=" +id +" " + s+ " " + d + " Luong=" + l) ;
}
} catch(SQLException e) {System.out.println("Loi thao tac CSDL");}
}
}
Trang 164
Chuong 8: LAP TRÌNH SOCKET
I. Các kiên thúc liên quan
Truoc khi bát dâu hoc bài này các ban cân doc lai các kiên thuc liên quan sau:
- Giao thuc, yêu câu tôi thiêu các ban phai nám duoc 3 giao thuc : IP, TPC, UDP
- Cách dánh dia chi IP, dia chi dang tên miên, giao thuc chuyên dôi dia chi IP thành dia chi
tên miên, và nguoc lai
- Môt sô dia chi dác biêt: dia chi láp, dia chi broadcash, multicash…
- Công giao thuc
- Phân biêt duoc su khác nhau, giông nhau giua 2 giao thuc TCP và UDP
1. Giói thiêu Socket
Socket là môt giao diên lâp trình ung (API - Application Program Interface) dung
mang, thông qua giao diên này ta có thê lâp trình diêu khiên viêc truyên thông giua 2 máy
su dung các giao thuc muc thâp nhu TCP, UDP…, Socket là môt su truu tuong hoá o muc
cao, có thê tuong tuong, nó nhu là môt thiêt bi truyên thông 2 chiêu tuong tu nhu têp tin,
chúng ta gui/ nhân du liêu giua 2 máy, tuong tu nhu viêc doc/ ghi trên têp tin.
Dê liên lac thông qua Socket, ta cân tiên hành các thao tác:
- Tao lâp hay mo môt Socket
+ Gán môt Socket voi môt dia chi, dia chi này chính là dia chi cua máy mà nó cân liên lac
+ Thuc hiên viêc liên lac, có 2 kiêu liên lac tuy thuôc vào chê dô kêt nôi:
a) Liên lac trong chê dô không kêt nôi:
Hai tiên trình liên lac voi nhau không kêt nôi truc tiêp
môi thông diêp gui di phai kèm theo dia chi cua nguoi nhân
Hình thuc liên lac này có dác diêm:
nguoi gui không chác chán thông diêp cua ho có dên tay nguoi nhân không
môt thông diêp có thê gui nhiêu lân
thông diêp gui sau có thê dên dích truoc thông diêp gui truoc dó
b) Liên lac trong chê dô kêt nôi:
Có môt duong kêt nôi “ao” duoc thành lâp giua 2 tiên trình, truoc khi môt kêt nôi duoc
thành lâp thì môt trong 2 tiên trình phai doi tiên trình kia yêu câu kêt nôi, có thê su dung
Socket dê liên lac theo mô hình Client/Server. Trong mô hình này server su dung loi goi
listen và accept dê láng nghe và châp nhân môt yêu câu kêt nôi
2. Lâp trình Socket trong java
Java cung câp môt sô lop cho phép các ung dung mang có thê trao dôi voi nhau qua
co chê Socket, cu thê lop Socket cung câp cho ta co chê liên lac trong chê dô kêt nôi (su
dung giao thuc TCP) và lop DatagramSocket cho phép các ung dung mang liên lac voi
nhau trong chê dô không kêt nôi (su dung giao thuc UDP), tât ca các lop liên quan dên viêc
lâp trình Socket duoc java nhóm lai và dê trong gói java.net
II. Khao sát môt sô lóp trong gói java.net
1. Lóp InetAddress
Môi môt máy khi tham gia truyên thông cân phai có môt dinh danh, dinh danh này
phai là duy nhât, dinh danh này duoc thê hiên báng dia chi IP hoác dia chi duoi dang
Trang 165
tên miên. Lop InetAddress biêu thi cho môt dia chi cua môt máy nào dó, khi ta muôn
liên lac voi môt máy o xa, ta phai biêt duoc dia chi IP cua máy o xa, tuy nhiên dia
chi IP thì rât khó nho, dôi khi ta không thê biêt chính xác dia chi IP cua máy dó, boi
vì nhiêu nguyên nhân khác nhau nhu: máy dó khoi dông tu xa hoác duoc nôi vào
nhà cung câp dich vu Internet, do vây môi lân kêt nôi vào nhà cung câp dich vu ISP
ta lai có 1 dia chi IP khác nhau. Vây thê thì làm thê nào dê ta có thê liên lac voi máy
o xa khi ta chi biêt dia chi máy dó duoi dang tên miên?, câu tra loi là lop
InetAddress dã làm diêu dó cho ta, lop này tu dông chuyên dia chi dang tên miên
thành dia chi IP và nguoc lai.
Lop InetAddress cung câp môt sô phuong thuc tinh (static) dùng dê chuyên dôi dia chi
duoi dang tên miên thành dia chi IP và nguoc lai. Có môt sô phuong thuc sau mà ban cân
quan tâm:
Phuong pháp Mô ta
Public void equals( Object obj) So sánh 2 dôi tuong
Public byte[] getAddress() Lây vê dia chi IP duoi dang mang byte
public static InetAddress[]
getAllByName(String host)
throws UnknownHostException
Tra vê mang dôi tuong InetAddress, vì môt máy
có thê có nhiêu dia chi IP (do có nhiêu card
mang), nên phuong thuc này tra vê môt mang
chua tât ca các dia chi tuong ung voi tên miên.
public static InetAddress
getByName(String host)
throws UnknownHostException
Tra lai dôi tuong InetAddress có tên duoc chi
ra, tên này là môt xâu kí tu duoi dang tên miên
hoác dia chi IP
public String getHostAddress() Tra vê dia chi IP cua máy chu
public String getHostName() Tra vê tên cua máy chu
public static InetAddress
getLocalHost()
throws UnknownHostException
Tra vê dôi tuong InetAddress kêt hop voi chính
máy dó
public boolean isMulticastAddress() Kiêm tra xem dia chi này có phai là dia chi
Multicast không
Chú ý:
Trong gói java.net còn lop Inet4Address và lop Inet6Address hai lop này thê hiên cho
các dia chi IP version 4 và IP version 6, nó gôm tât ca các thành phân cua lop
InetAddress
Ta cân thêm mênh dê import lop java.net.InetAddress truoc khi có thê su dung nó.
Trang 166
Phuong thuc getByName së có gáng phân giai tên miên thành dia chi IP tuong ung báng
cách: Truoc tiên nó di tìm trong cache, nêu không tìm thây nó tìm tiêp trong têp host,
nêu vân không tìm thây nó së cô gáng kêt nôi dên máy chu DNS dê yêu câu phân giai
tên này thành dia chi IP, nêu không thê phân giai duoc tên này thì nó së sinh ra môt
ngoai lê UnknownHostException, thê nên ban cân dát chúng vào môt khôi try ..catch.
Ví du 1: Minh hoa cách su dung các phuong thuc getByName dê tao ra môt InetAddress
import java.net.*;
class InetAddress1 {
public static void main(String[] args) {
try {
InetAddress address = InetAddress.getByName("www.theht.edu.vn");
System.out.println(address);
}
catch (UnknownHostException ex) {
System.out.println("Could not find www.theht.edu.vn");
}
}
}
Kêt qua chay chuong trình nhu sau:
www.theht.edu.vn/127.0.0.1Ngoài cách truyên vào phuong thuc getByName môt xâu ký tu
thê hiên tên máy ban ta thê truyên vào môt xâu thê hiên dia chi IP cua máy nhu sau:
InetAddress address = InetAddress.getByName("192.168.101.1");
Ví du 2: Tao ra môt InetAddress tuong ung voi máy cuc bô:
import java.net.*;
class MyAddress {
public static void main(String[] args) {
try {
InetAddress address = InetAddress.getLocalHost();
System.out.println(address);
}
catch (UnknownHostException ex) {
System.out.println("Could not find this computer's address.");
}
}
}
Kêt qua chay chuong trình nhu sau:
Trang 167
theht1/192.168.101.1Ví du 3: Nêu máy ban có cài nhiêu card mang ban có thê lây vê môt
mang các InetAddess tuong ung voi dia chi IP cho tung card mang dó:
import java.net.*;
class AllAddressesOfTheht {
public static void main(String[] args) {
try {
InetAddress[] addresses =
InetAddress.getAllByName("www.theht.edu.vn");
for (int i = 0; i < addresses.length; i++) {
System.out.println(addresses[i]);
}
}
catch (UnknownHostException ex) {
System.out.println("Could not find www.theht.edu.vn");
}
}
}
Kêt qua chay chuong trình nhu sau:
www.theht.edu.vn /192.168.101.1www.theht.edu.vn /10.0.0.2www.theht.edu.vn
/162.163.10.5www.theht.edu.vn /3.152.90.25so di cho kêt qua nhu trên là do máy cua tôi
có cài 4 card mang, tuong ung voi môi card mang tôi dát môt dia chi IP cho nó.
Nêu máy cua ban có nôi mang Internet ban có thê kiêm tra xem máy chu
www.microsoft.com cua Microsoft duoc cài bao nhiêu bô giao tiêp mang báng cách
thayInetAddress.getAllByName("www.theht.edu.vn"); boi
InetAddress.getAllByName("www.microsoft.com");
Ví du 4: Lây vê tên máy khi biêt dia chi IP cua nó, dê lây vê tên cua máy ta su dung
phuong thuc getHostName nhu sau:
import java.net.*;
class ReverseTest {
public static void main(String[] args) {
try {
InetAddress ia = InetAddress.getByName("162.163.10.5");
System.out.println(ia.getHostName());
} catch (Exception ex) {
System.err.println(ex);
}
}
}
Trang 168
Kêt qua ra nhu sau:
theht
Ví du 5: Lây vê dia chi IP cua máy khi biêt tên cua máy, dê lây vê dia chi IP cua máy ta su
dung phuong thuc getHostAddress nhu sau:
import java.net.*;
class GetHostAddress {
public static void main(String[] args) {
try {
InetAddress me = InetAddress.getLocalHost();
String dottedQuad = me.getHostAddress();
System.out.println("My address is " + dottedQuad);
}
catch (UnknownHostException ex) {
System.out.println("I'm sorry. I don't know my own address.");
}
}
}
Kêt qua in ra nhu sau:
My address is 192.168.101.1Ta có thê lây vê dia chi IP tuong ung voi môt tên miên bât ky
không nhât thiêt là máy cuc bô nhu trên, cháng han ban có thê lây vê dia chi IP cua máy
www.theht.edu.vn hoác www.microsoft.com nhu sau:
import java.net.*;
class GetHostAddress1 {
public static void main(String[] args) {
try {
InetAddress me = InetAddress.getByName("www.theht.edu.vn");
String dottedQuad = me.getHostAddress();
System.out.println("Address is " + dottedQuad);
}
catch (UnknownHostException ex) {
System.out.println("I'm sorry. I don't know my own address.");
}
}
}
Kêt qua in ra nhu sau:
Address is 192.168.101.1
Trang 169
Ví du 6: Kiêm tra xem hai dia chi tên miên có cùng môt dia chi IP hay không. dê kiêm tra
diêu này ta su dung phuon thuc equals nhu sau:
import java.net.*;
class Equal {
public static void main(String args[]) {
try {
InetAddress add1 = InetAddress.getByName("www.theht.edu.vn");
InetAddress add2 = InetAddress.getByName("www.theht.com.vn");
if (add1.equals(add2)) {
System.out.println("Hai dia chi nay co cung IP");
}
else {
System.out.println("Hai dia chi nay khac IP");
}
}
catch (UnknownHostException ex) {
System.out.println("Khong the tim thay host.");
}
}
}
Kêt qua cho nhu sau:
Hai dia chi nay khac nhau
Ví du 7: Xây dung chuong trìn HostLookup tuong tu nhu chuong trình NSLookup cua
Windows, chuong trình này có nhiêm vu khi ban gõ vào dia chi IP thì nó së tra vê dia chi
tên miên và nguoc lai:
import java.net.*;
import java.io.*;
public class HostLookup {
public static void main(String[] args) {
if (args.length > 0) {
// Su dung tham so dong lenh
for (int i = 0; i < args.length; i++) {
System.out.println(lookup(args[i]));
}
}
else {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
Trang 170
System.out.println(
"Enter names and IP addresses.Enter \"exit\" or \"quit\" to quit.");
try {
while (true) {
String host = in.readLine();
if (host.equalsIgnoreCase("exit") ||
host.equalsIgnoreCase("quit")) {
break;
}
System.out.println(lookup(host));
}
}
catch (IOException ex) {
System.err.println(ex);
}
}
}
private static String lookup(String host) {
InetAddress node;
try {
node = InetAddress.getByName(host);
}
catch (UnknownHostException ex) {
return "Cannot find host " + host;
}
if (isHostname(host)) {
//Dia chi nay duoi dang ten mien
return node.getHostAddress();
}
else {
// Dia chi nay duoi dang IP
return node.getHostName();
}
}
//Hàm kiêm tra xem dia chi host duói dang tên miên hay dia chi IP
private static boolean isHostname(String host) {
char[] ca = host.toCharArray();
for (int i = 0; i < ca.length; i++) {
Trang 171
if (!Character.isDigit(ca[i])) {
if (ca[i] != '.')return true;
}
}
return false;
}
}
2. Lóp URL và URI
Lop URL là môt lop rât don gian giúp ban trong viêc dinh vi và lây vê du liêu tu
mang, mà ban không cân phai quan tâm dên giao thuc duoc su dung, dinh dang cua du liêu
hoác không cân quan tâm dên cách giao tiêp voi máy chu.
Tao ra môt URL
Không giông nhu dôi tuong InetAddress ban có thê su dung hàm tao cua lop URL dê tao ra
môt dôi tuong URL moi. Có sáu hàm tao khác nhau cua lop URL cho phép ban tao ra các
URL voi các yêu câu khác nhau. Tât ca các hàm tao này dêu ném ra ngoai lê
MalformedURLException nêu ban tao ra môt URL tu môt giao thuc không duoc hô tro
hoác các thông tin cung câp trong URL không chính xác thì ban së nhân duoc môt ngoai lê
MalformedURLException
a) Tao ra môt URL tù môt xâu
public URL(String url) throws MalformedURLException
Giông nhu các hàm tao khác ban chi cân dùng toán tu new và cung giông các hàm tao khác
cua lop nó ném ra ngoai lê MalformedURLException.
Ví du 1: Tao ra môt URL tu môt xâu và bát ngoai lê sinh ra
try {
URL u = new URL("http://www.utehy.edu.vn/");
}
catch (MalformedURLException ex) {
System.err.println(ex);
}
Ví du 2: Ví du này tao ra môt sô URL và kiêm tra xem giao thuc tuong ung voi các URL
có duoc hô trõ trong virtual machine cua ban hay không
/* Which protocols does a virtual machine support? */
import java.net.*;
class ProtocolTester {
public static void main(String[] args) {
testProtocol("http://www.adc.org"); // hypertext transfer protocol
testProtocol("https://www.amazon.com/exec/obidos/order2/"); // secure http
// file transfer protocol
testProtocol("ftp://metalab.unc.edu/pub/languages/java/javafaq/");
testProtocol("mailto:elharo@metalab.unc.edu"); // Simple Mail Transfer Protocol
testProtocol("telnet://dibner.poly.edu/"); // telnet
testProtocol("file:///etc/passwd"); // local file access
testProtocol("gopher://gopher.anc.org.za/"); // gopher
testProtocol( // Lightweight Directory Access Protocol
Trang 172
"ldap://ldap.itd.umich.edu/o=University%20of%20Michigan,c=US?postalAddress");
testProtocol( // JAR
"jar:http://cafeaulait.org/books/javaio/ioexamples/javaio.jar!"
+ "/com/macfaq/io/StreamCopier.class");
testProtocol("nfs://utopia.poly.edu/usr/tmp/"); // NFS, Network File System
testProtocol("jdbc:mysql://luna.metalab.unc.edu:3306/NEWS");
// a custom protocol for JDBC
// rmi, a custom protocol for remote method invocation
testProtocol("rmi://metalab.unc.edu/RenderEngine");
testProtocol("doc:/UsersGuide/release.html"); // custom protocols for HotJava
testProtocol("netdoc:/UsersGuide/release.html");
testProtocol("systemresource://www.adc.org/+/index.html");
testProtocol("verbatim:http://www.adc.org/");
}
private static void testProtocol(String url) {
try {
URL u = new URL(url);
System.out.println(u.getProtocol() + " is supported");
}
catch (MalformedURLException ex) {
String protocol = url.substring(0, url.indexOf(':'));
System.out.println(protocol + " is not supported");
}
}
}
Kêt qua chay trên máy cua tôi nhu sau:
http is supported
https is supported
ftp is supported
mailto is supported
b) Tao ra môt URL tù các phân riêng le
Hàm tao này cho gôm ba phân riêng biêt, chúng cho biêt: Giao thuc, tên máy chu,
têp tin mà URL này su dung.
public URL(String protocol, String hostname, String file)
throws MalformedURLException
Hàm tao này së tu dông dát port là giá tri mác dinh, tuy theo giao thuc mà ban chi
dinh nó së su dung mà giá tri mác dinh này là khác nhau: Ví du nhu : http thì port=80,
ftp=23...
Ví du:
try {
URL u = new URL("http", "www.microsoft.com", "/index.html");
}
catch (MalformedURLException ex) {
// All VMs should recognize http
}
Doan chuong trình trên tao ra môt URL chi dên http://www.microsoft.com/index.html,
công mác dinh là 80
Trang 173
Dê tao ra môt URL voi môt công chi dinh ban su dung hàm tao sau:
public URL(String protocol, String host, int port, String file) throws
MalformedURLException
Ví du: Tao ra môt URL gán voi máy localhost trên công 8080
try {
URL u = new URL("http", "localhost", 8080, "/index.html");
}
catch (MalformedURLException ex) {
System.err.println(ex);
}
Ví du này tao ra môt URL tro dên http://localhost: 8080/index.html
c) Tao ra môt URL tù môt URL khác
Hàm tao này cho phép ban tao ra môt URL tu môt URL khác, cú pháp nhu sau:
public URL(URL base, String relative) throws MalformedURLException
Ví du:
try {
URL u1 = new URL("http://www.ibiblio.org/javafaq/index.html");
URL u2 = new URL (u1, "mailinglists.html");
}
catch (MalformedURLException ex) {
System.err.println(ex);
}
Trong ví du này thì u1 dang tro dên http://www.ibiblio.org/javafaq/index.html còn u2 thì
dang tro dên http://www.ibiblio.org/javafaq/ mailinglists.html.
Môt vài phuong thúc cua lóp URL
- public String getHost( ) tra vê tên cua máy chu
- public int getPort( ) tra vê công duoc su dung
- public int getDefaultPort( ) tra vê công mác dinh cua giao thuc duoc su dung. Ví du nhu :
http=80, email=25, ftp=23...
- public String getFile( ) tra vê tên têp tin
- public String getPath( ) // Java 1.3 tra vê duong dân dên file, duong dân này thuong là
môt query string.
- public String getRef( ), trong ví du sau thì getRef së tra vê xtocid1902914
URL u = new URL(
"http://www.ibiblio.org/javafaq/javafaq.html#xtocid1902914");
System.out.println("The fragment ID of " + u + " is " + u.getRef( ));
- public String getQuery( ) // Java 1.3 tra vê môt query string trong URL
Ví du: Trong ví du này thì getQuery së tra vê category=Piano
URL u = new URL(
"http://www.ibiblio.org/nywc/compositions.phtml?category=Piano");
System.out.println("The query string of " + u + " is " + u.getQuery( ));
- public String getUserInfo( ) // Java 1.3 tra vê user name
- public String getAuthority( ) // Java 1.3
Trang 174
Ví du sau minh hoa các phuong thuc trên
import java.net.*;
class URLSplitter {
public static void main(String args[]) {
try {
URL u = new URL("http://java.sun.com");
System.out.println("The URL is " + u);
System.out.println("The scheme is " + u.getProtocol());
System.out.println("The user info is " + u.getUserInfo());
String host = u.getHost();
if (host != null) {
int atSign = host.indexOf('@');
if (atSign != -1) host = host.substring(atSign + 1);
System.out.println("The host is " + host);
}
else {
System.out.println("The host is null.");
}
System.out.println("The port is " + u.getPort());
System.out.println("The path is " + u.getPath());
System.out.println("The ref is " + u.getRef());
System.out.println("The query string is " + u.getQuery());
} // end try
catch (MalformedURLException ex) {
System.err.println("is not a URL I understand.");
}
System.out.println();
} // end main
} // end URLSplitter
Kêt qua chay chuong trình nhu sau:
The URL is http://java.sun.comThe scheme is httpThe user info is nullThe host is
java.sun.comThe port is -1The path is The ref is nullThe query string is nullc) Nhân vê dû
liêu tù URL
Ban có thê nhân vê du liêu duoc chi dinh trong URL báng cách su dung cách phuon thuc
sau:
public InputStream openStream( ) throws IOException
public URLConnection openConnection( ) throws IOException
public URLConnection openConnection(Proxy proxy) throws IOException // 1.5
public Object getContent( ) throws IOException
public Object getContent(Class[] classes) throws IOException // 1.3
public final InputStream openStream( ) throws IOException
Phuong thuc này së kêt nôi dên máy chu và yêu câu lây vê môt InputStream gán voi tài
nguyên duoc chi dinh trong URL.
Trang 175
Ví du sau lây vê nôi dung cua trang web duoc chi dinh và in ra màn hình
import java.net.*;
import java.io.*;
class SourceViewer {
public static void main(String[] args) {
try { //Open the URL for reading
URL u = new URL("http://localhost:80/index.html");
InputStream in = u.openStream(); // buffer the input to increase performance
in = new BufferedInputStream(in); // chain the InputStream to a Reader
Reader r = new InputStreamReader(in);
int c;
while ( (c = r.read()) != -1) {
System.out.print( (char) c);
}
}
catch (MalformedURLException ex) {
System.err.println("is not a parseable URL");
}
catch (IOException ex) {
System.err.println(ex);
}
} // end main
} // end SourceViewer
Kêt qua chay nhu sau:
<html><head><meta http-equiv="Content-Type"content="text/html; charset=iso-8859-
1"><title> Web Posting Information </title></head><body><p><font
face=".VnTime">Xin chào các ban</font></p></body></html>
- Phuong thúc public URLConnection openConnection( ) throws IOException
Phuong thuc này mo môt socket kêt nôi dên máy chu. Nêu phuong thuc này thât bai
nó ném ra ngoai lê IOException.
Ví du:
try {
URL u = new URL("http://www.jennicam.org/");
try {
URLConnection uc = u.openConnection( );
InputStream in = uc.getInputStream( );
// read from the connection...
} // end try
catch (IOException ex) {
System.err.println(ex);
}
} // end try
catch (MalformedURLException ex) {
System.err.println(ex);
}
Trang 176
Trong java 1.5 còn môt phuong thuc duoc nap chông nhu sau:
public URLConnection openConnection(Proxy proxy) throws IOException
Phuong thuc này rât huu dung khi trong mang cua ban có su dung proxy
- Phuong thúc public final Object getContent( ) throws IOException
Ví du:
import java.net.*;
import java.io.*;
class ContentGetter {
public static void main(String[] args) {
//Open the URL for reading
try {
URL u = new URL("http://localhost:80/index.html");
try {
Object o = u.getContent();
System.out.println("I got a " + o.getClass().getName());
} // end try
catch (IOException ex) {
System.err.println(ex);
}
} // end try
catch (MalformedURLException ex) {
System.err.println("is not a parseable URL");
}
} // end main
} // end ContentGetter
Kêt qua chay nhu sau:
I got a sun.net.www.protocol.http.HttpURLConnection$HttpInputStreamNêu thay URL
u = new URL("http://localhost:80/index.html"); boi URL u = new
URL("http://localhost:80/print.gif"); kêt qua thu duoc nhu sau:
I got a sun.awt.image.URLImageSource
3. Lóp Socket
Lop này duoc dùng cho ca máy chu và máy khách. Dôi voi máy khách nó thuong dùng dê
kêt nôi dên máy chu, còn dôi voi máy chu nó thuong dùng dê dáp lai kêt nôi tu máy khách.
Thông thuong ta tao ra môt Socket báng cách su dung hàm tao cua lop Socket. Sau dây là
môt sô hàm tao cua lop Socket.
3.1 Môt sô hàm tao cua lóp Socket
a) public Socket(String host, int port) throws UnknownHostException, IOException
Ta thuong su dung hàm tao này dê kêt nôi dên máy chu. Trong hàm tao này tên cua
máy là môt xâu ký tu, tên cua máy chu có thê là tên mìên hoác dia chi IP. Nêu nhu không
tôn tai máy này thì nó së ném ra môt ngoai lê UnknownHostException. Nêu Socket không
thê mo vì bât cu lý do nào thì nó ném ra ngoai lê IOException.
Trang 177
Ví du: Kêt nôi dên web server www.theht.edu.vn
try {
Socket toTheht= new Socket("www.theht.edu.vn", 80);
//~ Socket toTheht= new Socket("162.163.10.5", 80);
// send and receive data...
}
catch (UnknownHostException ex) {
System.err.println(ex);
}
catch (IOException ex) {
System.err.println(ex);
}
- public Socket(InetAddress host, int port) throws IOException
Ta thuong su dung hàm tao này dê kêt nôi dên máy chu khi biêt môt InetAddress gán voi
nó.
Ví du sau kêt cung kêt nôi dên máy chu www.theht.edu.vn trên công 80
try {
InetAddress theht = InetAddress.getByName("www.theht.edu.vn");
//~ InetAddress theht = InetAddress.getByName("162.135.10.5");
Socket thehtSocket = new Socket(theht , 80);
// send and receive data...
}
catch (UnknownHostException ex) {
System.err.println(ex);
}
catch (IOException ex) {
System.err.println(ex);
}
- public Socket(String host, int port, InetAddress interface, int localPort) throws
IOException, UnknownHostException
Nêu máy cua ban có nhiêu bô giao tiêp mang thì khi kêt nôi dên máy chu ta cân chi
ra kêt nôi duoc thiêt lâp thông qua giao diên mang nào.
Nêu tham sô port nhân giá tri 0 thi java runtime së chon ngâu nhiên môt công nào dó chua
duoc su dung trong khoang 1024 à 65535.
Ví du:
try {
InetAddress inward = InetAddress.getByName("theht");
Socket socket = new Socket("www.theht.edu.vn", 80, inward, 0);
// work with the sockets...
}
catch (UnknownHostException ex) { System.err.println(ex);
}
catch (IOException ex) {
System.err.println(ex);
}
Trang 178
- public Socket(InetAddress host, int port, InetAddress interface, int localPort) throws
IOException
Hàm tao này cung tuong tu nhu hàm tao trên.
Ví du:
try {
InetAddress inward = InetAddress.getByName("theht");
InetAddress http= InetAddress.getByName("www.theht.edu.vn");
Socket socket = new Socket(http, 80, inward, 0);
// work with the sockets...
}
catch (UnknownHostException ex) {
System.err.println(ex);
}
catch (IOException ex) {
System.err.println(ex);
}
3.2. Lây vê thông tin gán vói Socket
- Phuong thuc public InetAddress getInetAddress( ) dùng dê lây vê dôi tuong InetAddress
tuong ung voi máy remote.
try {
Socket theSocket = new Socket("java.sun.com", 80);
InetAddress host = theSocket.getInetAddress( );
System.out.println("Connected to remote host " + host);
} // end try
catch (UnknownHostException ex) {
System.err.println(ex);
}
catch (IOException ex) {
System.err.println(ex);
}
- Phuong thuc public int getPort( ) dùng dê lây vê công cua máy remote.
Ví du:
try {
Socket theSocket = new Socket("java.sun.com", 80);
int port = theSocket.getPort( );
System.out.println("Connected on remote port " + port);
} // end try
catch (UnknownHostException ex) {
System.err.println(ex);
}
catch (IOException ex) {
System.err.println(ex);
}
Trang 179
- Phuong thuc public int getLocalPort( ) dùng dê lây vê công cua máy cuc bô dùng dê
giao tiêp voi máy o xa.
Ví du:
try {
Socket theSocket = new Socket("java.sun.com", 80);
int localPort = theSocket.getLocalPort( );
System.out.println("Connecting from local port " + localPort);
} // end try
catch (UnknownHostException ex) {
System.err.println(ex);
}
catch (IOException ex) {
System.err.println(ex);
}
- Phuong thuc public InetAddress getLocalAddress( ) dùng dê lây vê dôi tuong
InetAddress gán voi card mang dùng dê giao tiêp.
Ví du:
try {
Socket theSocket = new Socket(hostname, 80);
InetAddress localAddress = theSocket.getLocalAddress( );
System.out.println("Connecting from local address " + localAddress);
} // end try
catch (UnknownHostException ex) {
System.err.println(ex);
}
catch (IOException ex) {
System.err.println(ex);
}
Ví du sau in ra màn hình môt sô thông tin gán voi Socket
import java.net.*;
import java.io.*;
public class SocketInfo {
public static void main(String[] args) {
try {
Socket theSocket = new Socket("www.theht.edu.vn", 80);
System.out.println("Connected to " + theSocket.getInetAddress()
+ " on port " + theSocket.getPort() + " from port "
+ theSocket.getLocalPort() + " of "
+ theSocket.getLocalAddress());
} // end try
catch (UnknownHostException ex) {
System.err.println("I can't find host");
}
Trang 180
catch (SocketException ex) {
System.err.println("Could not connect to host");
}
catch (IOException ex) {
System.err.println(ex);
}
} // end main
} // end SocketInfo
- Phuong thuc public OutputStream getOutputStream( ) throws IOException dùng dê lây
vê môt OutputStream. Viêc gui du liêu dên máy remote duoc thông qua OutputStream này.
- Phuong thuc public InputStream getInputStream( ) throws IOException phuong thuc này
dùng dê nhân vê môt InputStream. Viêc nhân du liêu tu máy remote duoc thuc hiên thông
qua InputStream này.
3.3. Dóng Socket
Khi kêt nôi không còn duoc su dung nua ban cân goi phuong thuc close() môt cách
tuong minh dê dóng Socket lai. Khi goi dên phuong thuc close java së tu dông dóng hai
luôn nhâp xuât gán voi nó. Viêc dóng Socket lai së giai phóng môt sô tài nguyên cua hê
thông.
public void close( ) throws IOException
Môt Socket së tu dông dóng lai nêu xây ra môt trong các tính huông sau:
- Ca hai luông nhâp xuât gán voi Socket dêu duoc dóng lai.
- Khi chuong trình kêt thúc.
- Hoác khi bô thu rác cua java duoc tiên hành.
Tuy các Socket cung tu dông dóng lai khi cân thiêt, nhung môt thói quen thuc hành
tôt là nên goi dên phuong thuc close() khi không còn dùng dên nó nua.
Dê dam bao Socket luôn duoc dóng lai cho dù có ngoai lê xây ra hay không. thì chô
hop lý nhât dê dóng Socket lai là trong khôi finally.
Ví du sau thê hiên diêu dó:
ocket connection = null;
try {
connection = new Socket("www.theht.edu.vn", 80);
// interact with the socket...
} // end try
catch (UnknownHostException ex) {
System.err.println(ex);
}
catch (IOException ex) {
System.err.println(ex);
}
finally {
// Dóng Socket lai
if (connection != null) connection.close( );
}
Trang 181
- Phuong thuc public boolean isClosed( ) (chi có trong java 1.4 tro lên) phuong thuc này
tra vê tru nêu nhu Socket dã duoc dóng lai, nhân vê false trong truong hop nguoc lai. Thê
nên dê dám bao các thao tác nhâp xuât không xây ra lôi ban nên su dung mâu chuong trình
sau:
if (socket.isClosed( )) {
// do something...
}
else {
// do something else...
}
Tuy nhiên nêu Socket chua bao gio duoc mo thì phuong thuc này tra vê false.
- Phuong thuc public boolean isConnected( ) (Chi có trong java 1.4 tro lên) phuong thuc
này tra vê true nêu ban dã tùng kêt nôi dên máy o xa hay chua và nhân vê false trong
truong hop nguoc lai.
Thê nên dê kiêm tra xem Socket có dang mo hay không ban cân su dung doan
chuong trình sau:
boolean connected = socket.isConnected( ) && ! socket.isClosed( );
- Phuong thuc public boolean isBound( ) (chi có trong java 1.4 tro lên) phuong thuc này
tra vê true nêu nhu Socket duoc liên kêt voi môt công cuc bô nào dó.
3.4. Truyên trong chê dô haft duplex
Kê tu phiên ban java 1.3 có thêm hai phuong thuc:
public void shutdownInput( ) throws IOException
public void shutdownOutput( ) throws IOException
Hai phuong thuc này cho phép ban dóng luông nhâp hoác xuât gán voi Socket lai.
khi này ban chi có thê truyên hoác nhân môt chiêu (haft duplex).
Ví du nhu khi ban kêt nôi dên web server dê yêu câu môt trang bât ky sau khi yêu câu xong
thì luông xuât là không còn cân thiêt nua. do vây ta nên dóng lai dê giai phóng tài nguyên.
Socket connection = null;
try {
connection = new Socket("www.theht.edu.vn", 80);
Writer out = new OutputStreamWriter(connection.getOutputStream( ));
out.write("GET / HTTP 1.0\r\n\r\n");
out.flush( );
/*
Dóng luông xuât lai. Sau khi dóng luông xuât ban vân có thê su dung luông nhâp môt cách
bình thuong
*/
connection.shutdownOutput( );
// read the response...
}
catch (IOException ex) {
}
finally {
try {
Trang 182
if (connection != null) connection.close( );
}
catch (IOException ex) {}
}
4. Lóp ServerSocket
Lop này chi dùng cho phía máy chu. Nó thuong duoc su dung dê láng nghe môt kêt nôi
dên.
4.1. Môt sô hàm tao cua lóp ServerSocket:
public ServerSocket(int port) throws BindException, IOException
public ServerSocket(int port, int queueLength)
throws BindException, IOException
public ServerSocket(int port, int queueLength, InetAddress bindAddress)
throws IOException
public ServerSocket( ) throws IOException // Java 1.4
Các hàm tao này xác dinh công, dô dài cua hàng doi dê luu tru các yêu câu kêt nôi
dên và giao diên mang duoc su dung. Bây gio ta xét cu thê tung hàm tao:
- Hàm tao public ServerSocket(int port) throws BindException, IOException
Hàm tao này së tao ra môt ServerSocket láng nghe trên công port. Nêu nhu port =0
thì hê thông së chon môt giá tri công còn rôi tiêp theo. Tuy nhiên trong truong hop này máy
khách khó có thê kêt nôi dên nó vì không biêt rõ công. Tuy nhiên trong môt sô truong hop
nó rât huu dung.
Ví du: Tao môt ServerSocket láng nghe trên công 80.
try {
ServerSocket httpd = new ServerSocket(80);
}
catch (IOException ex) {
System.err.println(ex);
}
Chú ý:
- Nêu không thê tao ra môt ServerSocket thì nó së ném ra ngoai lê IOException
- Nêu port dã duoc su dung cho môt chuong trình khác rôi thì ngoai lê BindException së
duoc ném ra.
Ví du tìm xem các công trên máy cua ban dã duoc su dung hay chua
package inetaddress;
import java.net.*;
import java.io.*;
class LocalPortScanner {
public static void main(String[] args) {
for (int port = 1; port <= 65535; port++) {
try {
// the next line will fail and drop into the catch block if
// there is already a server running on the port
ServerSocket server = new ServerSocket(port);
Trang 183
}
catch (IOException ex) {
System.out.println("There is a server on port " + port + ".");
} // end catch
} // end for
}
}
- Hàm tao public ServerSocket(int port, int queueLength) throws IOException,
BindException
Hàm tao này së tao ra môt ServerSocket láng nghe trên công port và tao ra môt hàng
doi cho phép queueLength kêt nôi nám trong hàng cho.
Ví du: Tao ra môt ServerSocket láng nghe trên công 3456 và cho phép tôi da 100
yêu câu kêt nôi dông thoi.
try {
ServerSocket httpd = new ServerSocket(3456, 100);
}
catch (IOException ex) {
System.err.println(ex);
}
- Hàm tao public ServerSocket(int port, int queueLength, InetAddress bindAddress)
throws BindException, IOException
Hàm tao này có nhiêm vu tuong tu hàm tao truoc dó. Tuy nhiên ServerSocket chi
láng nghe trên bô giao tiêp mang duoc chi ra trong tham sô thu 3. Nêu máy cua ban có
nhiêu bô giao tiêp mang thì ban cân phai chi ra ServerSocket này së láng nghe trên bô giao
tiêp nào.
Ví du: Gia su ráng máy cua ban có hai bô giao tiêp mang, môt bô giao tiêp mang có
dia chi 162.163.10.5 và môt bô giao tiêp mang khác có dia chi 192.168.101.1. Dê tao ra
môt ServerSocket láng nghe trên công 3456, bô giao tiêp mang 162.163.10.5 (chu không
phai là 192.168.101.1) và cho phép 100 yêu câu kêt nôi.
try {
ServerSocket httpd = new ServerSocket(3456, 100,
InetAddress.getByName("162.163.10.5"));
}
catch (IOException ex) {
System.err.println(ex);
}
- Hàm tao public ServerSocket( ) throws IOException // Java 1.4
Hàm tao này tao ra môt ServerSocket, tuy nhiên nó chua thuc su láng nghe trên công
nào ca. Thê nên ban cung chua thê goi phuong thuc accept dê châp nhân các kêt nôi. Dê
thu su liên kêt voi môt công nào dó ban cân goi phuong thuc bind(), dây là phuong thuc
chi có trong java 1.4 tro lên.
public void bind(SocketAddress endpoint) throws IOException // Java 1.4
public void bind(SocketAddress endpoint, int queueLength) // Java 1.4
throws IOException
Trang 184
Hàm tao này cung rât huu dung khi ban cân dát môt sô thuôc tính cho ServerSocket
truoc khi nó thuc su châp nhân các kêt nôi.
Thông thuong ban su dung mâu sau:
//Tao ra môt ServerSocket chua thuc su liên kêt voi môt công nào dó.
ServerSocket ss = new ServerSocket( );
// Thiêt dát môt sô thuôc tính cho Socket...
//Tao ra môt dôi tuong SocketAddress dê liên kêt
SocketAddress http = new InetSocketAddress(80);
//Liên kêt ServerSocket voi công 80
ss.bind(http);
4.2. Châp nhân và dóng kêt nôi
a) Châp nhân kêt nôi
Viêc tao ra môt ServerSocket chua thuc su châp nhân các kêt nôi dên. Dê châp nhân
kêt nôi dên ta cân goi dên phuong thuc accept() phuong thuc này së tam ngung tuyên thi
hành hiên tai cho dên khi có môt yêu câu kêt nôi dên. Khi có yêu câu kêt nôi dên thì tuyên
duoc tiêp tuc và hàm này tra vê cho ta môt dôi tuong Socket. Viêc giao tiêp voi máy khách
duoc tiên hành thông qua Socket này.
Chú ý: Phuong thuc accept() chi châp nhân môt kêt nôi dên mà thôi. do vây dê có thê châp
nhân nhiêu kêt nôi dên ban cân phai láp lai viêc goi dên phuong thuc accept() báng cách
dua chúng vào môt vòng láp nhu sau:
Ví du:
Chuong trình trên máy chu
//Server.java
import java.net.*;
import java.io.*;
class Server {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(3456);
while (true) {
Socket connection = server.accept();
OutputStreamWriter out
= new OutputStreamWriter(connection.getOutputStream());
out.write("You've connected to this server. Bye-bye now.\r\n");
out.flush();
connection.close();
}
}
}
Chuong trình trên máy khách
//Client.java
import java.net.*;
import java.io.*;
class Client {
public static void main(String[] args) throws IOException {
Socket sk = new Socket();
Trang 185
SocketAddress sv = new InetSocketAddress("theht1", 3456);
sk.connect(sv);
InputStream in = sk.getInputStream();
int c;
do {
c = in.read();
if (c == -1)break;
System.out.print( (char) c);
}
while (true);
}
}
Voi chuong trình trên ban chay Server môt lân sau dó ban có thê chay nhiêu chuong trình
máy khách.
b) Dóng kêt nôi
Khi kêt nôi không còn duoc su dung dên nua thì ta cân dóng lai dê giai phóng các
tài nguyên. Kêt nôi cung tu dông duoc dóng lai trong môt sô truong hop nhu: Chuong trình
kêt thúc, bô thu rác duoc tiên hành..., Tuy nhiên môt phong cách lâp trình tôt là luôn dóng
lai môt cách tuong minh khi không còn su dung dên nó nua.
Ví du:
ServerSocket server = new ServerSocket(port);
//Làm môt sô viêc
server.close( );
Trong java 1.4 bô sung thêm hai phuong thuc:
- public boolean isClosed( ) //Nêu kêt nôi dang mo thì tra vê tru và nguoc lai, tuy
nhiên nêu kêt nôi chua duoc mo thì nó cung tra vê false
- public boolean isBound( ) // Tra vê true nêu nó dã tung duoc liên kêt voi
môt công nào dó.
Thê nên dê kiêm tra xem ServerSocket có dang mo hay không ta phai làm nhu sau:
public static boolean isOpen(ServerSocket ss) {
return ss.isBound( ) && ! ss.isClosed( );
}
5. Lóp DatagramSocket
Lop này dùng dê tao ra môt Socket dê liên lac báng giao thuc UDP.
6. Lóp DatagramPacket
Lop này thê hiên cho môt gói du liêu duoc gui di báng giao thuc UPD. Nó duoc su dung
voi lop DatagramSocket.
III. TCP Socket
- Liên lac trong chê dô kêt nôi së có môt duong kêt nôi “ao” duoc thành lâp giua 2
tiên trình, truoc khi môt kêt nôi duoc thành lâp thì môt trong 2 tiên trình phai doi tiên trình
kia yêu câu kêt nôi. Trong mô hình này server phai láng nghe và châp nhân môt yêu câu kêt
nôi dên tu Client
Trang 186
- Dê viêt các chuong trình liên lac voi nhau trong chê dô kêt nôi ta cân phai viêt 2
chuong trình: môt cho server, môt cho client, chuong trình server có nhiêm vu láng nghe và
phan hôi kêt nôi moi, còn chuong trình phía client thì khoi xuong yêu câu kêt nôi
- Liên lac trong chê dô kêt nôi së su dung giao thuc TCP, dê gui và nhân du liêu
Viêt chuong trình phía server
Dê thiêt lâp môt server ta theo các buoc sau:
Buóc 1) tao ra môt dôi tuong ServerSocket và liên kêt nó voi môt công, ta có thê làm viêc
này thông qua hàm tao hoác khoi gán truc tiêp cho các truong
ví du:
ServerSocket s=new ServerSocket(port [, sequelLength]);
Hoác
ServerSocket s=new ServerSocket();
s.bind(InetAddress addr, port);
Buóc 2) châp nhân kêt nôi báng cách goi phuong thuc accept() cua dôi tuong
ServerSocket, sau khi goi phuong thuc, tuyên này së bi phong toa cho dên khi có môt kêt
nôi dên, phuong thuc này tra vê môt dôi tuong Socket, ta së su dung dôi tuong này dê “giao
tiêp” voi máy khách
Socket connectToClient=s.accept();
Buóc 3) nhân vê các dôi tuong outputStream và inputStream tu dôi tuong Socket nhân vê
tu phuong thuc accept o buoc 2, các dôi tuong này së giúp ta gui/nhân du liêu tu máy
client, dôi tuong outputStream cho phép ta gui du liêu dên client, dê nhân duoc các dôi
tuong này ta goi phuong thuc getOutputStream() trên dôi tuong Socket, dê nhân tham
chiêu dên dôi tuong outputStream vôn liên kêt voi dôi tuong này, và goi phuong thuc
getInputStream() dê nhân môt tham chiêu dên dôi tuong inputStream vôn liên kêt voi dôi
tuong Socket này.
Chúng ta có thê su dung dôi tuong inputStream và outputStream dê nhân/gui du liêu
duoi dang thô, hoác ta có thê nôi nó voi môt luông nhâp/xuât khác dê nhân vê du liêu mong
muôn.
Buóc 4) Xu lý du liêu gui dên tu client và gui gui tra du liêu.
Viêt chuong trình phía máy khách
Viêc viêt chuong trình cho client gôm môt sô buoc co ban sau:
Buóc 1) tao ra môt Socket dê kêt nôi dên máy chu, nôi kêt dên máy chu duoc thuc hiên
thông qua hàm tao cua lop Socket, thông thuong ta su dung hàm tao 2 dôi nhu sau:
Socket connectToServer=new Socket(serverName,port);
Hàm tao này có 2 dôi: dôi thu nhât cho biêt tên cua máy chu( tên này có thê là tên miên
hoác dia chi IP hoác có thê là môt dôi tuong InetAddress kêt hop voi máy chu) còn dôi thu
2 cho biêt sô hiêu công mà server dang láng nghe
Buóc 2) Nhân vê các dôi tuong inputStream và outputStream kêt hop voi dôi tuong Socket
connectToServer, buoc này tuong tu nhu buoc 3 trong phân viêt chuong trình cho server
Buóc 3) xu lý du liêu nhân vê/ gui di thông qua 2 dôi tuong outputStream và inputStream
Buóc 4) dóng kêt nôi dê giai phóng tài nguyên, thông thuong viêc dóng kêt nôi duoc khoi
xuong tu phía máy khách
Trang 187
Ví du 1: Nhân vê trang index.html tru máy chu web www.theht.edu.vn và in ra màn hình
import java.net.*;
import java.io.*;
class SocketClient {
public static void main(String[] args) {
PrintWriter out = null;
try {
Socket http = new Socket("www.theht.edu.vn", 80);
OutputStream raw = http.getOutputStream();
OutputStream buffered = new BufferedOutputStream(raw);
out = new PrintWriter(buffered);
out.write("GET /index.html HTTP/1.0\r\n\r\n");
out.flush();
InputStream in = http.getInputStream();
int c;
do {
c = in.read();
if (c == -1)break;
System.out.print( (char) c);
}
while (true);
}
catch (Exception ex) {
ex.printStackTrace();
}
finally {
try {
out.close();
}
catch (Exception ex) {}
}
}
}
Ví du 2: Xây dung chuong trình EchoClient và EchoServer.
Xây dung chuong trình phía máy chu
import java.net.*;
import java.io.*;
public class EchoServer {
public static void main(String args[]){
try{
ServerSocket server = new ServerSocket(3456);
int localPort = server.getLocalPort();
System.out.println("Echo Server is listening on port"+localPort+".");
Socket client = server.accept();
String destName =client.getInetAddress().getHostName();
int destPort = client.getPort();
System.out.println("Accepted connection to "+destName
Trang 188
+" on port "+destPort+".");
BufferedReader inStream = new BufferedReader(
new InputStreamReader(client.getInputStream()));
DataOutputStream outStream = new
DataOutputStream(client.getOutputStream());
boolean finished = false;
do {
String inLine = inStream.readLine();
System.out.println("Received: "+inLine);
if(inLine.equalsIgnoreCase("quit")) finished=true;
String outLine=new StringBuffer(inLine.trim()).reverse().toString();
outStream.write(outLine.getBytes());
outStream.write(13);
outStream.write(10);
outStream.flush();
System.out.println("Sent: "+outLine);
} while(!finished);
inStream.close();
outStream.close();
client.close();
server.close();
}catch (IOException e){
System.out.println(e);
}
}
}
Xây dung chuong trình phía máy khách
import java.net.*;
import java.io.*;
public class EchoClient {
public static void main(String args[]) {
ClientConnect client = new ClientConnect("www.theht.edu.vn", 3456);
client.requestServer();
client.shutdown();
}
}
class ClientConnect {
Socket connection;
DataOutputStream out;
BufferedReader in;
public ClientConnect(String destination, int port) {
try {
connection = new Socket(destination, port);
in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
out = new DataOutputStream(connection.getOutputStream());
System.out.println("Connected to server at port 3456.");
}
catch (Exception e) { System.out.println(e); }
Trang 189
}
public void requestServer() {
BufferedReader keyboardInput = new BufferedReader(
new InputStreamReader(System.in));
boolean finished = false;
do {
try {
System.out.print("Send, receive, or quit (S/R/Q): ");
System.out.flush();
String line = keyboardInput.readLine();
if (line.length() > 0) {
line = line.toUpperCase();
switch (line.charAt(0)) {
case 'S':
String sendLine = keyboardInput.readLine();
out.writeBytes(sendLine);
out.write(13);
out.write(10);
out.flush();
break;
case 'R':
int inByte;
System.out.print(">>>>");
while ( (inByte = in.read()) != '\n')
System.out.write(inByte);
System.out.println(); break;
case 'Q':
finished = true; break;
default: break;
}
}
}
catch (Exception e) {
System.out.println(e);
}
}
while (!finished);
}
public void shutdown() {
try {
connection.close();
}
catch (IOException ex) {
System.out.println("IO error closing socket");
}
}
}
Ví du: ta viêt môt ví du don gian nhu sau:
Trang 190
* chuong trình phía client có giao diên sau:
khi ta kích chuôt vào nút kêt nôi chuong trình cua ta së kêt nôi voi máy chu
sau khi nhâp chiêu dài, chiêu rông và kích chuôt vào nút tính, du liêu gôm có chiêu dài và
chiêu rông së duoc gui dên máy chu, máy chu thuc hiên viêc tính diên tích và gui kêt qua
tra lai cho máy khách, du liêu nhân vê tu máy chu duoc hiên thi trong ô kêt qua
khi ta kích chuôt nút dóng, chuong trình cua ta së dóng kêt nôi và kêt thúc chuong trình
* chuong trình trên máy chu chi có nhiêm vu, láng nghe kêt nôi và tính toán diên tích cua
hình nhân duoc
Mã nguôn phía máy chu:
package net.theht;
import java.io.*;
import java.net.*;
public class Server
{
public Server()
{
double a = 0, b = 0, kq = 0;
try
{
ServerSocket s = new ServerSocket(2004); // nam Giap Than
Socket connectToClient = s.accept(); // châp nhân kêt nôi
// lây vê dôi tuong nhâp/xuât
DataInputStream in = new DataInputStream(connectToClient.getInputStream());
DataOutputStream out = new DataOutputStream(connectToClient.
getOutputStream());
//Vòng lãp vô tân dê phuc vu yêu câu
while (true) {
a = in.readDouble();// lây chiêu dài
b = in.readDouble();// lây chiêu rông
kq = a * b;// tính kêt quá
out.writeDouble(kq);// trá vê kêt quá cho máy khách
out.flush();// dôn hêt DL ra
}
}
catch (IOException ex) { }
}
public static void main(String[] args)
{
Trang 191
Server server1 = new Server();
}
}
Mã nguôn phía máy khách:
package net.theht;
import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.net.*;
import java.awt.event.*;
public class Frame1 extends JFrame{
JLabel jLabel1 = new JLabel();
JLabel jLabel2 = new JLabel();
JTextField jtfDai = new JTextField();
JTextField jtfRong = new JTextField();
JLabel jLabel3 = new JLabel();
JTextField jtfKetQua = new JTextField();
JButton jtfConnect = new JButton();
JButton jtfCompute = new JButton();
JButton jtfClose = new JButton();
Socket connectToServer;
DataInputStream in; // luông nhâp
DataOutputStream out; //luông xuât
boolean isConnect = false; //biên kiêm tra xem dã kêt nôi chua
public Frame1() {
try { jbInit(); }
catch (Exception ex) { ex.printStackTrace(); }
}
void jbInit() throws Exception {
jLabel1.setFont(new java.awt.Font(".VnCourier New", 0, 13));
jLabel1.setToolTipText("");
jLabel1.setText("Chiêu dài");
jLabel1.setBounds(new Rectangle(16, 15, 77, 21));
this.getContentPane().setLayout(null);
jLabel2.setBounds(new Rectangle(16, 46, 86, 21));
jLabel2.setText("Chiêu rông");
jLabel2.setFont(new java.awt.Font(".VnCourier New", 0, 13));
jtfDai.setForeground(Color.red);
jtfDai.setBounds(new Rectangle(101, 12, 113, 25));
jtfRong.setBounds(new Rectangle(102, 44, 113, 25));
jtfRong.setForeground(Color.red);
jLabel3.setFont(new java.awt.Font(".VnCourier New", 0, 13));
jLabel3.setText("Kêt quá");
jLabel3.setBounds(new Rectangle(14, 78, 57, 21));
jtfKetQua.setBackground(Color.white);
jtfKetQua.setForeground(Color.red);
jtfKetQua.setDisabledTextColor(Color.red);
jtfKetQua.setEditable(false);
jtfKetQua.setText("");
Trang 192
jtfKetQua.setBounds(new Rectangle(102, 78, 113, 25));
jtfConnect.setBounds(new Rectangle(228, 10, 85, 30));
jtfConnect.setFont(new java.awt.Font(".VnCourier New", 0, 12));
jtfConnect.setHorizontalAlignment(SwingConstants.CENTER);
jtfConnect.setHorizontalTextPosition(SwingConstants.CENTER);
jtfConnect.setText("Kêt nôi");
jtfConnect.setVerticalAlignment(javax.swing.SwingConstants.CENTER);
jtfConnect.setVerticalTextPosition(javax.swing.SwingConstants.CENTER);
jtfConnect.addActionListener(new Frame1_jtfConnect_actionAdapter(this));
jtfCompute.setText("Tính");
jtfCompute.addActionListener(new Frame1_jtfCompute_actionAdapter(this));
jtfCompute.setFont(new java.awt.Font(".VnCourier New", 0, 12));
jtfCompute.setBounds(new Rectangle(229, 44, 86, 30));
jtfClose.setText("Ðóng");
jtfClose.addActionListener(new Frame1_jtfClose_actionAdapter(this));
jtfClose.setFont(new java.awt.Font(".VnCourier New", 0, 12));
jtfClose.setBounds(new Rectangle(230, 78, 87, 30));
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setTitle("Test Client/Server");
this.getContentPane().add(jLabel1, null);
this.getContentPane().add(jtfKetQua, null);
this.getContentPane().add(jtfRong, null);
this.getContentPane().add(jtfDai, null);
this.getContentPane().add(jLabel2, null);
this.getContentPane().add(jLabel3, null);
this.getContentPane().add(jtfCompute, null);
this.getContentPane().add(jtfConnect, null);
this.getContentPane().add(jtfClose, null);
}
public static void main(String[] args) {
Frame1 frame1 = new Frame1();
frame1.setBounds(100, 100, 350, 130);
frame1.show();
}
void jtfConnect_actionPerformed(ActionEvent e) {
if (isConnect == false) // nêu chua kêt nôi thì kêt nôi
{ try {
// lãng nghe kêt nôi dên máy chú trên công 2004
connectToServer = new Socket("localhost", 2004);
isConnect = true;
in = new DataInputStream(connectToServer.getInputStream());
out = new DataOutputStream(connectToServer.getOutputStream());
}
catch (UnknownHostException ex)
{ JOptionPane.showMessageDialog(this, "khong tim thay may chu", "loi",
JOptionPane.ERROR_MESSAGE);
}
Trang 193
catch (IOException ex) {
JOptionPane.showMessageDialog(this, "co loi ve nhap xuat", "loi",
JOptionPane.ERROR_MESSAGE);
}
}
}
void jtfCompute_actionPerformed(ActionEvent e) {
if ( (in == null) || (out == null)) // nêu chua kêt nôi thì báo lôi
JOptionPane.showMessageDialog(this, "Ban phai ket noi truoc khi tinh",
"loi", JOptionPane.ERROR_MESSAGE);
try {
out.writeDouble(Double.parseDouble(jtfDai.getText())); // gúi chuêu dài
out.writeDouble(Double.parseDouble(jtfRong.getText())); //gúi chiêu rông
out.flush(); // dây hêt dü liêu ra
jtfKetQua.setText(String.valueOf(in.readDouble())); // nhân vê kêt quá và
// hiên thi trong ô kêt quá
}
catch (NumberFormatException ex) {
// nêu nhâp sai thi báo lôi
JOptionPane.showMessageDialog(this, "Ban nhap sai, Ban phai nhap so",
"loi", JOptionPane.ERROR_MESSAGE);
}
catch (IOException ex) {
JOptionPane.showMessageDialog(this,
"khong the guu/nhan du lieu\nCo the do ban chua ket noi",
"loi",
JOptionPane.ERROR_MESSAGE);
}
}
// thú tuc dáp úng biên cô khi kích chuôt vào nút dóng
void jtfClose_actionPerformed(ActionEvent e) {
try { connectToServer.close(); // dóng kêt nôi }
catch (IOException ex) { }
System.exit(0); // thoát khói chuong trình
}
}
// tao ra lóp diêu hop, dê dáp úng su kiên kích chuôt vào nút kêt nôi
class Frame1_jtfConnect_actionAdapter implements java.awt.event.ActionListener{
Frame1 adaptee;
Frame1_jtfConnect_actionAdapter(Frame1 adaptee)
{ this.adaptee = adaptee; }
public void actionPerformed(ActionEvent e)
{ adaptee.jtfConnect_actionPerformed(e); }
}
// tao ra lóp diêu hop, dê dáp úng su kiên kích chuôt vào nút tính
class Frame1_jtfCompute_actionAdapter implements java.awt.event.ActionListener
{ Frame1 adaptee;
Trang 194
Frame1_jtfCompute_actionAdapter(Frame1 adaptee)
{ this.adaptee = adaptee; }
public void actionPerformed(ActionEvent e) {
adaptee.jtfCompute_actionPerformed(e);
}
}
// tao ra lóp diêu hop, dê dáp úng su kiên kích chuôt vào nút dóng
class Frame1_jtfClose_actionAdapter implements java.awt.event.ActionListener{
Frame1 adaptee;
Frame1_jtfClose_actionAdapter(Frame1 adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.jtfClose_actionPerformed(e);
}
}
Vân dê môt nguôn nhiêu khách
Trong ví du trên ta nhân thây, máy chu chi có thê phuc vu duy nhât môt khách. Trong thuc
tê dôi voi môt sô bài toán yêu câu môt máy chu phai phuc vu nhiêu máy khách tai môt thoi
diêm, ví du nhu Web server, Database server,… các máy chu này cho phép nhiêu máy
nhiêu máy khách kêt nôi dông thoi, ta có thê làm duoc viêc này báng kÿ thuât da luông.
Thât don gian, ban chi cân tao ra môt luông phuc vu cho môi khách, và dua thêm vào doan
mã tua nhu sau:
ServerSocket s = new ServerSocket(port);
while (true) {
Socket connectToClient = s.accept();
new HandleClient(connectToClient);
}
Ta sua lai ví du trên dê có thê phuc vu duoc nhiêu máy khách, chuong trình phía máy
khách vân giu nguyên, ta chi thay dôi chuong trình trên máy chu nhu sau:
package net.theht;
import java.io.*;
import java.net.*;
public class Server{
public static void main(String[] args)
{ try { //láng nghe kêt nôi trên công 2004
ServerSocket s = new ServerSocket(2004);
while (true) {
Socket connectToClient = s.accept(); // châp nhân kêt nôi
new HandleClient(connectToClient);//chay môt luông phuc vu
}
}
catch (IOException ex) { }
}
Trang 195
}
class HandleClient extends Thread{
private Socket s;
private double a = 0, b = 0, kq;
public HandleClient(Socket s)
{ this.s = s;
this.start();
}
public void run()
{ DataInputStream in = null;
DataOutputStream out = null;
try
{ in = new DataInputStream(s.getInputStream());
out = new DataOutputStream(s.getOutputStream());
}
catch (IOException ex) { }
//Vòng láp vô tân dê phuc vu yêu câu
while (true)
{ try {
a = in.readDouble(); // lây chiêu dài
b = in.readDouble(); // lây chiêu rông
kq = a * b; // tính kêt qua
out.writeDouble(kq); // tra vê kêt qua cho máy khách
out.flush(); // dôn hêt DL ra
}
catch (IOException ex1) { }
}
}
}
sau khi sua lai ban cho khoi dông server, sau dó cho chay 2 tiên trình client, ban së thu
duoc màn hình kêt qua nhu sau:
Liên lac trong chê dô phi kêt nôi
Viêc liên lac trong chê dô không kêt nôi, không yêu câu phai có 1 server luôn láng
nghe kêt nôi, khi liên lac trong chê dô không kêt nôi java su dung giao thuc UDP trong viêc
diêu khiên truyên và nhân du liêu. Do vây không có xác nhân vê du liêu gui, không thê biêt
duoc du liêu gui di có dên duoc dích không, không thê biêt duoc du liêu nhân vê có bi
trùng láp không… Ban là nguoi lâp trình, ban phai giai quyêt diêu dó, chu không phai lop
giao thuc mang hay java, Trong thuc tê ho mác kê cho lôi sây ra, boi ho không du náng luc
Trang 196
dê làm diêu dó, thê nên giai pháp an toàn cho ban là Socket dòng, boi lë Socket dòng su
dung giao thuc TCP, nên nhung diêu lo láng dó không bao gio sây ra.
Dê liên lac trong chê dô không kêt nôi ta su dung lop DatagramSocket và lop
DatagramPacket, lop DatagramSocket cho phép ta gui/ nhân vê các gói du liêu tu máy o
xa, lop DatagramPacket cho cung câp cho ta công cu dóng gói du liêu UDP, dê dôi tuong
DatagramSocket gui di hoác nhân vê.
Ta giai thích thông qua chuong trình chat, chuong trình gôm có 2 chuong trình, hai
chuong trình này là ngang hàng không có chuong trình nào là chu ca, các lênh cân thiêt dê
liên lac duoc trong chê dô không kêt nôi duoc in dâm
Mã chuong trình thu nhât:
package net.theht;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.io.*;
import java.net.*;
public class Frame2 extends JFrame{
private JTextArea jtaSend = new JTextArea();
private JButton jbtSend = new JButton();
private JButton jbtExit = new JButton();
private JTextArea jtaRev = new JTextArea();
// khai báo các biên cân thiêt
private DatagramSocket s;
private DatagramPacket sen,rev;
private boolean isFirstLine=true;
private JSplitPane jSplitPane1 = new JSplitPane();
private JScrollPane jScrollPane1 = new JScrollPane();
private JScrollPane jScrollPane2 = new JScrollPane();
public Frame2()
{ try {
jbInit();
}
catch (Exception ex) { ex.printStackTrace(); }
}
void jbInit() throws Exception {
this.getContentPane().setLayout(null);
jtaSend.setText("");
jbtSend.setBounds(new Rectangle(315, 205, 69, 24));
jbtSend.setFont(new java.awt.Font(".VnCourier New", 0, 12));
jbtGúid.seGúixt(Gúiu");
jbtSend.addActionListener(new Frame2_jbtSend_actionAdapter(this));
jbtExit.setText("Thoat");
jbtExit.addActionListener(new Frame2_jbtExit_actionAdapter(this));
jbtExit.setFont(new java.awt.Font(".VnCourier New", 0, 12));
jbtExit.setBounds(new Rectangle(314, 174, 71, 25));
jtaRev.setDisabledTextColor(Color.gray);
jtaRev.setEditable(false);
jtaRev.setText("");
Trang 197
jSplitPane1.setOrientation(JSplitPane.VERTICAL_SPLIT);
jSplitPane1.setBounds(new Rectangle(6, 7, 300, 224));
this.setDefaultCloseOperation(HIDE_ON_CLOSE);
this.setTitle("Chuong trinh chat su dung giao thuc UDP");
this.addWindowListener(new Frame2_this_windowAdapter(this));
this.getContentPane().add(jSplitPane1, null);
jSplitPane1.add(jScrollPane1, JSplitPane.TOP);
jScrollPane1.getViewport().add(jtaRev, null);
jSplitPane1.add(jScrollPane2, JSplitPane.BOTTOM);
this.getContentPane().add(jbtSend, null);
this.getContentPane().add(jbtExit, null);
jScrollPane2.getViewport().add(jtaSend, null);
jSplitPane1.setDividerLocation(150);
//user code
try {
// tao ra dôi tuong DatagramSocket dôi tuong này së nhân dü //liêu tù công 2004
s = new DatagramSocket(2004);
}
catch (SocketException ex) { }
}
private void nhan() {
while (true) {
// vùng dêm dê nhân dü liêu
byte[] dat = new byte[100];
// tao ra dôi tuong DatagramPacket dê nhân gói dü liêu
rev = new DatagramPacket(dat, dat.length);
try {
s.receive(rev);// nhân vê dü liêu
if (isFirstLine == true) {
jtaRev.append(new String(rev.getData(), 0, rev.getLength()));
isFirstLine = false;
}
else
jtaRev.append("\n" + new String(rev.getData(), 0, rev.getLength()));
}
catch (IOException ex) { }
}
}
private void dong() {
try {
s.close();// dóng kêt nôi
}
catch (Exception ex) { }
System.exit(0);
}
public static void main(String[] args) {
Frame2 frame2 = new Frame2();
Trang 198
frame2.setBounds(100, 100, 400, 280);
frame2.show();
frame2.nhan();
}
void jbtSend_actionPerformed(ActionEvent e) {
byte dat[] = jtaSend.getText().getBytes();
InetAddress local = null;
try {
local = InetAddress.getLocalHost();
}
catch (UnknownHostException ex) { }
// Tao ra dôi tuong DatagramPacket dê gúi gói dü liêu
sen = new DatagramPacket(dat, dat.length, local, 4002);
try {
s.send(sen); // Gúi dü liêu di
}
catch (IOException ex1) {
JOptionPane.showMessageDialog(this, "khong the gui duoc");
}
}
void jbtExit_actionPerformed(ActionEvent e) {
dong();
System.exit(0);
}
void this_windowClosing(WindowEvent e) {
dong();
}
}
class Frame2_jbtSend_actionAdapter implements java.awt.event.ActionListener{
private Frame2 adaptee;
Frame2_jbtSend_actionAdapter(Frame2 adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.jbtSend_actionPerformed(e);
}
}
class Frame2_jbtExit_actionAdapter implements java.awt.event.ActionListener{
private Frame2 adaptee;
Frame2_jbtExit_actionAdapter(Frame2 adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.jbtExit_actionPerformed(e);
}
Trang 199
}
class Frame2_this_windowAdapter extends java.awt.event.WindowAdapter{
private Frame2 adaptee;
Frame2_this_windowAdapter(Frame2 adaptee) {
this.adaptee = adaptee;
}
public void windowClosing(WindowEvent e) {
adaptee.this_windowClosing(e);
}
}
Chuong trình thu hai:
package net.theht;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
public class Frame3 extends JFrame{
private JTextArea jtaRev = new JTextArea();
private JScrollPane jScrollPane1 = new JScrollPane();
private JButton jbtSend = new JButton();
private JScrollPane jScrollPane2 = new JScrollPane();
private JButton jbtExit = new JButton();
private JTextArea jtaSend = new JTextArea();
private DatagramSocket s;
private DatagramPacket sen, rev;
private boolean isFirstLine = true;
private JSplitPane jSplitPane1 = new JSplitPane();
public Frame3() {
try {
jbInit();
}
catch (Exception ex) { ex.printStackTrace(); }
}
void jbInit() throws Exception {
jtaRev.setEditable(false);
jtaRev.setText("");
this.getContentPane().setLayout(null);
jbtSend.setBounds(new Rectangle(315, 183, 69, 24));
jbtSend.setFont(new java.awt.Font(".VnCourier New", 0, 12));
jbtGúid.seGúixt(Gúiu");
jbtSend.addActionListener(new Frame3_jbtSend_actionAdapter(this));
jbtSend.addActionListener(new Frame3_jbtSend_actionAdapter(this));
jbtExit.setText("Thoat");
jbtExit.addActionListener(new Frame3_jbtExit_actionAdapter(this));
Trang 200
jbtExit.setFont(new java.awt.Font(".VnCourier New", 0, 12));
jbtExit.setBounds(new Rectangle(314, 156, 71, 24));
jSplitPane1.setOrientation(JSplitPane.VERTICAL_SPLIT);
jSplitPane1.setBounds(new Rectangle(5, 7, 296, 219));
this.setDefaultCloseOperation(HIDE_ON_CLOSE);
this.setTitle("Chuong trinh chat su dung giao thuc UDP");
this.addWindowListener(new Frame3_this_windowAdapter(this));
this.getContentPane().add(jSplitPane1, null);
jSplitPane1.add(jScrollPane1, JSplitPane.TOP);
jScrollPane1.getViewport().add(jtaRev, null);
jScrollPane1.getViewport().add(jtaRev, null);
jSplitPane1.add(jScrollPane2, JSplitPane.BOTTOM);
this.getContentPane().add(jbtExit, null);
this.getContentPane().add(jbtSend, null);
jSplitPane1.setDividerLocation(150);
//user code
try {
s = new DatagramSocket(4002);
}
catch (SocketException ex) { }
jScrollPane2.getViewport().add(jtaSend, null);
}
private void nhan() {
while (true) {
byte[] dat = new byte[100];
rev = new DatagramPacket(dat, dat.length);
try {
s.receive(rev);
if (isFirstLine == true) {
jtaRev.append(new String(rev.getData(), 0, rev.getLength()));
isFirstLine = false;
}
else
jtaRev.append("\n" + new String(rev.getData(), 0, rev.getLength()));
}
catch (IOException ex) { }
}
}
private void dong() {
try {
s.close();
}
catch (Exception ex) { }
System.exit(0);
}
public static void main(String[] args) {
Trang 201
Frame3 frame3 = new Frame3();
frame3.setBounds(100, 100, 400, 280);
frame3.show();
frame3.nhan();
}
void jbtSend_actionPerformed(ActionEvent e) {
byte dat[] = jtaSend.getText().getBytes();
InetAddress local = null;
try {
local = InetAddress.getLocalHost();
}
catch (UnknownHostException ex) { }
sen = new DatagramPacket(dat, dat.length, local, 2004);
try {
s.send(sen);
}
catch (IOException ex1) {
JOptionPane.showMessageDialog(this, "khong the guu duoc");
}
}
void jbtExit_actionPerformed(ActionEvent e) {
dong();
}
void this_windowClosing(WindowEvent e) {
dong();
}
}
class Frame3_jbtSend_actionAdapter implements java.awt.event.ActionListener{
private Frame3 adaptee;
Frame3_jbtSend_actionAdapter(Frame3 adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.jbtSend_actionPerformed(e);
}
}
class Frame3_jbtExit_actionAdapter implements java.awt.event.ActionListener{
private Frame3 adaptee;
Frame3_jbtExit_actionAdapter(Frame3 adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.jbtExit_actionPerformed(e);
}
}
class Frame3_this_windowAdapter extends java.awt.event.WindowAdapter{
private Frame3 adaptee;
Frame3_this_windowAdapter(Frame3 adaptee) {
Trang 202
this.adaptee = adaptee;
}
public void windowClosing(WindowEvent e) {
adaptee.this_windowClosing(e);
}
}
Tóm lai dê liên lac trong chê dô không kêt nôi ta cân viêt trên môi máy các lênh cân
thiêt sau:
tao ra dôi tuong DatagramSocket dê nhân và gui du liêu, báng hàm tao cua nó nhu sau:
s = new DatagramSocket(port);
Hàm tao này së tao ra dôi tuong DatagramSocket hoat dông trên công duoc chi ra.
tao các dôi tuong DatagramPacket dùng dê làm gói du liêu trong viêc gui/nhân du liêu,
báng cách su dung ham tao cua lop DatagramPacket
+ DatagramPacket(byte[] buf, int length) thuong dùng hàm tao này khi nhân du liêu
+length.DatagramPacket(byte[] buf, int length, InetAddress address, int port) hàm tao này
thuong dùng khi doc du liêu tu máy tính và công duoc chi ra
+ DatagramPacket(byte[] buf, int offset, int length) hàm tao này thuong dùng trong viêc
nhân du liêu có dô dài length , bát dâu tu diêm offset
+ DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port) nhân vê
du liêu trên máy, công duoc chi ra, và cât vào trong vùng dêm buf
-gui du liêu báng phuong thuc send, cua lop DatagramSocket
datagramSocket.sen(datagramSocket)
- Nhân du liêu báng phuong thuc receive, cua lop DatagramSocket
datagramSocket.receive(datagramSocket)
Ví du ChatApp.java
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
public class ChatApp extends Frame {
TextField msgText = new TextField();
TextArea replyText = new TextArea();
Button sendButt = new Button();
Label label1 = new Label();
TextField addrText = new TextField();
Sender sender=new Sender();
public ChatApp(){
this.setLayout(null);
this.setSize(new Dimension(297, 214));
this.setTitle("Java Chat");
msgText.setBounds(new Rectangle(15, 34, 277, 21));
replyText.setBounds(new Rectangle(16, 93, 274, 89));
label1.setBounds(new Rectangle(17, 183, 55, 23));
label1.setText("talking with");
addrText.setBounds(new Rectangle(84, 187, 208, 19));
Trang 203
addrText.setText("127.0.0.1");
sendButt.setBounds(new Rectangle(15, 61, 94, 28));
sendButt.setLabel("Send");
sendButt.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
sendButt_actionPerformed(e);
}
});
this.add(msgText, null);
this.add(replyText, null);
this.add(sendButt, null);
this.add(label1, null);
this.add(addrText, null);
}
void sendButt_actionPerformed(ActionEvent e) {
sender.sendData(addrText.getText(),msgText.getText());
}
public static void main(String args[]){
ChatApp app = new ChatApp();
ListenerThread listener=new ListenerThread(app.replyText);
listener.start();
app.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent event){
System.exit(0);
}
});
app.show();
}
}
class Sender{
DatagramSocket listenerSocket;
InetAddress serverAddress;
String localHost;
int bufferLength = 256;
byte outBuffer[];
byte inBuffer[] = new byte[bufferLength];
DatagramPacket outDatagram;
DatagramPacket inDatagram;
public void sendData(String DestAddr, String data){
try{
serverAddress = InetAddress.getByName(DestAddr);
outBuffer = new byte[bufferLength];
outBuffer = data.getBytes();
outDatagram = new
DatagramPacket(outBuffer,outBuffer.length,serverAddress,2345);
listenerSocket.send(outDatagram);
} catch (Exception e){ System.out.println(e); }
}
Trang 204
public Sender(){
try{
listenerSocket = new DatagramSocket();
inDatagram = new DatagramPacket(inBuffer,inBuffer.length);
} catch (Exception e){ System.out.println("connect error!"); }
}
}
class ListenerThread extends Thread{
TextArea text;
DatagramSocket socket;
InetAddress serverAddress;
String localHost;
int bufferLength = 256;
byte outBuffer[];
byte inBuffer[] = new byte[bufferLength];
DatagramPacket outDatagram;
DatagramPacket inDatagram;
public ListenerThread(TextArea text){
this.text=text;
try{
socket = new DatagramSocket();
inDatagram = new DatagramPacket(inBuffer,inBuffer.length);
} catch (Exception e){
System.out.println("connect error!");
}
}
public void run() {
try{
DatagramSocket socket = new DatagramSocket(2345);
String localAddress = InetAddress.getLocalHost().getHostName().trim();
int localPort = socket.getLocalPort();
int bufferLength = 256;
byte outBuffer[];
byte inBuffer[] = new byte[bufferLength];
DatagramPacket outDatagram;
DatagramPacket inDatagram = new DatagramPacket(inBuffer,inBuffer.length);
while (true) {
socket.receive(inDatagram);
InetAddress destAddress = inDatagram.getAddress();
String destHost = destAddress.getHostName().trim();
int destPort = inDatagram.getPort();
String data = new String(inDatagram.getData()).trim();
text.append(destHost+" say: "+data+"\n");
}
}catch (IOException ex){ System.out.println("IOException occurred."); }
}
}
Trang 205
Chuong 9: JAVA MAIL
I. Các khái niêm MAIL
Ngày nay e-mail hay thu diên tu dã tro nên phô biên và hâu nhu không thê thiêu
trong thê gioi Internet. E-mail cho phép gui thông diêp tu noi này dên noi khác tuong tu
nhu cách gui thu truyên thông thông qua buu diên. Trong cách thông thuong ban phai cung
câp dia chi nguoi gui (sender), dia chi nguoi nhân (reciept) sau dó nguoi gui mang thu dên
buu diên nho buu diên chuyên thu di. Buu diên së chuyên thu dên hôp thu cua nguoi nhân.
Dôi voi thu diên tu e-mail gui qua hê thông Internet hay mang thì co chê gui/nhân
cung hoàn toàn tuong tu. Các máy chu (mail server) cung câp cho ban dia chi mail (còn goi
là e-mail address). Ban ghi dia chi mail cua ban và cua nguoi nhân, sau dó nhâp vào nôi
dung cân gui. Mail server së gui thu cua ban dên môt máy chu hay mail server cua dia chi
nguoi nhân. Mail server noi nhân së cât thu vào môt noi thích hop (mail box hay còn goi là
hôp thu) trên máy chu. Nguoi nhân së tiên hành dáng nhâp (hay còng goi là login) vào hôp
thu cua máy chu dê doc nôi dung e-mail gui cho mình.
Dê thông nhât giua các máy chu mail trên toàn thê gioi vê cách thuc gui nhân mail
dòi hoi hình thành các chuân vê mail. Diêu này giúp cho viêc goi nhân các thông diêp duoc
dam bao, làm cho nhung nguoi o các noi khác nhau có thê trao dôi thông tin voi nhau.
Có 2 chuân vê Mail thuong duoc các máy chu mail hô tro là X.400 và SMTP
(Simple Mail Transfer Protocol). SMTP thuong di kèm voi chuân POP3 và do han chê cua
SMTP mà ngày nay nguoi ta dùng chuân mo rông cua nó là ESMTP (Extended SMTP).
Muc dích chính cua X.400 là cho phép các mail có thê duoc truyên nhân thông qua các loai
mang khác nhau bât châp câu hình phân cung, hê diêu hành mang, giao thuc truyên dân
duoc dùng. Còn muc dích cua chuân SMTP miêu ta cách diêu khiên các thông diêp trên
mang Internet. Diêu quan trong cua chuân SMTP là gia dinh máy nhân phai dùng giao thuc
SMTP gui Mail cho môt Server luôn luôn hoat dông. Sau dó, nguoi nhân së dên lây Mail
cua ho tu Server khi nào ho muôn dùng giao thuc POP (Post Office Protocol), ngày nay
POP duoc cai tiên thành POP3 (Post Officce Protocol vertion 3). Các giao thuc Mail thông
dung : chuân X.400, chuân MAIP, SMTP (ESMTP), POP3. Trong chuong này ta së su
dung hai giao thuc :POP3 và SMTP dê gui nhân mail.
Mô hình gui nhân mail
Truoc khi di vào phân chính chúng ta cùng ôn lai môt sô khái niêm co so sau:
Sende
r
Reveicer
Mail Server t rung
gian
Mail Server nguòi
gúi
Mail Server nguòi
nhân
Mang Mang
Trang 206
Mail server: là môt chuong trình chay duoi dang môt dich vu. dich vu này có nhiêm vu
nhân mail tu máy khách gui dên, phân phôi mail dên máy chu khác, cho phép máy
khách truy câp vào dê lây mail, luu tru mail… Chính vì vây truoc khi ban gui nhân mail
ban phai biêt dia chi cua máy chu mail (máy dang chay dich vu mail). Dia chi này
thuong duoc goi là mail host.
Giao thúc gui mail (Mail transport protocol): Dê gui mail dên máy chu, trình khách
phai su dung môt giao thuc trò chuyên voi mail server. Tuong tu nhu trình duyêt su
dung giao thuc HTTP dê trò chuyên voi Web server. Các máy khách muôn bát tay voi
trình chu và gui mail lên máy chu së su dung giao thuc SMTP (Simple Mail Transport
Protocol). SMTP khá nôi tiêng và duoc hâu các máy chu mail trên thê gioi hô tro. Dia
chi cua máy chu nhân mail gui di duoc goi là outgoing mail address. Trình chu tiêp
nhân mail theo giao thuc SMTP duoc goi là SMTP Server. Trình khách su dung giao
thuc SMTP dê gui thu di duoc goi là SMTP Client.
Giao thúc luu trû và nhân mail (mail store protocol): Khi trình chu mail tiêp nhân
duoc mail. Nó tiên hành luu tru mail theo môt cách thuc nào dó dê trình khác có thê dê
dàng truy câp vào và nhân mail vê. Hiên nay POP3 (Post Office Protocol) và IMAP
(Internal Message Access Protocol) là hai giao thuc luu tru và lây mail tu hôp thu
(Inbox) duoc nhiêu mail server su dung. Dia chi cua máy chu luu tru mail cho phép
máy khách truy câp vào dê nhân mail vê duoc goi là incoming mail address. Các
chuong trình mail Client thuong su dung giao thuc POP3 dê nhân mail tu trình chu.
Trình chu tiêp nhân yêu câu cua trình khách theo giao thuc POP3 duoc goi là POP
Server.
SMTP Relay: Các mail server nêu nhân duoc mail không thuôc dia chi do mình quan
lý, khi dó nó có trách nhiêm gui mail dên máy chu khác voi cùng giao thuc SMTP.
Trong truong hop này mail server (noi chuyên tiêp thu di) dóng vai trò nhu môt trình
khác (mail client) dôi voi máy chu noi nhân. Cu thê. Internet mail là môt hê thông
chuyên mail liên tuc giua các máy chu mail voi nhau cho dên khi nào mail dên duoc
máy chu dích. Các mail server da phân hô tro tính náng Relay.
POP before SMTP (Chúng thuc quyên truy câp theo giao thúc POP truóc khi su
dung SMTP): Dê tránh tình trang máy chu mail duoc loi dung dê gui mail môt cách ô
at. Co chê POP before SMTP yêu câu máy khách muôn su dung dich vu mail cua máy
chu phai truoc hêt phai dáng nhâp (login) vào tài khoan (account) theo giao thuc POP.
Nêu quá trình dáng nhâp thành công, co chê gui mail báng SMTP moi có thê thuc hiên
duoc.
Mail client, Web mail: là chuong trình dùng dê nhân mail vê tu trình chu và cho phép
gui mail lên trình chu. Nêu mail client duoc viêt duoi giao diên Web thì nó duoc goi là
Web mail.
II. Gui mail vói thu viên có sàn cua java
Java cung câp cho ban môt thu viên nho gon giúp ban có thê guu mail môt cách dê
dàng, tuy nhiên voi thu viên này ban không có duoc các tính náng cao câp nhu gui
file dính kèm…, Dê su dung các tính náng cao câp ban xu thu viên Mail API (gioi
thiêu trong phân sau). Thu viên này có lop SmtpClient dùng dê gui mail.
Dê gui mail ban cung câp dia chi cua nguoi gui (from), dia chi cua nguoi nhân (to),
dia chi cua mail server (máy chu tiêp nhân mail do ban gui lên) cùng voi nôi dung
mà ban muôn gui. Duoi dây là môt chuong trình don gian dùng dê gui mail dên dia
Trang 207
chi thek44a2@yahoo.com nho vào máy chu mail utehy.edu.vn (máy chu mail cua
truong DHSP KT Hung Yên). Dia chi nguoi gui có thê dát tuy ý. Nhung thuong là
dia chi cua ban dê nguoi nhân sau khi doc thu xong có thê hôi âm (Reply) lai cho
ban.
//SendMailApp.java
import sun.net.smtp.*;
import java.io.*;
public class SendMailApp {
public static void main(String[] args) throws Exception {
String host = "utehy.edu.vn";
String from = "theth@utehy.edu.vn";
String to = "thek44a2@yahoo.com";
String subject = "Test Message";
String body = "Hello this is test message for mail";
/* Tao dôi tuong gúi mail theo giao thúc SMTP, host là dia chi cúa máy chú nhân mail do ta
gúi lên */
SmtpClient mailer = new SmtpClient(host);
// Thiêt lâp dia chi cúa nguòi gúi và nguòi nhân
mailer.from(from);
mailer.to(to);
//Lây vê luông xuât gãn vói mail
PrintStream ps = mailer.startMessage();
//Diên các thông tin khác
ps.println("From:" + from);
ps.println("To:" + to);
ps.println("Subject:" + subject);
ps.println();// Thêm CRLF vào truóc phân nôi dung
ps.println(body);
//Kêt thúc quá trình gúi mail
mailer.closeServer();
System.out.println("Mail has been sent");
}
}
Chú ý: Hãy thay dia chi From, To báng dia chi e-mail mà ban muôn gui.
III. Giói thiêu java mail API
Lop SmtpClient cua java mà chúng ta su dung trên dây chi giúp ban gui mail o muc
don gian nhât voi nôi dung mail o dang thuân ván ban. Môt ung dung mail phía máy khách
thuong có các chuc náng phuc tap hon nhu : Gui file dính kèm, du liêu duoc nhúng ca hình
anh, âm thanh…Dê thuc hiên nhung chuc náng này java dua ra môt thu viên riêng chuyên
xu lý các thao tác gui nhân mail.
1. Cài dát thu viên java mail
Mác dinh các thu viên java mail API không duoc cài dát khi ban cài JDK. Thu viên
này gôm ba phân:
Phân thu nhât là hat nhân cua các tác vu xu lý mail, nó duoc dóng gói trong têp mail.jar.
Ban có thê download tu dia chi http://java.sun.com/javamail/index.html
Trang 208
Phân thu hai là JavaBean Activation FrameWork cân cho moi phiên ban cua java mail.
Thu viên này mang tên activation.jar. voi thu viên này ban có thê tai xuông tu
http://java.sun.com/products/javabean/glasgow/jar.html
Phân thu ba là các lop doc hay nhân mail tu trình chu. Trong java 1.4 thu viên này có
tên mail.jar
Ban dát biên môi truong classpath=%CLASSPATH%; C:\JBuilderX\lib\mail.jar;
C:\JBuilderX\lib\activation.jar;
Chú ý: Khi ban cài JBuilder hai thu viên này cung duoc tu dông cài dát vào máy, ban có
thê tìm thây nó trong thu muc Jbuilder_Home/lib
2. Các buóc gui nhân mail
Các buóc dê nhân mail:
Tao dôi tuong mail Session.
Tao dôi tuong store chuân bi lây mail vê. Dê tao dôi tuong Store ban yêu câu nguoi
dùng nhâp vào tên và mât khâu chung thuc quyên truy câp hop pháp.
Su dung dôi tuong Store dê lây vê dôi tuong Folder. Môi Folder së chua môt loai mà
ban muôn lây. Nhu Folder Inbox chua các thu viên gui dên. Folder trash chua các thu
vua bi xoá. Folder sent chua các thu vua gui di…
Duyêt dôi tuong Folder dê lây vê danh sách các thu.
Các buóc dê gui mail
Yêu câu nguoi gui chon giao thuc dê gui (SMTP) và nhân (POP3 hay IMAP…). Luu
các thông tin này vào dôi tuong Session.
Tao dôi tuong Message. Dôi tuong này së chua các thông tin vê mail cân gui di nhu dia
chi nguoi gui, dia chi nguoi nhân, tiêu dê mail, nôi dung mail…
Goi phuong thuc Transport.send() hoác phuong thuc sendMessage cua dôi tuong
Transport dê gui thu di.
3. Các lóp co ban xu lý thao tác gui nhân mail
Ta tìm hiêu các gói trong thu viên java mail. Hâu hêt các ung dung mail client cân
import các thu viên javax.mail, javax.mail.interner, javax.mail.activation.
3.1. Các lóp liên quan dên viêc gui mail
3.1.1. Lóp Session
Lop này thê hiên môt phiên kêt nôi toi mail server. Truoc khi truy câp (gui/nhân)
ban cân phai tao ra môt dôi tuong Session thê hiên cho môt phiên làm viêc. ví du:
//Tao dôi tuong Properties chua thông tin khoi tao nêu có
Properties props=new Properties();
/*gán giá tri cho các thuôc tính báng phuong thuc
props.setProperty(PropertyName, PropertyValue) */
//Tao dôi tuong Session
Session session =Session.getDefaultInstance(props,null);
Hoác ban có thê goi phuong thuc getInstance() cua lop Session thay cho
getDefaultInstance() dê tao ra thê hiên cua dôi tuong Session nhu sau:
//Tao dôi tuong Properties chua thông tin khoi tao nêu có
Properties props=new Properties();
Trang 209
/*gán giá tri cho các thuôc tính báng phuong thuc
props.setProperty(PropertyName, PropertyValue)*/
//Tao dôi tuong Session
Session session =Session.getInstance(props,null);
Trong ca hai phuong thuc khoi tao dôi tuong Session nêu trên. các thuôc tính câu
hình duoc dát trong dôi tuon Properties nên truoc khi ban ban gui nhân mail ban cân thiêt
dát các thuôc tính này. ví du:
props.setProperty("mail.host","utehy.edu.vn");
props.setProperty("mail.from","theht@utehy.edu.vn");…
O dây thuong thì ban truyên null cho tham sô thu hai voi ý nghia su dung co chê
chung thuc (authentication) mác dinh cua mail server.
Su khác nhau giua hai phuong thuc này là getInstance() thì luôn tao ra môt Session
moi còn getDefaultInstance() thì không tao ra môt thê hiên moi cua Session nêu nhu nó dã
duoc tao ra trong cùng java virtual machine.
3.1.2. Lóp Message
Sau khi có dôi tuong Session ban, dê gui mail ban ban cân tao ra dôi tuong Message.
Tuy nhiên ít khi ban làm viêc truc tiêp voi dôi tuong này mà ban thuong làm viêc voi các
lop con cua nó, lop MimeMessage. ví du, ban tao thông diêp mail dê chuân bi gui di nhu
sau:
MimeMessage message =new MimeMessage(mailsession);
Nêu nôi dung cua thông diêp là thuân ván ban, ban có thê thiêt dát nôi dung thu gui báng
lênh:
message.setText(content);
Nêu ban chi dinh Mime cho nôi dung cân gui nêu nó không phai là thuân ván ban nhu sau:
message.setContent(content,"text/html");
Nêu nôi dung không phai thuân ván ban thì ban phai chi dinh Mime cho nó, dê noi nhân
mail së cán cu vào Mime dê hiên thi dúng nôi dung cua thông diêp nhân duoc.
Môt thói quen tôt nên có là dát cho mail môt tiêu dê (subject). Nguoi nhân cán cu
vào tiêu dê thu dê biêt duoc nôi dung ván tát mô ta trong thu. Phuong thuc setSubject() së
giúp ta làm viêc dó. Ví du:
Session.setSubject("Xin chao");
3.1.3. Lóp Address
Sau khi ban tao ra dôi tuong Session và Message, tiêp dên ta su dung lop Address dê
tao ra dia chi cua nguoi guu và nguoi nhân. Lop Address là lop truu tuong, ban su
dung lop con cua nó là InternetAddresss. Ví du ban tao dia chi mail tu lop này nhu
sau:
Address address =new InternetAddresss("theht@utehy.edu.vn");
Hoác
InternetAddresss address =new InternetAddresss("theht@utehy.edu.vn");
Nêu ban muôn dia chi e-mail có thêm thông tin diên giai ban thêm su dung cú pháp
nhu sau:
Address address =new InternetAddresss("theht@utehy.edu.vn", "Hoang Trong The");
Thông tin diên giai này së duoc hiên thi thay khi nguoi nhân doc thu thay cho dia
chi mail from.
Trang 210
Sau khi tao xong dia chi cua nguoi gui, dia chi cua nguoi nhân ban cán gán nó vào
thông diêp cân gui di. Java cung câp cho ban ba loai dia chi phô biên:
Kiêu dia chi ý nghia
Message.RecipientType.TO Dia chi noi dên
Message.RecipientType.CC Dia chi nguoi gui cân luu ý
Message.RecipientType.BCC Dia chi nguoi gui cân tham khao
Ban goi phuong thuc addRecipient() cua dôi tuong Message dê gán dia chi cân gui.
Ví du:
//Tao dia chi
Address toAddress=new InternetAddresss(“thek44a2@yahoo.com”);
Address ccAddress=new InternetAddresss(“theht@walla.com”);
//Gán dia chi cho nguoi nhân
message.addRecipient(Message.RecipientType.TO, toAddress);
message.addRecipient(Message.RecipientType.CC, ccAddress);
Dê dát dia chi cua nguoi gui ban goi phuong thuc setFrom(). Ví du:
Address myAddress=new InternetAddresss(“theht@utehy.edu.vn”);
message.setFrom(myAddress);
Dia chi cua nguoi gui không quan trong, ban có thê dát cho nó môt dia chi e-mail
không có thuc, nêu ban dát dia chi cua nguoi gui không có thuc thì nguoi nhân không thê
phan hôi (reply) lai cho ban.
Ta có thê dát dia chi cua nguoi gui là môt danh sách (mang) dê nguoi nhân có thê
phan hôi lai cho nhiêu nguoi cùng môt lúc. Ban goi phuong thuc addFrom() nhu
sau:
Address address[]=…
Message.addFrom(address);
Chú ý: java mail không cung câp co chê kiêm tra xem dia chi cua nguoi gui có hop lê hay
không. Dê kiêm tra môt dia chi mail có hop lê hay không không phai là dê, thông thuong
don gian nhât ban kiêm tra xem trong dia chi dó có kí tu @ hay không?
3.1.4. Lóp Transport
Lop Transport cung câp các phuong thuc gui mail dên mail server. Don gian ban goi
phuong thuc tinh send() cua lop Transport dê gui dôi tuong thông diêp di. Ví du:
Transport.send(message);
Hoác ban có thê chon giao thuc gui mail tu dôi tuong Session, tao kêt nôi dên trình
chu mail và goi phuong thuc sendMessage() dê gui mail di:
Transport transport;
transport =mailSession.getStransport("smtp");
transport.connnect(host, user, password);
// hoác ban có thê goi phuong thúc transport.connnect();
transport.sendMessage(message, message.getAllRecipients());
transport.close();
Trang 211
Cách thu hai này nhanh hon cách thu nhât trong truong hop ban muôn gui môt sô
luong lon các mail, kêt nôi vân duoc duy trì cho dên khi ban goi phuong thuc
transport.close(), trong khi kêt nôi vân còn mo ban có thê gui bao nhiêu thu tuy ý mà
không phai kêt nôi lai voi mail server. Trong khi phuong thuc transport.send() phai
kêt nôi, dóng kêt nôi môi khi có môt thông diêp duoc gui di, do vây mât thoi gian.
3.2. Các lóp liên quan dên viêc nhân mail
Lóp Store và lóp Folder: Là hai lop này phuc vu chu yêu cho viêc nhân và doc
mail chua trong hôp thu cua mail server. Dê su dung hai lop này truoc tiên ban cân chi dinh
giao thuc nhân mail. Có hai giao thuc nhân mail chính là POP3 và IMAP.
Ví du nêu su dung giao thuc POP3 thì ban khai báo gói com.sun.mail.pop3 nhu sau:
import com.sun.mail.pop3.*;
Còn nêu ban su dung giao thuc IMAP thì ban khai báo gói com.sun.mail.imap nhu
sau:
import com.sun.mail.imap.*;
Tuong tu nhu lop Transport trong thao tác gui mail, ban dùng dôi tuong Session, goi
phuong thuc getStore() dê lây vê dôi tuong Store phuc vu cho muc dích kêt nôi voi
mail server dê nhân mail.
Store store =mailSession.getStore("pop3");
Dê kêt nôi vào mail server ban goi phuong thuc connect() nhu sau:
store.connect(host, user, password);
Trong dó:
host là dia chi cua mail server mà ban muôn lây thu
user/password là tài khoan dáng nhâp vào hôp thu cua ban.
Nêu kêt nôi thành công ban lây vê dôi tuong Folder dê duyêt mail.
Folder folder = store.getFolder(“INBOX”);
folder.open(Folder.READ_ONLY);
Message message[]=folder.getMessages();
Các thông diêp mail duoc luu tru trên mail theo môt câu trúc cây, tuong tu nhu câu trúc cây
thu muc cua hê diêu hành. INBOX ám chi thu muc chua thu gui dên.
Chú ý: Voi giao thuc POP3 ban chi có thê lây mail tu INBOX voi giao thuc IMAP (mo
rông cua giao thuc POP3) ban có thê nhân mail trong các thu muc TRASH, SENT…
Phuong thuc getMessages() tra vê môt mang các dôi tuong Message. Ban goi
phuong thuc getConten() dê lây vê nôi dung cua mail nhu sau:
for(int i=0;i<message.lenth();i++)
System.out.println(((MimeMessage)message[i]).getConten());
Môt dã doc xong thu ban dóng hôp thu và ngát kêt nôi:
folder.close(true);
store.close();
Dôi sô true cho biêt có câp nhât các lênh xoá mail hay không (së dê câp trong phân
sau).
Trang 212
III. Gui mail
1. Gui mail don gian
Chuong trình SendMailAPI duoi dây së goi mail di theo giao thuc SMTP,
SendMailAPI là chuong trình java thuân tuý su dung thu viên java mail. Nó tuong tu
chuong trình SenMailApp chúng ta dã tìm hiêu trong phân truoc. Mác dù vây thay vì su
dung lop SmtpClien ban su dung các lop Session, Transport cua java mail API.
//SendMailAPI.java
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
import java.util.*;
public class SendMailAPI {
public static void main(String args[]) throws Exception {
String smtpHost = "utehy.edu.vn";
int smtpPort = 25;
String from = "theht@utehy.edu.vn";
String to = "thek44a2@yahoo.com";
String subject = "Xin chao";
String content = "";
// Create a mail session
Properties props = new Properties();
props.put("mail.smtp.host", smtpHost);
props.put("mail.smtp.port", "" + smtpPort);
Session session = Session.getDefaultInstance(props, null);
// Construct the message
Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(from));
msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
msg.setSubject(subject);
msg.setText(content);
// Send the message
Transport.send(msg);
}
}
Truoc tiên ban tao ra môt dôi tuong Properties dê chua các thông tin: tên máy chu mail,
công cua mail server.. báng câu lênh
Properties props = new Properties();
props.put("mail.smtp.host", smtpHost);
props.put("mail.smtp.port", "" + smtpPort);
mác dinh công cua mail së là 25, nêu mail hoat dông trên môt công không phai là 25 thì ban
phai chi rõ công cua mail server báng dòng lênh:
props.put("mail.smtp.port", "" + smtpPort);
Tiêp theo ban lây vê môt phiên kêt nôi báng dòng lênh:
Session session = Session.getDefaultInstance(props, null);
Trang 213
Tiêp theo ban tao ra dôi tuong thông diêp và diên các thông tin cân thiêt vào:
Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(from));
msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
msg.setSubject(subject);
msg.setText(content);
Cuôi cùng dê gui thu di ban goi phuong thuc:
Transport.send(msg);
Ban có thê thay dòng lênh này báng doan lênh sau:
Transport tp= session.getTransport("smtp");
tp.connect();
tp.sendMessage(msg,msg.getAllRecipients());
tp.close();
Nêu ban chua gán dia chi mail server và công cua nó thì ban phai goi phuong thuc:
tp.connect(host,user,password);
Do ban dang gui mail nên các thông tin dáng nhâp user,password không cân thiêt,
ban có thê cung câp cho nó môt xâu rông nhu sau:
tp.connect(host,””,””);
2. Gui thu vói nôi dung có dinh dang HTML
Nêu nôi dung thu là thuân ván ban ban goi phuong thuc
Message.setText(StringMsg) dê gán nôi dung cho dôi tuong thông diêp cân gui di. Nêu nôi
dung thu không phai là dang thuân ván ban ban cân goi phuong thuc
Message.setConten(StringMsg, MimeType) voi MimeType là môt xâu cho biêt kiêu nôi
dung duoc chua trong mail.
Ví du sau minh hoa cách gui thu voi nôi dung có dinh dang HTML:
// SendMailAPIFromat.java
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
import java.util.*;
public class SendMailAPIFromat{
public static void main(String args[]) throws Exception {
String smtpHost = "utehy.edu.vn";
int smtpPort = 25;
String from = "theht@utehy.edu.vn";
String to = "thek44a2@yahoo.com";
String subject = "Xin chao";
//Gán nôi dung là môt xâu có dinh dang HTML
String content = "<p><b><font face=\".VnArialH\" size=\"8\">Xin chào các
ban</font></b></p><p><font face=\".VnTimeH\">Chúc môt ngày vui vé</font></p>";
// Create a mail session
Properties props = new Properties();
props.put("mail.smtp.host", smtpHost);
props.put("mail.smtp.port", "" + smtpPort);
Session session = Session.getDefaultInstance(props, null);
// Construct the message
Trang 214
Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(from));
msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
msg.setSubject(subject);
//Gán kiêu nôi dung MimeType là text/html
msg.setContent(content, "text/html");
// Send the message
Transport tp = session.getTransport("smtp");
tp.connect("utehy.edu.vn", "", "");
tp.sendMessage(msg, msg.getAllRecipients());
tp.close();
}
}
Trong ví du trên ban gán nôi dung là môt xâu có dinh dang HTML, dê báo cho
nguoi nhân biêt nôi dung bên trong thu có dinh dang HTML ban goi phuong thuc
msg.setContent(content, "text/html");
3. Gui thu vói file dính kèm
Thu viên java mail API cho phép ban gui mail voi các file dính kèm. Nhung file này
thuong duoc nhúng vào phân nôi dung mail gui di o dang mã hoá tung phân doan
(Multi – part MIME). Môt Message duoc xem là gôm nhiêu phân doan. Môi phân
doan duoc goi là môt BodyPart, Tât ca các BodyPart duoc goi là MultiPart. Dua vào
hai lop BodyPart và MultiPart ta có thê tao ra môt mail phuc tap có thê phân tích boi
noi nhân. Chuong trình SendMailAttachAPI.java duoi dây së cho thây kÿ thuât gui
mail voi file dính kèm.
//SendMailAttachAPI.java
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
import java.util.*;
public class SendMailAttachAPI {
public static void main(String args[]) throws Exception {
String smtpHost = "utehy.edu.vn";
int smtpPort = 25;
String from = "theht@utehy.edu.vn";
String to = "thek44a2@yahoo.com";
String subject = "Xin chao";
String content = "Chuc mot buoi sang tot lanh";
//Tên cúa file dính kèm
String fileName = "C:/test.txt";
//tao dôi tuong session
Properties props = new Properties();
props.put("mail.smtp.host", smtpHost);
props.put("mail.smtp.port", "" + smtpPort);
Session session = Session.getDefaultInstance(props, null);
//Tao dôi tuong thông diêp
Trang 215
Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(from));
msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
msg.setSubject(subject);
/* Tao dôi tuong Multipart, dôi tuong này dùng dê chúa các BodyPart */
Multipart multiPart = new MimeMultipart();
//Tao ra dôi tuong BodyPart dê chúa nôi dung mail
BodyPart msgBodyPart = new MimeBodyPart();
msgBodyPart.setText(content);
//Thêm dôi tuong msgBodyPart vào multiPart
multiPart.addBodyPart(msgBodyPart);
/*Tao dôi tuong BodyPart thú hai, dôi tuong này dùng dê chúa phân file dính kèm */
msgBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource(fileName);
msgBodyPart.setDataHandler(new DataHandler(source));
//Gán tên têp tin cho BodyPart
msgBodyPart.setFileName(fileName);
//Cho biêt dây là phân chúa file dính kèm
msgBodyPart.setDisposition("attachment");
//Thêm dôi tuong msgBodyPart vào multiPart
multiPart.addBodyPart(msgBodyPart);
//Gán multiPart cho dôi tuong thông diêp
msg.setContent(multiPart);
//Gúi thông diêp di
Transport tp = session.getTransport("smtp");
tp.connect("utehy.edu.vn", "", "");
tp.sendMessage(msg, msg.getAllRecipients());
tp.close();
}
}
Chú ý: Ban có thê dính kèm bao nhiêu file tuy ý, báng cách tao ra nhiêu BodyPart khác
nhau.
IV. Nhân mail
1. Nhân mail don gian
Dê nhân mail, ban kêt nôi vào mail server dê lây vê các Message trong thu muc
INBOX. Ví du GetMailAPI sau minh hoa cách nhân mail tu trình chu và hiên thi ra màn
hình.
//GetMailAPI.java
import java.util.*;
import javax.mail.*;
import com.sun.mail.pop3.*;
public class GetMailAPI {
public static void main(String[] args) throws Exception {
String smtpHost = "utehy.edu.vn";
int smtpPort = 25;
//Tao dôi tuong Session
Trang 216
Properties props = new Properties();
props.put("mail.smtp.host", smtpHost);
props.put("mail.smtp.port", "" + smtpPort);
Session session = Session.getDefaultInstance(props, null);
//Tao dôi tuong Store
Store store = session.getStore("pop3");
store.connect(smtpHost, "thek44a2", "abc");
//Lây vê thu muc INBOX
Folder folder = store.getFolder("INBOX");
if (folder == null) {
System.out.println("No folder");
System.exit(1);
}
//Mó thu muc INBOX vói chê dô chi doc
folder.open(Folder.READ_ONLY);
//Lây vê các dôi tuong Message và hiên thi ra màn hình
Message[] messages = folder.getMessages();
for (int i = 0; i < messages.length; i++) {
printMessage(messages[i]);
}
/*Ðóng kêt nôi nhung không xoá các Message tù mail server */
folder.close(false);
store.close();
}
public static void printMessage(Message m) throws Exception {
//In phân tiêu dê thu
//Lây vê các dia chi gúi
Address[] from = m.getFrom();
if (from != null) {
for (int i = 0; i < from.length; i++) {
System.out.println("From: " + from[i]);
}
}
//Lây vê các dia chi nhân TO
Address[] to = m.getRecipients(Message.RecipientType.TO);
if (to != null) {
for (int i = 0; i < to.length; i++) {
System.out.println("To: " + to[i]);
}
}
//Lây vê tiêu dê thu
String subject = m.getSubject();
if (subject != null) {
System.out.println("Subject: " + subject);
}
//Lây vê ngày thu duoc gúi
Date d = m.getSentDate();
if (d != null) {
System.out.println("Date: " + d);
Trang 217
}
//Thêm môt hàng xuông dòng dê phân cách phân tiêu dê và phân chính cúa thu
System.out.println();
//In nôi dung cúa thu
Object content = m.getContent();
if (content instanceof String) {
System.out.println(content);
}
else if (content instanceof InputStream) {
InputStream in = (InputStream) content;
int c;
while ( (c = in.read()) != -1) System.out.write(c);
}
else {
//Ðinh dang này së duoc giói thiêu trong phân sau
System.out.println("Unrecognized Content Type");
}
}
}
Chú ý: Ban có thê không cân dùng dôi tuong Store, ban có thê thay doan chuong trình sau:
Store store = session.getStore("pop3");
store.connect(smtpHost, "thek44a2", "abc");
//Lây vê thu muc INBOX
Folder folder = store.getFolder("INBOX");
Boi doan chuong trình
URLName urlName=new
URLName("pop3","utehy.edu.vn",110,"INBOX","thek44a2","abc");
Folder folder = session.getFolder(urlName);
Báng cách này ban không cân phai tao ra dôi tuong Store
2. Lây vê các thông tin di kèm vói mail
Ban có thê lây vê các thông tin di kèm voi thu nhu: ngày gui, tiêu dê…
phuong thuc printInfo sau së in ra màn hình các thông tin di kèm voi thu.
public static void printInfo(Message m)throws Exception
{ //Lây vê dia chi cúa nguòi gúi
String from = InternetAddress.toString(m.getFrom());
if (from != null) System.out.println("From: " + from);
//Hoãc
Address[] from = m.getFrom();
if (from != null) {
for (int i = 0; i < from.length; i++) {
System.out.println("From: " + from[i]);
}
}
//Lây vê các dia chi dã phán hôi
String replyTo = InternetAddress.toString(m.getReplyTo());
Trang 218
if (replyTo != null)
System.out.println("Reply-to: "+ replyTo);
//Hoãc
Address[] reply = m.getReplyTo();
if (reply != null) {
for (int i = 0; i < reply.length; i++) {
System.out.println("Reply: " + reply[i]);
}
}
//Lây vê các dia chi TO
String to = InternetAddress.toString(m.getRecipients(Message.RecipientType.TO));
if (to != null) System.out.println("To: " + to);
//Lây vê các dia chi CC
String cc = InternetAddress.toString(m.getRecipients(Message.RecipientType.CC));
if (cc != null) System.out.println("Cc: " + cc);
//Lây vê các dia chi BCC
String bcc = InternetAddress.toString(m.getRecipients(Message.RecipientType.BCC));
if (bcc != null) System.out.println("Bcc: " + to);
//Lây vê tiêu dê cúa thu
String subject = m.getSubject();
if (subject != null) System.out.println("Subject: " + subject);
//Lây vê ngày thu duoc gúi
Date sent = m.getSentDate();
if (sent != null) System.out.println("Sent: " + sent);
//Lây vê ngày thu duoc nhân
Date received = m.getReceivedDate();
if (received != null) System.out.println("Received: " + received);
}
3. Nhân mail vói các file dính kèm
Nêu nôi dung thu có chua file dính kèm ban có thê tách phân dính kèm, phân thu ra.
Ví du GetMailAttach.java minh hoa cách kiêm tra mail có file dính kèm hay không?, nêu
có thì ghi nôi dung cua file dính kèm xuông thu muc C:\data.
//GetMailAttach.java
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import com.sun.mail.pop3.*;
import java.net.*;
import java.io.*;
public class GetMailAttach {
public static void main(String[] args) throws Exception {
String smtpHost = "utehy.edu.vn";
int smtpPort = 25;
//tao ra môt mail Session
Properties props = new Properties();
props.put("mail.smtp.host", smtpHost);
props.put("mail.smtp.port", "" + smtpPort);
Trang 219
Session session = Session.getDefaultInstance(props, null);
//Lây vê Store
Store store = session.getStore("pop3");
//Kêt nôi vói mail server
store.connect(smtpHost, "thek44a2", "abc");
//Lây vê thu muc INBOX
Folder folder = store.getFolder("INBOX");
//Nêu không có thu muc này thì thoát
if (folder == null) {
System.out.println("No folder");
System.exit(1);
} //Mó thu muc dê lây thu theo chê dô chi doc
folder.open(Folder.READ_ONLY);
//Lây vê các thu trong Mail Box
Message[] messages = folder.getMessages();
//Xú lý tùng thu môt
for (int i = 0; i < messages.length; i++) {
//Lây vê nôi dung cúa thu
Object body = messages[i].getContent();
//Kiêm tra xem nôi dung thu có nhiêu phân hay không?
if (body instanceof Multipart) {
//Nôi dung thu gôm nhiêu phân
processMultipart( (Multipart) body);
}
else { //Nôi dung thu chi có môt phân
processPart(messages[i]);
}
}
// Ðóng kêt nôi, nhung không xoá các thu
folder.close(false);
store.close();
}
//Phuong thúc xú lý thu gôm nhiêu Part
public static void processMultipart(Multipart mp) throws MessagingException {
for (int i = 0; i < mp.getCount(); i++) {
processPart(mp.getBodyPart(i));
}
}
//Phuong thúc xú lý môt Part
public static void processPart(Part p) {
try {
//Thú lây vê tên file cúa Part
String fileName = p.getFileName();
/* ây vê dâu hiêu cho biêt Part có phái là phân file dính kèm không */
String disposition = p.getDisposition();
/* Kiêm tra xem Part có phái là file dính kèm không?
Chú ý không nên sú dung disposition.equals(Part.ATTACHMENT), vì disposition có thê
nhân giá tri null khi dó phuong thúc equals së nhân môt ngoailê
*/
Trang 220
if (Part.ATTACHMENT.equals(disposition)) {
//Nêu Part là phân chúa file dính kèm
if (fileName == null) fileName = "data.txt";
File f = new File("C:/data/" + fileName);
for (int i = 0; f.exists(); i++) {
f = new File("C:/data/" + fileName + " " + i);
}
//Lây vê luông xuât gãn vói têp tin
FileOutputStream out = new FileOutputStream(f);
//Lây vê luông nhâp gãn vói Part
InputStream in = new BufferedInputStream(p.getInputStream());
//Khai báo vùng nhó tam dê doc nôi dung tù Part
byte buffer[] = new byte[in.available()];
in.read(buffer); //Ðoc nôi dung tù part vào vùng nhó dêm
out.write(buffer); //Ghi vùng nhó dêm ra têp
out.flush(); //Ghi dôn hêt vùng dêm ra têp
out.close(); //Ðóng luông gãn vói têp
in.close();//Ðóng luông gãn vói Part
}
else { //Part không phái là phân chúa file dính kèm
System.out.println(p.getContent());
}
}
catch (Exception e) {
System.err.println(e);
e.printStackTrace();
}
}
}
Trang 221
V. Xoá mail
1. Xoá mail
Dê xoá mail ban mo hôp thu voi quyên doc/ghi nhu sau:
Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_ONLY);
Message[] messages = folder.getMessages();
Tiêp dên dát co xoá:
Messages[i].setFlag(Flags.Flag.DELETE,true);
Tiêp dên dóng kêt nôi, mail server së tu dông xoá mail
folder.close(true);//Chú ý bát buôc phai là tham sô true
2. Kiêm tra trang thái cò cua mail
// Kiêm tra trang thái cua các cò :
//Dã dánh dâu xoá
if (messages[i].isSet(Flags.Flag.DELETED)) {
System.out.println("Deleted");
}
//Dã tra loi
if (messages[i].isSet(Flags.Flag.ANSWERED)) {
System.out.println("Answered");
}
//Dã vào thùng rác
if (messages[i].isSet(Flags.Flag.DRAFT)) {
System.out.println("Draft");
}
//Dã duoc gán co
if (messages[i].isSet(Flags.Flag.FLAGGED)) {
System.out.println("Marked");
}
if (messages[i].isSet(Flags.Flag.RECENT)) {
System.out.println("Recent");
}
//Dã doc
if (messages[i].isSet(Flags.Flag.SEEN)) {
System.out.println("Read");
}
if (messages[i].isSet(Flags.Flag.USER)) {
// We don't know what the user flags might be in advance
// so they're returned as an arrya of strings
String[] userFlags = messages[i].getFlags().getUserFlags();
for (int j = 0; j < userFlags.length; j++) {
System.out.println("User flag: " + userFlags[j]);
}
}
Trang 222
Chuong 10: LAP TRÌNH PHÂN TÁN VÓI
JAVA RMI ( REMOTE METHOD INVOKE)
Lâp trình phân tán voi RMI là môt trong nhung vân dê nóng bong cua nên công
nghiêp phân mêm ngày nay. Dê giúp các ban có các kiên thuc co ban vê lâp trình phân tán
và công nghê lâp trình phân tán RMI. Chuong này ta thao luân vê các khía canh dó.
Sau khi hoc xong chuong này nguoi hoc có thê:
Hiêu duoc khái niêm vê lâp trình phân tán và công nghê RMI
ung dung công nghê RMI dê xây dung các ung dung phân tán
Chuyên tham sô cho phuong thuc triêu goi tu xa và nhân kêt qua tra vê tu phuong thuc
triêu goi tu xa
I. RMI và lâp trình phân tán dôi tuong
Thông thuong mã lênh cua môt chuong trình khi thuc thi duoc tâp trung trên cùng
môt máy, dây là cách lâp trình truyên thông. Su phát triên nhu vu bão cua mang máy tính
dác biêt là mang Internet toàn câu, dã khiên các chuong trình truyên thông này không còn
dáp ung duoc yêu câu nua. Các chuong trình bây gio yêu câu phai có su hop tác xu lý, tuc
là mã lênh cua nó dã không tâp trung trên môt máy mà duoc phân tán trên nhiêu máy. Khi
môt ung dung có mã lênh thuc thi duoc phân tán trên nhiêu máy thì chuong trình dó duoc
goi là chuong trình phân tán và viêc lâp trình dê tao ra các chuong trình này duoc goi là lâp
trình phân tán. Có rât nhiêu công nghê lâp trình phân tán nhu: DCOM, CORBA, RMI,
EJB.. trong dó RMI là công nghê thuân Java và dê lâp trình nhât.
Thông thuong nêu các dôi tuong duoc tâp trung trên cùng môt máy thì ban có thê
triêu goi các phuong thuc cua nó báng cách guu cho nó môt thông báo, câu hoi dát ra là
làm thê nào dê có thê triêu goi các phuong thuc cua môt dôi tuong nám trên môt máy khác.
dây chính là nôi dung cua lâp trình phân tán mã lênh RMI (Remote Method Invoke – tam
dich là triêu goi phuong thuc tu xa). RMI là cách thuc giao tiêp giua các dôi tuong Java có
mã lênh cài dát (bao gôm ca phuong thuc và thuôc tính) nám trên các máy khác nhau có thê
triêu goi lân nhau.
Hình sau mô hình triêu goi dôi tuong phân tán. Trên máy A các dôi tuong A1, A2
goi các phuong thuc cua nhau duoc goi là triêu goi phuong thuc cuc bô (local method
invoke) dây là cách lâp trình huong dôi tuong truyên thông vân su dung, tuong tu các dôi
tuong B1, B2, B3 là các dôi tuong cuc bô.
Tuy nhiên các dôi tuong Java có thê triêu goi phuong thuc cua môt dôi tuong nám
trên môt máy khác dua vào giao thuc triêu goi tu xa RMI. Trong mô hình duoi dây thì loi
triêu goi phuong thuc cua dôi tuong B2 ( nám trên máy B) tu dôi tuong A1 ( nám trên máy
A) là loi goi phuong thuc tu xa.
Trang 223
II. Goi phuong thúc tù xa và các vân dê phát sinh
Viêc triêu goi môt phuong thuc tu xa thoat nhìn có ve don gian nhung thuc tê lai
phuc tap hon triêu goi phuong thuc cuc bô. Các dôi tuong trên hai máy khác nhau hoat
dông trên hai tiên trình khác nhau (có hai không gian dia chi khác nhau) nên viêc tham
chiêu biên dia chi dôi tuong là khác nhau. Ví du khi ban truyên môt dôi tuong cho môt
phuong thuc triêu goi tu xa thì thuc su ban truyên môt tham chiêu dôi tuong dên phuong
thuc tu xa, tuy nhiên vùng nho thuc su cua dôi tuong lai nám trên môt máy khác. Loi goi
phuong thuc cuc bô luôn tra vê kêt qua thông qua ngán xêp trong khi loi goi phuong thuc
tu xa kêt qua tra vê phai thông qua kêt nôi mang chính vì vây các su cô vê truyên thông
luôn có thê sây ra, nhu vây viêc bát và kiêm soát lôi trong các ung dung phân tán là rât dát.
III. Vai trò cua các lóp trung gian
Dôi voi loi goi phuong thuc cuc bô, các tham sô truyên vào phuong thuc cung nhu
kêt qua tra vê tu phuong thuc duoc thuc hiên thông qua ngán xêp (stack) trong khi loi goi
phuong thuc tu xa phai duoc dóng gói và chuyên qua mang.
Dê don gian và trong suôt dôi voi nguoi lâp trình dôi tuong Java trên hai máy khác
nhau không triêu goi phuong thuc cua nhau môt cách truc tiêp mà thông qua lop trung gian.
Lop trung gian tôn tai o ca hai phía: phía máy khách (noi goi phuong thuc cua dôi tuong o
xa) và máy chu (noi dôi tuong thuc su duoc cài dát). Phía máy khác lop trung gian này
duoc goi là stub (lop móc), phía máy chu lop trung gian duoc goi là skeletion (lop nôi).
Ta có thê hình dung lop trung gian stub và skel là hai nguoi trung gian giúp các dôi
tuong o xa có thê giao dich duoc voi nhau.
Máy A
A1
A2
Máy B
B1
B2
B3
Máy C
C
Hình 1: Mô hình triêu goi các phuong thuc tu xa
Trang 224
Trong hình trên ban có dôi tuong C1 duoc cài dát trên máy C. trình biên dich Java
giúp ta tao ra hai lop trung gian C1_stub và C1_skel. Lop C1_stub duoc mang vê máy A.
Khi A1 trên máy A triêu goi phuong thuc cua dôi tuong C1 nó së chuyên loi goi phuong
thuc cho lop trung gian C1_stub. Lop trung gian C1_stub có trách nhiêm dóng gói các tham
sô chuyên tham sô qua mang dên phuong thuc duoc triêu goi cua dôi tuong C1. Trên máy
C lop trung gian C1_Skel có nhiêm vu nhân các tham sô và chuyên vào vùng dia chi thích
hop sau dó goi phuong thuc tuong ung. Kêt qua tra vê (nêu có) cua phuong thuc do C1 tra
vê së duoc lop C1_Skel dóng gói và chuyên nguoc vê cho trình khách. Trên máy khách lop
trung gian C1_Stub chuyên giao kêt qua cuôi cùng lai cho A1. Báng co chê này A1 luôn
nghi ráng dôi tuong C1 dang tôn tai ngay trên cùng máy voi nó nhu các dôi tuong cuc bô
khác. Hon nua nho có lop trung gian C1_Stub mà khi kêt nôi mang gáp su cô thì lop trung
gian stub së luôn biêt cách thông báo lôi dên dôi tuong A1.
Thuc tê làm cách nào A1 tham chiêu duoc dên C1, môt khi không có dôi tuong C1 duoc
cài dát trên máy A? C1_Stub trên máy A chi thuc hiên viêc chuyên tham sô, nhân kêt qua
tra vê nêu có và thuc hiên các giao thuc mang, nó không phai là hình anh cua C1. Dê làm
duoc diêu này dôi tuong C1 cân cung câp môt giao diên tuong ung voi các phuong thuc mà
các dôi tuong trên máy khác có thê triêu goi. Chúng ta tiêp tuc làm sáng to dìêu này khi nói
vê giao diên tu xa.
IV. Cài dàt dôi tuong phân tán
1. Giao diên tù xa
Khi ban muôn tao ra môt su vât tu xa thì ban che mat na cài dát nên báng cách
truyên qua môt giao diên. Vây khi khách thu duoc môt tham chiêu dên dôi tuong tu
xa thì thuc chât dó là môt giao diên.
Máy A
C
1
_
s
t
u
b
A1
A1
B1_st ub
Máy C
C
1
_
s
k
e
l
C1
Máy B
B1
B1_skel
Hình 2: Goi phuong t húc cúa dôi t uong t hông qua lóp t rung gian
Trang 225
Khi tao ra môt giao diên tu xa, thì ban phai tuân theo các huong dân sau:
Giao diên tu xa phai là môt giao diên public, tuc là khi tao ra môt giao diên tu xa ta phai
thêm tu khoá public vào truoc dinh nghia giao diên. Báng không, khi ban tham chiêu
dên dôi tuong tu xa ban së thu duoc môt ngoai lê
Giao diên tu xa phai là giao diên duoc kê thua tu giao diên Remote
Môi phuong pháp trong giao diên tu xa phai khai báo RemoteException trong mênh dê
throws bên bât cu ngoai lê nào khác, tuc là tât ca các phuong thuc trong giao diên tu xa
dêu phai ném ra ngoai lê RemoteException
Nêu tham sô truyên cho phuong thuc hoác giá tri nhân vê tu thuc triêu goi tu xa là môt
dôi tuong thì dôi tuong dó phai triên khai giao diên Remote hoác giao diên Serializable
Thông thuong ban thuong thây môt giao diên tu xa có câu trúc nhu sau:
import java.rmi.*;
public interface RemoteInterface extends Remote{
[public] ReturnDataType method1([DataType arg1,][ DataType arg2,.] ) throws
RemoteException;
[public] ReturnDataType method2() throws RemoteException;
}
Ví du 1-1: Sau dây là môt giao diên tu xa don gian cua ung dung HelloRMI
HelloRMI.java
import java.rmi.*;
public interface HelloRMI extends Remote{
public String sayHello() throws RemoteException;
}
Nhìn vào giao diên này ta thây nó giông bât ky giao diên nào khác ngoai tru nó duoc
mo rông tu giao diên Remote và tât ca các phuong thuc trong giao diên này dêu phai nem
ra ngoai lê RemoteException, ban hãy nho ráng tât ca các phuong thuc duoc khai báo trong
giao diên së tu dông là public, thê nên trong giao diên trên ban có thê bo tu khoá public khi
khai báo phuong thuc sayHello.
Ban tiên hành biên dich javac HelloRMI.java ban së thu duoc têp tin HelloRMI.class
2. Triên khai giao diên tù xa
Sau khi ban tao ra giao diên tu xa, công viêc tiêp theo mà ban cân phai làm là triên
khai tât ca các phuong thuc trong giao diên tu xa.
Ví du 1-2: Sau dây là cài dát cua giao diên tu xa HelloRMI
HelloRMIImpl.java
import java.rmi.*;
public class HelloRMIImpl implements HelloRMI {
public String sayHello() throws RemoteException
{
return "Hello RMI";
}
}
Vân dê dát ra là làm thê nào dê cài dát dôi tuong HelloRMI lên môt máy (máy 2) và goi
phuong thuc sayHello() cua HelloRMI tu máy khác (máy 1)? Nhu dã nêu o trên ta không
goi duoc phuong thuc sayHello cua HelloRMI môt cách truc tiêp mà cân có thêm hai lop
trung gian là HelloRMIImpl_Stub và HelloRMIImpl_Skel. Dua vào lop
Trang 226
HelloRMIImpl.class, trình biên dich rmic.exe cua Java së giúp ta tao ra hai lop trung gian
Stub và Skel. Ban mo cua sô DOS – Prompt và gõ vào dòng lênh
Rmic HelloRMIImpl.class
Kêt qua ban së thu duoc hai têp HelloRMIImpl_Stub.class và HelloRMIImpl_Skel.class
3. Cài dát, dáng kí dôi tuong tù xa
Buoc tiêp theo sau khi ban cài dát giao diên tu xa là công viêc dáng ký nó voi trình
rmiregistry theo mâu sau:
Ví du 1-4: Ví du sau là chuong trình dáng ký và cài dát doi tuong HelloRMIImpl voi trình
chu rmiregistry.
Setup.java
import java.rmi.server.*;
import java.rmi.*;
import java.net.*;
public class Setup {
public static void main(String[] args) {
// tao ra môt thê hiên cúa dôi tuong tù xa
HelloRMI h=new HelloRMIImpl();
try {
// Khai báo dôi tuong có khá näng triêu goi tù xa
UnicastRemoteObject.exportObject(h);
// däng ký nó vói trình rmiregistry
Naming.bind("//localhost/hello", h);
// có thê thay phuong thúc bind bói phuong thúc rebind nhu sau:
// Naming.rebind("//localhost/hello", h);
}
catch (MalformedURLException ex) {
}
catch (AlreadyBoundException ex) {
}
catch (RemoteException ex) {
}
}
}
Công viêc dâu tiên ban phai làm khi cài dát dôi tuong tu xa là tao ra môt thê hiên
cua dôi tuong tu xa.
HelloRMI h=new HelloRMIImpl(); ban có thê thay báng dòng lênh
HelloRMIImpl h=new HelloRMIImpl();
Tiêp theo ban goi phuong thuc tinh exportObject cua lop UnicastRemoteObject dê máy ao
java biêt dôi tuong h (HelloRMI) là dôi tuong có kha náng truy xuât tu xa.
UnicastRemoteObject.exportObject(h);
Luu ý dê su dung duoc lop UnicastRemoteObject ban phai khai báo import
java.rmi.server.*; o dâu chuong trình
Trang 227
Buoc cuôi cùng là ban dát cho dôi tuong h môt cái tên goi nho và dáng ký tên này
voi bô dáng ký rmiregistry. Phuong thuc tinh cua lop Naming së thuc hiên diêu này
Naming.bind("[rmi:]//hostname[:port]/name", h);
Phuong thuc bind có hai tham sô: tham sô thu nhât là môt chuôi dinh vi URL, dôi sô
thu hai là ban thân dôi tuong cân dáng ký
Chuôi dinh vi URL có dinh dang nhu sau:
[rmi:]//hostname[:port]/name
Trong dó:
mri là tên giao thuc,dây là phân tuy chon, mác dinh giao thuc là rmi nên ban có thê bo
qua.
Hostname là tên cua máy chu hoác dia chi IP cua máy chu noi dôi tuong phân tán dang
tôn tai.
Port là sô hiêu công cua chuong trình rmiregistry, dây là tham sô tuy chon, nêu bo qua
tham sô này thì công mác dinh là 1009
Name là tên goi nho cua dôi tuong phân tán
Phuong thuc bind së di vào vòng láp vô han cho kêt nôi tu máy kách.
Các chuong trình phía máy khách së dua vào chuôi dinh vi URL mà ta dáng ký voi trình
rmiregistry dê truy tìm tham chiêu dên dôi cân dùng.
Ban có thê khoi dông bô dáng ký rmiregistry này o dâu? Ban mo cua sô DOS-Prompt
và cho chay chuong trình rmiregistry này tu dòng lênh nhu sau:
C:\JDK1.4\bin\rmiregistry.exe
Nêu trong WintNT thì ban có thê chay nó nhu môt dich vu báng dòng lênh start
C:\JDK1.4\bin\rmiregistry.exe
Sau khi khoi dông chuong trình rmiregistry báng môt trong hai cách ban không thây
phan hôi gì ca boi vì dây là chuong trình chay duoi dang dich vu (service).
Mác dinh rmiregistry láng nghe các kêt nôi trên công 1009. Ban có thê chi dinh
công khác cho nó. Ví du lênh sau së khoi dông rmiregistry trên công 2004
C:\Jdk1.4\bin\rmiregistry.exe 2004
Chú ý:
Trong java 1 hostname không thê là localhost, nghia là nêu ban muôn thu nghiêm trên
máy cuc bô thì ban phai truyên cho nó môt dia chi IP cháng han nhu 127.0.0.1 hoác tên cua
máy (dê biêt tên cua máy cua mình ban vào Control Panel\Net Work chon the
Indentification và ban së thây tên máy cua mình trong phân Computer Name)
RMI së không làm viêc chung nào ban chua cài ho giao thuc TCP/IP.
Nêu ban dang kiêm thu trên máy cuc bô thì ban có thê dáng ký voi trình rmiregistry don
gian nhu sau:
Naming.bind(“hello”,h);
Nêu ban dáng ký môt dôi tuong moi voi môt cái tên goi nho dã duoc su dung cho môt
dôi tuong khác ban së nhân duoc môt ngoai lê AlreadyBoundException. Dê ngán can diêu
này ban nên dùng phuong thuc Naming.rebind() thay cho phuong thuc Naming.bind() vì
Naming.rebind() bô sung môt cái tên moi nêu nó chua có và thay thê môt cái tên dã tôn tai
voi môt dôi tuong moi.
Cho dù phuong thuc main() kêt thúc thì dôi tuong tu xa ban tao ra và dáng ký cho nó
môt cái tên vân còn dó chung nào mà rmiregistry vân còn dang chay và ban không goi
Trang 228
phuong thuc Naming.unbind() thì su vât này vân còn dó. Boi lý do này, khi ban phát triên
ung dung cua mình thì ban cân phai tát rmiregistry và cho chay lai nó môi khi ban biên dich
lai dôi tuong tu xa.
Ban không nhât thiêt phai khoi dông rmiregistry nhu môt tiên trình ngoài. Nêu ban biêt
ráng ung dung cua mình là ung dung duy nhât së dùng sô dáng ký. Thì ban có thê bát dâu
nó o bên trong chuong trình cua mình báng dòng lênh:
LocateRegistry.createRegistry(Port);
o dây Port là sô hiêu công. Diêu này là tuong duong voi viêc chay rmiregistry Port tu dâu
nhác cua DOS-Prompt
4. Viêt trình khách triêu goi phuong thúc cua dôi tuong cài dát tù xa
Trình khách triêu goi dôi tuong phân tan RMI có thê là môt trong các kiêu ung dung
sau: ung dung console
ung dung có giao diên dô hoa
ung dung Servlet
trang JSP

Diêu duy nhât ban phai làm trong chuong trình khách là tra cuu và lây vê giao diên
tu xa tu trình chu. Tu dó tro di viêc triêu goi phuong thuc tu xa giông nhu là triêu
goi phuong thuc cua bât ky dôi tuong cuc bô nào khác.
Sau dây là mâu chuong trình phía trình khách triêu goi dôi tuong phân tán RMI
import java.rmi.*;
import java.rmi.registry*;
public Client
{
public static void main(String args[]) throws RemoteException
{
// lây vê tham chiêu dôi tuong phân tán báng phuong thuc Naming.lookup()
RemoteInterface r=(RemoteInterface)Naming.lookup(“[rmi:]//hostname[:port]/name”);
// triêu goi các phuong thuc cua dôi tuong tu xa
}
}
Ví du 1-5: Sau dây là trình khách triêu goi dôi tuong HelloRMI
Client.java
import java.rmi.*;
import java.rmi.registry*;
public Client
{ public static void main(String args[]) throws RemoteException
{// lây vê tham chiêu dôi tuong phân tán báng phuong thuc Naming.lookup()
HelloRMI r=( HelloRMI)Naming.lookup(“//localhost/hello”);
// triêu goi phuong thuc sayHello cua dôi tuong tu xa
System.out.println(HelloRMI.sayHello());
}
}
Trang 229
Dê truy tìm dôi tuong o xa, chuong trình máy khách goi phuong thuc
Naming.lookup(); Phuong thuc này chi yêu câu dôi sô là chuôi cho biêt dia chi cua máy
chu và tên dáng ký cua dôi tuong.
RemoteInterfacer=(RemoteInterface)Naming.lookup(“[rmi:]//hostname[:port]/name”);
Mác dinh phuong thuc Naming.lookup() tra vê môt tham chiêu Object nên ban cân phai
ép kiêu sang giao diên tu xa.
Ban có thê hình dung phuong thuc Naming.lookup() dóng vai trò nhu môt dich vu tìm
kiêm dôi tuong trên máy chu, nó liên lac voi trình rmiregistry trên máy chu và yêu câu tra
vê tham chiêu dôi tuong cho ban su dung. Còn Naming.bind() dóng vai trò nhu dich vu
dáng ký.
Biên dich và chay trình khách
Javac Client.java
Tât ca dá sán sàng, ban hãy chay chuong trình khách nhu sau:
Java Client
Kêt qua thu duoc là loi chào “Hello RMI”
Hình 3 diên dat co chê goi phuong thuc tu xa cua các dôi tuong RMI môt cách tông quát:
Dáng ký dôi tuong voi trình rmiregistry báng cách goi phuong thuc Naming.bind() hoác
Naming.rebind().
Máy khách muôn goi phuong thuc cua dôi tuong trên máy chu truoc hêt cân phai goi
phuong thuc Naming.lookup() dê truy tìm tham chiêu dên dôi tuong o xa theo tên.
Bô dáng ký së tra vê tham chiêu cua dôi tuong o xa thông qua giao diên tu xa.
Dua vào giao diên tu xa mà trình khách có thê goi các phuong thuc cua dôi tuong o xa.
Khi môt phuong thuc duoc goi, loi goi së duoc chuyên dên lop trung gian _Stub. Lop
trung gian này có nhiêm vu dóng gói các tham sô và chuyên dên lop trung gian _Skel
trên trình chu.
Lop trung gian trên máy chu së tiêp nhân các tham sô gui dên tu trình khách và truc tiêp
yêu câu dôi tuong thuc thi phuong thuc và chuyên kêt qua (nêu có) vê cho trình khách.
.
Ví du 2: Viêt lop Calculator, lop này có các phuong thuc add, less, mul, div dùng dê thuc
hiên các phép toán tuong ung công, tru, nhân và chia
Buóc 1: tao ra giao diên tù xa
- Mo môt trình soan thao bât ky gõ vào nôi dung nhu sau:
M¸ y kh¸ ch M¸ y chñ
rmiregist ry
HelloRMI I m
pl
Naming. bin
d
Naming. rebi
nd
Client
Naming. looku
p
1
2
3
HelloRMI
HelloRMI I mpl_St ub HelloRMI I mpl_Skel
4
5
6
Trang 230
//Calculator.java
import java.rmi.*;
public interface Calculator extends Remote {
float add(float a, float b) throws RemoteException;
float less(float a, float b) throws RemoteException;
float mul(float a, float b) throws RemoteException;
float div(float a, float b) throws RemoteException;
}
- Ghi lai vào thu muc C:\NetWork\Server
- Mo cua sô DOS-Prompt và gõ vào dòng lênh biên dich nhu sau:
Buóc 2: Cài dàt giao diên tù xa
- Mo trình soan thao bât ky gõ vào nôi dung sau:
// CalculatorImpl.java
import java.rmi.RemoteException;
public class CalculatorImpl implements Calculator {
public float add(float a, float b) throws RemoteException {
return a+b;
}
public float less(float a, float b) throws RemoteException {
return a-b;
}
public float mul(float a, float b) throws RemoteException {
return a*b;
}
public float div(float a, float b) throws RemoteException {
return a/b;
}
}
- Ghi lai voi cái tên CalculatorImpl.java
- Mo cua sô DOS_Prompt và gõ vào dòng lênh sau dê biên dich
Trang 231
sau khi biên dich ban thu duoc têp tin CalcultatorImpl.class
Buóc 3 Tao ra các lóp trung gian _Stub và _Skel
Ban mo cua sô DOS_Prompt và gõ vào dòng lênh
Sau khi thuc hiên xong lênh này ban së thu duoc hai lop trung gian là
CalcultatorImpl_Stub và CalcultatorImpl_Skel trong cùng thu muc C:\network\server
Buóc 4: Dàng ký dôi tuong tù xa vói trình rmiregistry
- Ban mo trình soan thao bât ky và gõ vào nôi dung nhu sau:
// CalculatorSetup.java
import java.rmi.server.*;
import java.rmi.*;
public class CalculatorSetup {
public static void main(String[] args) throws Exception{
Calculator c=new CalculatorImpl();
UnicastRemoteObject.exportObject(c);
Naming.rebind("rmi://localhost/Cal",c);
}
}
- Ghi lai voi cái tên CalculatorSetup.java trong vào thu muc c:\network\server
- Mo cua sô DOS_Prompt gõ vào dòng lênh sau:
Trang 232
Buóc 5: Khoi dông dich vu dàng ký tên rmiregistry
Ban mo cua sô DOS-Prompt, chuyên vào thu muc C:\NetWork\Server và gõ vào dòng lênh
sau:
Chuong trình dang ký dã duoc khoi dông
Buóc 6: Khoi dông trình setup
Ban mo cua sô DOS-Prompt khác gõ vào dòng lênh
Chú ý: Nêu ban không chuyên vào thu muc C:\NetWork\Server truoc khi khoi dông dich
vu dang ký thì ban së nhân duoc môt lôi
Trang 233
Chuong 11: JAVA JSP (JAVA SERVLET)
Trang 234
Chuong 12: EJB (ENTERPRISE JAVA BEANS)
Chuong này ta së nghiêm cuu và xây dung môt trong nhung thành phân thú vi cua
java dó là JavaBean môt mô hình quan trong trong kiên trúc cua Java.
Các vân dê chính së duoc dê câp trong chuong này
JavaBean và công nghê phân mêm
Tìm hiêu các thành phân cua JavaBean
Tìm hiêu bô phân tích Introspector cua java
Xây dung và su dung JavaBean
Tích hop JavaBean voi các công nghê thành phân khác
I. Tông quan vê JavaBean
JavaBean là môt công nghê lâp trình huong thành phân cua Sun dua trên nên tang
cua ngôn ngu Java. JavaBean là môt giao diên lâp trình dùng dê tao ra nhung khôi mã xây
dung sán và có thê dùng lai duoc. Nhung thành phân JavaBean có thê duoc “nhúng” vào
môt ung dung, liên kêt voi thành phân JavaBean khác hay duoc dùng dê kêt nôi voi các
ung dung. Báng cách su dung JavaBean các nhà phát triên ung dung có thê giam khôi
luong mã mà ho phai viêt. Ho có thê tu viêt ra chúng hoác có thê mua lai cua môt hãng
phát triên thu ba khác (third party).
JavaBean thuc chât là môt lop Java nhu các lop Java thông thuong khác, nhung nó
duoc viêt theo môt quy tác quy dinh truoc, Ban không cân phai viêt thêm bât cu mã
phu nào hay su dung nhung mo rông ngôn ngu dác biêt nào dê tao ra môt Bean.
Diêu duy nhât ban phai làm hoi sua cách dát tên cho các phuong thuc cua mình.
Chính tên phuong thuc moi báo cho công cu xây dung biêt dây có là môt thuôc tính
hay môt su kiên hay chi là môt phuong thuc thông thuong.
II. Xây dung thành phân JavaBean
Nhu dã gioi thiêu o trên JavaBean thuc chât là môt lop java thông thuong. Nhu vây
môt JavaBean cung có các thuôc tính và các phuong thuc. Môt câu hoi ban dát ra là làm thê
nào dê nguoi dùng Bean cua ban có thê biêt duoc trong Bean dó có nhung thuôc tính,
phuong thuc nào, kiêu cua chúng ra làm sao? Diêu này dã duoc các nhà thiêt kê java giai
quyêt môt cách rât don gian. Dê biêt duoc các thuôc tính và các phuong thuc cua môt Bean
ban chi cân tuân thu theo quy tác dát tên sau:
Voi môt thuôc tính có tên là xxx, thì ban tao ra hai phuong thuc: getXxx() và setXxx().
Luu ý ráng ký tu thu nhât sau “get” hay “set” phai viêt hoa. Kiêu tra vê cua phuong
thuc “get” cung chính là kiêu cua dôi phuong thuc “set” và thuong thì chúng cung là
kiêu cua thuôc tính xxx. Ban cung chú ý cho là tên cua thuôc tính và kiêu cho “get” và
“set” là không liên quan.
Voi môt thuôc tính boolean, ban có thê dùng cách tiêp cân “get” và “set” o trên, nhung
ban cung có thê dung “is” thay cho “get”.
Các phuong thuc thông thuong cua Bean không tuân theo quy tác trên, nhung chúng
phai là phuong thuc public.
Nêu Bean cho phép dáng ký thính gia thì voi môt thính gia (listener) XxxListener ban
phai có hai phuong thuc tuong ung di kèm là addXxxListener(XxxListener) và
Trang 235
removeXxxListener(XxxListener). Phân lon các biên cô và thính gia là có sán ban có
thê tu tao ra các biên cô và thính gia riêng cua mình.
1. Thuôc tính cua Bean
Thuôc tính thuc chât là môt biên nám bên trong môt lop, thông thuong các thuôc
tính thuong duoc dát muc truy câp là private. dê truy câp dên các thuôc tính private này ta
thuong dùng hai phuong thuc: “get” mang nghia là lây giá tri cua thuôc tính và “set” hàm
nghia gán giá tri cho thuôc tính. Ví du voi môt Bean don gian có tên là xBean nhu sau:
public class xBean
{
private String myName;
public String getName() { return myName;}
public void setName(String newName) { myName=newName;}
}
Thuôc tính myName trong lop xBean duoc lây và gán gián tri thông qua phuong
thuc getName và setName. Nhu ban thây giua tên thuôc tính và tên phuong thuc “get” và
“set” là không liên quan dên nhau. Khi Bô phân tích (Instrospector) cua java thây trong
Bean có hai phuong thuc tên là getName và setName nó së hiêu ráng bên trong Bean này
có môt thuôc tính tên là name (vì có hai phuong thuc tên là getName và setName).
Ví du: Trình bày cách tao ra các thuôc tính và cách xây dung các phuong thuc “get” và
“set”
public class Bean1 {
private String str; // thuôc tính kiêu String
private int i; // thuôc tính kiêu int
private int[] arr; // thuôc tính kiêu máng int
private boolean b; // thuôc tính kiêu logic
private float f; // thuôc tính kiêu float
private java.io.DataInputStream is; // thuôc tính kiêu dôi tuong
private java.io.DataOutputStream os;
public String getStr() { //Phuong thúc get cho thuôc tính str
return str;
}
public void setStr(String str) { //Phuong thúc set cho thuôc tính str
this.str = str;
}
public int getI() { //Phuong thúc get cho thuôc tính i
return i;
}
public void setI(int i) { //phuong thúc set cho thuôc tính i
this.i = i;
}
//Phuong thúc get cho thuôc tính arr thuôc tính này là môt //máng nên giá tri trá vê là môt
máng
public int[] getArr() { return arr; }
//Phuong thúc set cho thuôc tính arr, thuôc tính này là môt //máng nên tham sô là môt
náng
public void setArr(int[] arr) { this.arr = arr; }
Trang 236
//Phuong thúc get cho thuôc tính b, do thuôc tính này kiêu //logic nên ban có thê sú dung
is thay cho get
public boolean isB() { return b; }
public void setB(boolean b) { this.b = b; }
public float getF() { return f; }
public void setF(float f) { this.f = f; }
//nêu thuôc tính là môt dôi tuong thì phuong thúc get trá //vê môt dôi tuong kiêu dôi
tuong
public java.io.DataInputStream getIs() { return is; }
public void setIs(java.io.DataInputStream is) { this.is = is; }
public java.io.DataOutputStream getOs() { return os; }
public void setOs(java.io.DataOutputStream os) { this.os = os; }
}
a) Các thuôc tính thê hiên su thay dôi (Bound Property)
JavaBean là các thành phân riêng biêt nhung nó vân có thê tuong tác voi các dôi
tuong khác thông qua co chê truyên thông diêp (message). Khi môt thuôc tính cua môt
Bean A thay dôi nó có thê thông báo cho các dôi tuong khác biêt là thuôc tính cua A dã
thay dôi dê dôi tuong này thuc hiên công viêc gì dó cháng han nhu câp nhât lai giá tri cua
nó theo thuôc tính cua A.
Co chê cài dát dê môt thuôc tính có thê thông báo cho các dôi tuong khác biêt khi nó
thay dôi rât don gian chi cân cài dát hai phuong thuc dùng dê dáng ký và loai bo môt
dôi tuong listener nhu sau:
public void add<PropertyName>Listener(PropertyChangeListener lst)
public void remove<PropertyName>Listener(PropertyChangeListener lst)
Ví du: ban có môt JavaBean A có môt thuôc tính size cho biêt kích cõ gì dó. Khi thuôc tính
size thay dôi dê các dôi tuong khác dêu biêt su thay dôi này ta cài dát nhu sau:
public class BeanA
{float size;
private PropertyChangeSupport changeSize=new PropertyChangeSupport(this);
public void addSizeListener(PropertyChangeListener lst){.}
public void removeSizeListener(PropertyChangeListener lst){.}
}
Các dôi tuong muôn nhân duoc thông báo tu JavaBean này dêu phai cài dát giao
diên PropertyChangeListener , sau dó dáng ký voi thành phân BeanA nho các phuong
thuc mà ban xây dung o buoc trên. Phuong thuc duy nhât mà ban phai ghi dè khi cài dát
giao diên PropertyChangeListener là public void propertyChange(PropertyChangeEvent
evt) {..}
Các thu tuc trên dây chi thuc hiên nhiêm vu dáng ký và tao dôi tuong Listener mà
thôi. Dê các dôi tuong Listener này có thê nhân biêt duoc su thay dôi cua thuôc tính size ta
phai goi phuong thuc firePropertyChange cua dôi tuong PropertyChangeSupport tu thành
phân BeanA nhu sau:
public void firePropertyChange (String propertyName, Object oldValue, Object
newValue)
Phuong thuc này së thông báo dên moi dôi tuong listener (báng cách goi phuong
thuc propertyChange cua listener) dã dáng ký voi thành phân JavaBean. Su thay dôi bao
Trang 237
gôm giá tri truoc khi thay dôi (oldValue) và giá tri sau khi thay dôi (newValue) và tên
thuôc tính duoc thay dôi.
Duoi dây là cài dát lop BeanA và môt lop dê thu nghiêm thuôc tình nhân biêt su
thay dôi size
//BeanA.java
import java.beans.*;
public class BeanA {
//Khai báo thuôc tính size
private float size;
// changeSize có nhiêm vu quán lý các dôi tuong listener dã dãng //ký và gúi thông báo
dên chúng môi khi thuôc tính size thay dôi
PropertyChangeSupport changeSize = new PropertyChangeSupport(this);
public float getSize() { return size; }
//Phuong thúc gán giá tri cho cho thuôc tính size
public void setSize(float newSize) {
float oldSize = size; size = newSize;
//Nêu có thay dôi vê kích thuóc thì thông báo dên tât cá các dôi //tuong dã dãng ký lãng
nghe
if(oldSize!=newSize)
changeSize.firePropertyChange("size", new Float(oldSize), new Float(newSize));
}
public void addSizeListener(PropertyChangeListener lst) {
changeSize.addPropertyChangeListener(lst);
}
public void removeSizeListener(PropertyChangeListener lst) {
changeSize.removePropertyChangeListener(lst);
}
}
Ví du sau thu nghiêm BeanA vua cài dát o trên
// TestBeanA.java
import java.beans.*;
public class TestBeanA {
public static void main(String[] args) {
// tao ra môt dôi tuong BeanA
BeanA ba = new BeanA();
//Ðãng ký dôi tuong lãng nghe vói dôi tuong ba
ba.addSizeListener(new MyListener());
//thay dôi giá tri cúa thuôc tính size
ba.setSize(333);
} }
//Tao ra dôi tuong có khá näng läng nghe su thay dôi cúa thuôc tính
class MyListener implements PropertyChangeListener {
//Phuong thúc duy nhât cân phái cài dãt, phuong thúc này //duoc triêu goi môi khi
thuôc tính thay dôi
public void propertyChange(PropertyChangeEvent evt) {
float oldSise = ( (Float) evt.getOldValue()).floatValue();
float newdSise = ( (Float) evt.getNewValue()).floatValue();
String propertyName = evt.getPropertyName();
Trang 238
System.out.println("Change " + propertyName + " old value " + oldSise +
" new value " + newdSise);
}
}
Kêt qua khi chay chuong trình nhu sau:
Change size old value 1.0 new value 333.0
Chú ý:
Trong ví du trên tên cua phuong thuc dùng dê dáng ký là addSizeListener và tên cua
phuong thuc dùng dê gõ bo dáng ký là removeSizeListener tuy nhiên ban có thê dát
cho nó môt cái tên thuy thích cháng han nhu dangKyLangNghe dê dáng ký dôi
tuong láng nghe hay huyBoLangNghe dê huy bo dôi tuong láng nghe.
Các dôi tuong së không biêt dên su thay dôi cua thuôc tính size cho dên khi ban goi
phuong thuc firePropertyChange cua dôi tuong PropertyChangeSupport.
b) Các thuôc tính ràng buôc (Constrain Property)
Han chê cua các thuôc tính bound o trên là các dôi tuong chi phan ung lai khi giá tri
cua thuôc tính dã bi thay dôi. Java cung câp môt kha náng khác manh hon dó là tao ra các
thuôc tính bi ràng buôc (constrain property). Tuong tu nhu thuôc tính bound môi khi thuôc
tính constrain dinh thay dôi giá tri (chi du dinh chu chua thay dôi) nó së thông báo dên tât
ca các dôi tuong dang láng nghe. Dôi tuong láng nghe có thê tu chôi su thay dôi và nhu vây
giá tri cua thuôc tính vân giu nguyên giá tri ban dâu. Nguoc lai nêu tât ca các dôi tuong
láng nghe dêu không phan dôi su thay dôi thì lúc dó thuôc tính này moi nhân duoc giá tri
moi.
Dê môt thuôc tính có thê thông báo cho các dôi tuong khác biêt khi nó sáp thay dôi
giá tri rât don gian ban chi cân cài dát hai phuong thuc dùng dê dáng ký và loai bo
môt dôi tuong listener nhu sau:
public void add<PropertyName>Listener(VetoableChangeListener lst)
public void remove<PropertyName>Listener(VetoableChangeListener lst)
Các dôi tuong muôn nhân duoc thông báo tu JavaBean này dêu phai cài dát giao
diên VetoableChangeListener, sau dó dáng ký, loai voi thành phân BeanA nho các
phuong thuc mà ban xây dung o buoc trên. Phuong thuc duy nhât mà ban phai ghi
dè khi cài dát giao diên VetoableChangeListener là
public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException
{.. }
Dôi tuong láng nghe không dông ý cho thay dôi thuôc tính nó chi cân ném ra môt
ngoai lê PropertyVetoException, thành phân JavaBean có thuôc tính constrain së bát
lây và huy bo viêc thay dôi giá tri cho thuôc tính.
Cung nhu thuôc tính bound, khi thuôc tính constrain có du dinh thay dôi giá tri trong
phuong thuc “set” nó cân thông báo dên các dôi tuong dã dáng ký láng nghe
(listener) voi nó báng phuong thuc fireVetoableChange cua dôi tuong
VetoableChangeSupport tu thành phân JavaBean nhu sau:
public void fireVetoableChange (String propertyName, Object oldValue, Object
newValue)
Trang 239
Phuong thuc này së thông báo dên moi dôi tuong listener (báng cách goi phuong
thuc vetoableChange cua listener) dã dáng ký voi thành phân JavaBean.
Nhân xét: Dôi tuong VetoableChangeSupport cung tuong tu nhu dôi tuong
PropertyChangeSupport dùng dê quan lý các dôi tuong listener. PropertyChangeSupport
duoc dùng voi các thuôc tính bound còn VetoableChangeSupport dùng cho thuôc tính
constrain.
Duoi dây là môt cài dát cho môt JavaBean B có thuôc tính size. Môi khi size thay dôi nó së
thông báo cho các thành phân khác biêt thông qua dôi tuong listener. Dôi tuong listener
này së tu chôi không cho thay dôi nêu size >100.
// BeanB.java
import java.beans.*;
public class BeanB {
//Khai báo thuôc tính size
private int size = 0;
// vetoAgent vó nhiêm vu quán lý tât cá các dôi tuong listener //dã dãng ký
private VetoableChangeSupport vetoAgent = new VetoableChangeSupport(this);
//Phuong thúc lây vê giá tri cúa thuôc tính size
public int getSize() { return size; }
//Phuong thúc dùng dê thay dôi giá tri cúa thuôc tính size
public void setSize(int newSize) {
int oldSize = size;
try { // Thông báo dên tât cá các dôi tuong dã dãng ký lãng nghe
vetoAgent.fireVetoableChange("size", oldSize, newSize);
}
catch (PropertyVetoException ex) {
// Nêu có môt listener nào dó phán dôi không cho phép thay dôi //giá tri cúa thuôc
tính size thì kêt thúc phuong thúc
return;
}
//Nêu tât cá các listener dêu không phán dôi su thay dôi thì // tiên hành gán giá tri mói
cho thuôc tính size
size = newSize;
}
//Phuong thúc dùng dê dãng ký dôi tuong lãng nghe
public void addSizeListener(VetoableChangeListener lst) {
vetoAgent.addVetoableChangeListener(lst);
}
//Phuong thúc dùng dê gõ bó dôi tuong lãng nghe
public void removeSizeListener(VetoableChangeListener lst) {
vetoAgent.removeVetoableChangeListener(lst);
}
}
Ví du sau dùng dê test thu BeanB vua tao
// TestBeanB.java
import java.beans.*;
public class TestBeanB {
public static void main(String[] args) {
Trang 240
//Tao ra môt dôi tuong BeanB
BeanB b = new BeanB();
//Ðãng ký dôi tuong lãng nghe
b.addSizeListener(new MyListener());
//Gán giá tri 10 (10<100) cho thuôc tính size
b.setSize(10);
System.out.println("size=10");
System.out.println(">Sau khi gan thuoc tinh size= "+b.getSize());
//Gán giá tri 123 (123>100) cho thuôc tính size
b.setSize(123);
System.out.println("size=123");
System.out.println(">Sau khi gan thuoc tinh size= "+b.getSize());
//Gán giá tri 234 (234>100) cho thuôc tính size
b.setSize(234);
System.out.println("size=234");
System.out.println(">Sau khi gan thuoc tinh size= "+b.getSize());
//Gán giá tri 56 (56>100) cho thuôc tính size
b.setSize(56);
System.out.println("size=56");
System.out.println(">Sau khi gan thuoc tinh size= "+b.getSize());
}
}
//Cài dãt lóp lãng nghe biên cô VetoableChangeListener
class MyListener implements VetoableChangeListener {
//Ghi dè phuong thúc vetoableChange
public void vetoableChange(PropertyChangeEvent evt) throws
PropertyVetoException {
int oldSize = ( (Integer) evt.getOldValue()).intValue();
int newSize = ( (Integer) evt.getNewValue()).intValue();
String propName = evt.getPropertyName();
//Nêu newSize>100 thì không cho thay dôi bãng cách ném ra môt //ngoai lê
PropertyVetoException
if (newSize > 100)
throw new PropertyVetoException(
"Gia tri gan cho Size lon hon 100", evt);
}
}
Kêt qua khi chay chuong trình
size=10
>Sau khi gan thuoc tinh size= 10
size=123
>Sau khi gan thuoc tinh size= 10
size=234
>Sau khi gan thuoc tinh size= 10
size=56
>Sau khi gan thuoc tinh size= 56
Trang 241
2. Xây dung các phuong thúc cho JavaBean
Các phuong thuc cua JavaBean duoc xây dung nhu các phuong thuc thông thuong.
3. Tao ra JavaBean có kha náng láng nghe biên cô
Môt JavaBean có thê duoc thiêt kê dê láng nghe môt sô biên cô do các dôi tuong
khác gui dên. Dê có thê láng nghe và xu lý các biên cô do các dôi tuong khác gui dên
JavaBean cua ban chi cân triên khai các giao diên tuong ung và cài dát các phuong thuc
cân thiêt trong các giao diên dó, sau dó dáng ký nó voi các dôi tuong nguôn.
Ví du: Dê JavaBean cua ban có thê xu lý các biên cô vê chuôt do các dôi tuong khác gui
dên, JavaBean cua ban chi cân cài dát giao diên MouseListener nhu sau:
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
public class Bean3
implements MouseListener {
public void mouseClicked(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
}
Nhân xét: Nhu ban thây viêc tao ra môt JavaBean có thê láng nghe các biên cô hoàn toàn
tuong tu nhu viêc tao ra các dôi tuong láng nghe biên cô khác.
4. Tao ra JavaBean có thê dáng ký dôi tuong láng nghe biên cô
Ngoài viêc ban có thê tao ra các JavaBean có thê láng nghe biên cô do các dôi tuong
khác gui dên ban còn có thê tao ra các JavaBean có kha náng dáng ký và gui di các biên cô
dên các dôi tuong láng nghe khác. Lúc này JavaBean cua ban duoc coi là dôi tuong nguôn
(dôi tuong phát sinh biên cô- Event Source). Các dôi tuong khác muôn láng nghe và xu lý
biên cô do JavaBean cua ban gui dên nó phai cài dát giao diên láng nghe tuong ung và phai
dáng ký nó voi JavaBean cua ban.
4.1. Dáng ký dôi tuong listener vói thành phân JavaBean
Dê các thành phân khác có thê dáng ký duoc dôi tuong listener voi thành phân
JavaBean thì ban thân thành phân JavaBean cua ban phai cài dát hai phuong thuc theo
khuôn mâu (pattern) sau:
public synchronized void add<EventListener>(<EventListener> lst)
public synchronized void remove<EventListener>(<EventListener> lst)
Ví du: Dê các dôi tuong khác có thê dáng ký dôi tuong listener cho tình huông nhân chuôt
thì JavaBean cua ban phai cài dát hai phuong thuc dáng ký nhu sau:
Trang 242
public synchronized void addMouseListener(MouseListener l)
public synchronized void removeMouseListener(MouseListener l)
Thành phân JavaBean cân luu lai danh sách các listener dã dáng ký. Khi muôn
chuyên giao tình huông. JavaBean së goi dên tung phuong thuc tuong ung cua các listener
này. Nêu có nhiêu listener cùng dáng ký thì JavaBean cua ban thuong luu lai danh sách các
dôi tuong listener dã dáng ký báng môt Vecto nhu sau:
//Tao ra môt Vecto dê luu lai danh sách các listener dã dáng ký
private transient Vector mouseListeners=new Vector();
//Phuong thuc dáng ký dôi tuong listener
public synchronized void addMouseListener(MouseListener l) {
//Nêu listener dáng ký chua có trong danh sách thì thêm nó vào
if (!mouseListeners.contains(l)) {
mouseListeners.addElement(l); // Thêm vào danh sách
}
}
//Phuong thuc dùng dê loai bo môt listener
public synchronized void removeMouseListener(MouseListener l) {
if (mouseListeners != null && mouseListeners.contains(l)) {
mouseListeners.removeElement(l);
}
}
Hai phuong thuc trên chi là hình thuc dùng dê dáng ký và loai bo các dôi tuong láng
nghe mà thôi. Thuc chât nó chua gui di bât cu thông báo nào dên dôi tuong láng nghe. Khi
môt JavaBean muôn thông báo dên các dôi tuong láng nghe nó chi cân duyêt trong danh
sách các dôi tuong dã dáng ký láng nghe biên cô và goi phuong thuc tuong ung mà dôi
tuong listener dã cài dát.
Duoi dây là môt ví du minh hoa, ta xây dung thành phân JavaBean có kha náng tiêp
nhân các dôi tuong listener dùng dê xu lý tình huông chuôt.
// MouseBean.java
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.*;
public class MouseBean
extends JPanel {
// Môt Vecto luu trü các dôi tuong listener
private transient Vector mouseListeners = new Vector();
// Tao ra môt nút lênh
JButton jButton1 = new JButton();
public MouseBean() {
jButton1.setText("Mouse JavaBean");
jButton1.addMouseListener(new MyListener(this));
this.setLayout(new BorderLayout());
this.add(jButton1, BorderLayout.CENTER);
}
//Phuong thúc dùng dê loai bó dôi tuong lãng nghe biên cô
Trang 243
public synchronized void removeMouseListener(MouseListener l) {
if (mouseListeners != null && mouseListeners.contains(l)) {
mouseListeners.removeElement(l);
}
}
//Phuong thúc dùng dê dãng ký dôi tuong lãng nghe biên cô
public synchronized void addMouseListener(MouseListener l) {
if (!mouseListeners.contains(l)) {
mouseListeners.addElement(l);
}
}
/*Phuong thúc này dùng dê thông báo dên tât cá các dôi tuong lãng nghe biên cô khi có
su kiên mouseClick sây ra trên dôi tuong jbutton1*/
protected void fireMouseClicked(MouseEvent e) {
if (mouseListeners != null) {
int count = mouseListeners.size();
for (int i = 0; i < count; i++) {
( (MouseListener) listeners.elementAt(i)).mouseClicked(e);
}
}
}
/*Khi chuôt duoc kích trên nút lênh thì thông báo dên tât cá các dôi tuong dã dãng ký
lãng nghe bãng cách goi phuong thúc fireMouseClicked */
void jButton1_mouseClicked(MouseEvent e) {
fireMouseClicked(e);
}
}
//Tao ra lóp lãng nghe su kiên chuôt cúa nút lênh
class MyListener
extends java.awt.event.MouseAdapter {
MouseBean adaptee;
MyListener(MouseBean adaptee) {
this.adaptee = adaptee;
}
public void mouseClicked(MouseEvent e) {
adaptee.jButton1_mouseClicked(e);
}
}
Sau dây là ung dung dê test thu thành phân MouseBean. Có môt thính gia láng nghe biên
cô click trên MouseBean. Khi ban kích chuôt trên MouseBean thì thính gia này së xuât hiên
môt hôp thông báo (message).
// Frame1.java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Frame1
extends JFrame {
//tao ra dôi tuong MouseBean
Trang 244
MouseBean mouseBean1 = new MouseBean();
public Frame1() {
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setLocale(java.util.Locale.getDefault());
this.getContentPane().setLayout(null);
mouseBean1.setBounds(new Rectangle(61, 34, 137, 48));
//Ðäng ký dôi tuong läng nghe vói dôi tuong MouseBean
mouseBean1.addMouseListener(new MouseBeanListener(this));
this.getContentPane().add(mouseBean1, null);
}
public static void main(String[] args) {
Frame1 f = new Frame1();
f.setBounds(100, 100, 270, 150);
f.setVisible(true);
}
//Khi kích chuôt vào MouseBean thì hiên thi hôp thông báo
void mouseBean1_mouseClicked(MouseEvent e) {
JOptionPane.showMessageDialog(this, "Ban vua kich chuot vao MouseBean","Test
MouseBean",JOptionPane.INFORMATION_MESSAGE);
}
}
//Tao ra dôi tuong läng nghe
class MouseBeanListener
extends java.awt.event.MouseAdapter {
Frame1 adaptee;
MouseBeanListener(Frame1 adaptee) {
this.adaptee = adaptee;
}
public void mouseClicked(MouseEvent e) {
adaptee.mouseBean1_mouseClicked(e);
}
}
Kêt qua chay chuong trình sau khi ban kích chuôt vào MouseBean
Trang 245
4.2. Kha náng dáng ký môt listener (unicast) và nhiêu listener (milticast) cua thành phân
JavaBean
Thông thuong môt JavaBean cho phép dáng ký nhiêu dôi tuong láng nghe biên cô.
Co chê cho phép nhiêu listener cùng duoc dáng ký dê xu lý cùng môt tình huông duoc goi
là milticast. Tuy nhiên, voi co chê này dôi lúc së dân dên truong hop xâm pham lân nhau,
cháng han listener này thì cho phép thay dôi giá tri cua thuôc tính trong khi listener khác lai
ngán can. Chính vì vây môt vài thành phân JavaBean chi cho phép dáng ký môt listener mà
thôi (unicast), nêu có nhiêu hon môt listener duoc dáng ký thì phuong thuc dáng ký cua
JavaBean cân duoc thiêt kê dê ném ra môt ngoai lê là: TooManyListenerException nhu
sau:
public void add<EventListenerType>(< EventListenerType> lst) throws
TooManyListenerException
Doan chuong trình sau tao ra hai phuong thuc add và remove chi cho phép dáng ký
môt listener mà thôi:
MouseListener saveListener=null;
/* Phuong thuc dáng ký dôi tuong listener*/
public void addMouseListener(MouseListener lst) throws TooManyListenerException
{ if(saveListener==null){
saveListener=lst;
} else{
/*
Nêu dã có môt listener nào dó duoc dáng ký thì ném ra môt ngoai lê
*/
throw new TooManyListenerException();
}
//Phuong thuc này dùng dê loai bo dôi tuong listener
public void removeMouseListener(MouseListener lst)
{
saveListener=null;
}
Dê hiêu rõ hon, duoi dây ta së viêt môt ví du minh hoa cho su tranh châp khi có
nhiêu dôi tuong listener cùng dáng ký xu lý môt tình huông. Chuong trình này dùng lai
thành phân BeanB dã thiêt kê o phân dâu (xem ví du vê thuôc tính ràng buôc –contrain
property). Thuôc tính size cua thành phân BeanB là thuôc tính ràng buôc, truoc khi thay dôi
giá tri cua thuôc tính nó cân hoi ý kiên cua tât ca listener. Dê minh hoa ta së tao ra hai dôi
tuong listener là MyListener21 chi cho phép thay dôi thuôc tính size khi giá tri moi lon hon
50 còn MyListener22 chi cho phép thay dôi thuôc tính size khi giá tri moi lon hon 100.
Chuong trình su dung hai dôi tuong listener cùng xu lý môt tình huông.
//UseBean2.java
import java.beans.VetoableChangeListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyVetoException;
public class UseBean2 {
public static void main(String[] args) {
Trang 246
BeanB b = new BeanB();
b.addSizeListener(new myListener21());
b.addSizeListener(new myListener22());
System.out.println("old size:" + b.getSize() + " set new size 30");
b.setSize(30);
System.out.println("size after setting:" + b.getSize());
System.out.println("old size:" + b.getSize() + " set new size 90");
b.setSize(90);
System.out.println("size after setting:" + b.getSize());
}
}
class myListener21
implements VetoableChangeListener {
public void vetoableChange(PropertyChangeEvent evt) throws
PropertyVetoException {
int newSize = ( (Integer) evt.getNewValue()).intValue();
if (newSize > 50)
throw new PropertyVetoException("Gia tri lon hon 50 Listener 1 reject",
evt);
}
}
class myListener22
implements VetoableChangeListener {
public void vetoableChange(PropertyChangeEvent evt) throws
PropertyVetoException {
int newSize = ( (Integer) evt.getNewValue()).intValue();
if (newSize > 100)
throw new PropertyVetoException("Gia tri lon hon 100 Listener 2 reject",
evt);
}
}
Kêt qua chay chuong trình:
old size:0 set new size 30
size after setting:30
old size:30 set new size 90
size after setting:30
Quan sát kêt qua chay chuong trình ta thây tât ca giá tri lon hon 50 dêu không thê
gán duoc cho thuôc tính size, mác dù listener thu hai là myListener22 cho phép gán
giá tri >50 và <100 nhung listener thu nhât là myListener22 lai không cho phép, nhu
vây trong truong hop listener thu hai myListener22 cài dát mà không biêt ráng
myListener21 dã duoc cài dát truoc dó thì nguoi dùng cuôi së bi nhâm lân.
Chính vì vây java phân biêt hai cách dáng ký listener là unicast và multicast. Tuy
nhiên theo khuyên khích thì các thành phân JavaBean nên duoc xây dung dê hô tro co chê
dáng ký nhiêu dôi tuong listener (multicast).
Trang 247
III. Tìm hiêu Instrospector
1. Instrospector là gì?
Môt câu hoi ban dát ra là khi ban kéo môt JavaBean tu thanh công cu và tha vào
Form (trong môt môi truong phát triên truc quan nào dó cháng han nhu Jbuilder cháng
han), làm thê nào dê môi truong phát triên truc quan này có thê biêt duoc trong JavaBean
cua ta có nhung thuôc tính, phuong thuc, su kiên nào,..?.
Vân dê này dã duoc giai quyêt báng tính phan xa (reflect), co chê phan xa giúp ta có
thê phát hiên ra các thuôc tính, phuong thuc, su kiên cua môt lop bât ky (kê ca lop vô
danh). Diêu này là hoàn hao dê giai quyêt vân dê Bean mà không yêu câu ban phai làm
thêm bât cu thu thuât ngôn ngu nào nhu vân bi yêu câu trong các ngôn ngu lâp trình truc
quan khác.
Trong thuc tê, môt trong nhung lý do chính mà phan xa duoc thêm vào cho java là
dê hô tro JavaBean (mác dù nó còn duoc dùng trong tuân tu hoá và goi các phuong
thuc dông tu xa). Nhung nhung nguoi thiêt kê java lai muôn cung câp môt công cu
chuân, không nhung làm cho JavaBean don gian hon trong su dung mà còn cung câp
môt ngõ cua chuân dê tao ra các JavaBean phuc tap hon. Công cu này chính là lop
Instrospector, phuong pháp quan trong nhât cua lop này là static getBeanInsfo().
Ban truyên tham chiêu Class cho lop này và nó hoàn toàn di hoi lop dó và cho lai
môt dôi tuong BeanInfo, dua vào BeanInfo này ban có thê mô xe dê tìm ra các
thuôc tính, phuong thuc, su kiên cua JavaBean.
2. Cách mà Instrospector làm viêc
Ví du khi ra có hai phuong thuc nhu sau:
public int getSize()
public void setSize(int newSize)
Theo cách này java hiêu ráng ban muôn tao ra môt thuôc tính có tên là size có kiêu int. Hay
khi tao ra các thuôc tính ràng buôc (contrain property) ta viêt:
public addSizeListener(VetoableChangeListener lst)
public removeSizeListener(VetoableChangeListener lst)
java së hiêu là có môt thuôc tính size cân goi dên hai phuong thuc này môi khi muôn dáng
ký hay loai bo môt dôi tuong listener dùng dê quan sát su thay dôi cua thuôc tính.
Tóm lai nêu các phuong thuc duoc thiêt kê theo môt mâu (pattern) nào dó thì nó së
duoc dem dùng vào muc dích riêng. Thuong thì ta dùng các mâu sau khi xây dung các
phuong thuc dành cho thuôc tính và su kiên.
Thiêt kê các phuong thúc mâu dùng cho thuôc tính
Dôi voi môi thuôc tính ban cân xây dung hai phuong thuc “get” và “set” theo mâu
sau dây:
public <propertyType> get<PropertyName>()
public void set<PropertyName>(<propertyType> newValue)
Trong dó:
propertyType là bât cu kiêu du liêu nào nguyên thuy hay dôi tuong
PropertyName là tên cua thuôc tính
Chú ý:
Nêu thuôc tính có kiêu boolean thì phuong thuc “get” có thê thay báng phuong thuc
“is”
Trang 248
Java chi hiêu là ban dinh tao ra môt thuôc tính nêu nhu có du ca hai phuong thuc “get”
và “set”
Kiêu tra vê cua phuong thuc “get” thuong là kiêu cua dôi phuong thuc “set
Thiêt kê các phuong thúc mâu dùng cho su kiên
Dê xây dung môt su kiên nào dó cho môt thành phân JavaBean ta cân xây dung hai
phuong thuc “add” và “remove” theo mâu sau dây:
public void add<EventListenerType> (<EventListenerType> evt)
public void remove<EventListenerType> (<EventListenerType> evt)
Trong dó EventListenerType là dôi tuong tình huông mà JavaBean muôn các thành phân
khác tuong tác duoc voi mình. Ví du dê thành phân JavaBean có thê dáng ký duoc các tình
huông Action ta viêt
public void addActionListener (ActionListener lst)
public void removeActionListener (ActionListener lst)
3. Tìm hiêu lóp BeanInfo
Khi ban tao ra BeanB (xem lai lop này trong phân thuôc tính ràng buôc) ban có thê
tao ra môt lop phu khác là BeanBBeanInfo.java lop này duoc dân xuât tu lop
SimpleBeanInfo có nhiêm vu cung câp các thông tin vê thành phân JavaBean mà ta xây
dung:
import java.beans.*;
public class BeanBBeanInfo extends SimpleBeanInfo {
Class beanClass = BeanB.class;
String iconColor16x16Filename;
String iconColor32x32Filename;
String iconMono16x16Filename;
String iconMono32x32Filename;
public BeanBBeanInfo() { }
public PropertyDescriptor[] getPropertyDescriptors() {
try {
PropertyDescriptor _size = new PropertyDescriptor("size", beanClass, "getSize",
"setSize");
PropertyDescriptor[] pds = new PropertyDescriptor[] { _size};
return pds;
}
catch(IntrospectionException ex) { ex.printStackTrace(); return null; }
}
public java.awt.Image getIcon(int iconKind) {
switch (iconKind) {
case BeanInfo.ICON_COLOR_16x16:
return iconColor16x16Filename != null ? loadImage(iconColor16x16Filename) : null;
case BeanInfo.ICON_COLOR_32x32:
return iconColor32x32Filename != null ? loadImage(iconColor32x32Filename) : null;
case BeanInfo.ICON_MONO_16x16:
return iconMono16x16Filename != null ? loadImage(iconMono16x16Filename) : null;
case BeanInfo.ICON_MONO_32x32:
return iconMono32x32Filename != null ? loadImage(iconMono32x32Filename) : null;
}
return null;
}
}
Trang 249
Các phuong thuc quan trong mà ban cân quan tâm là:
Phuong thuc getIcon() phuong thuc này duoc goi khi các môi truong phát triên truc
quan muôn lây vê biêu tuong cho JavaBean.
Phuong thuc getPropertyDescriptors() phuong thuc này giúp cho Instrospector dê dàng
lây vê các thuôc tính cua JavaBean.
Phuong thuc getMethodDescriptors() phuong thuc này giúp cho Instrospector dê dàng
lây vê các phuong thuc cua JavaBean…
Báng cách xây dung lop BeanInfo di kèm voi JavaBean cua ban. Trình biên dich dê
dàng tìm ra các thuôc tính, phuong thuc, su kiên. Truoc khi muôn biêt JavaBean cua
ban có nhung thành phân nào trong Bean cua ban truoc tiên nó di tìm trong lop
BeanInfo tuong ung, nêu không tìm thây BeanInfo di kèm voi lop lúc dó nó mây su
dung co chê phan xa hay di tìm các phuong thuc duoc thiêt kê theo mâu.
IV. Dóng gói JavaBean
Truoc khi xuât ban JavaBean ban thuong dóng gói nó vào trong môt têp .jar chuân.
Dê các công cu xây dung truc quan biêt trong têp dóng gói này là môt JavaBean ban cân
tao têp mô ta dóng gói báng cách sau:
Su dung môt trình soan thao bát ky dê tao ra têp tin BeanB.mf nhu sau:
Manifest-Version: 1.0
Name BeansDir/BeanB.class
Name BeansDir/BeanBInfo.class
Java-Bean: True
Ghi lai voi cái tên gì dó cháng han BeanB.mf
Dòng thu nhât cho biêt phiên ban, tu dòng thu hai tro di cho biêt trong tên cua các lop
có trong têp dóng gói, dòng cuôi cùng cho biêt don vi dóng gói này là môt JavaBean.
Ban tiên hành dóng gói báng lênh jar hoàn toàn tuong tu nhu ban dóng gói các lop
khác.

CL C
Ch ng 1: CÁC KHÁI NI M C B N.................................................................. 5 BÀI 1. LÀM QUEN V I JAVA................................................................................... 5 I. L ch s java ........................................................................................................... 5 II. Java em là ai ......................................................................................................... 5 II. M t s c tr ng c a java ..................................................................................... 5 III. Các ki u ng d ng Java........................................................................................ 7 IV. Máy o Java (JVM-Java Virtual Machine) .......................................................... 7 BÀI 2 N N T NG C A JAVA ................................................................................ 9 I. T p ký t dùng trong java ...................................................................................... 9 II. T khoá c a Java .................................................................................................. 9 III. nh danh (tên) ................................................................................................. 10 IV. C u trúc m t ch ng trình java ......................................................................... 10 V. Ch ng trình JAVA u tiên .............................................................................. 12 VI. Chú thích trong ch ng trình ............................................................................ 14 VII. Ki u d li u ..................................................................................................... 15 VII. M t s phép toán trên ki u d li u nguyên thu ............................................... 17 IX. Toán t chuy n ki u .......................................................................................... 23 X. Các hàm toán h c ............................................................................................... 24 XI. Các phép toán trên ki u kí t ............................................................................. 26 BÀI 3. I U KHI N LU NG CH NG TRÌNH .................................................... 27 I. C u trúc r nhánh ................................................................................................. 27 II. C u trúc l p while và do-while ........................................................................... 30 III. C u trúc for ....................................................................................................... 32 IV. L nh break và continue ..................................................................................... 34 Ch ng 2: L P TRÌNH H NG IT NG ......................................................... 37 BÀI 1. NH NGH A L P ....................................................................................... 38 I. Khai báo l p ........................................................................................................ 38 II. Chi ti t v khai báo m t ph ng th c ................................................................. 40 III. T khoá this ...................................................................................................... 43 IV. T khoá super ................................................................................................... 43 V. S d ng l p ........................................................................................................ 44 VI. i u khi n vi c truy c p n các thành viên c a m t l p .................................. 44 BÀI 2. KH I U VÀ D N D P ............................................................................ 47 I. Ph ng th c t o d ng (constructor) ..................................................................... 47 II. Kh i kh i u vô danh và kh i kh i u t nh ...................................................... 49 III. D n d p: k t thúc và thu rác .............................................................................. 51 BÀI 3. CÁC THÀNH PH N T NH ........................................................................... 52 I. Thu c tính t nh .................................................................................................... 52 II. Ph ng th c t nh ................................................................................................ 52 BÀI 4. N P CH NG PH NG TH C .................................................................. 53 I. Khái ni m v ph ng th c b i t i ........................................................................ 53 Trang 2

II. Yêu c u c a các ph ng th c b i t i ................................................................... 53 BÀI 5. K TH A (INHERITANCE) ........................................................................ 54 I. L p c s và l p d n xu t .................................................................................... 54 II. Cách xây d ng l p d n xu t ................................................................................ 54 III. Th a k các thu c tính ...................................................................................... 54 IV. Th a k ph ng th c ........................................................................................ 54 V. Kh i u l p c s ............................................................................................. 54 VI. Ghi è ph ng th c ( Override ) ....................................................................... 56 VI. Thành ph n protected ........................................................................................ 56 VII. T khoá final ................................................................................................... 56 BÀI 6. L P C S TR U T NG ......................................................................... 61 BÀI 7. A HÌNH THÁI ............................................................................................ 62 BÀI 8. GIAO DI N, L P TRONG, GÓI ................................................................... 63 I. Giao di n ............................................................................................................. 63 II. L p trong ............................................................................................................ 65 Bài 9. M NG, XÂU KÝ T , T P H P ................................................................... 67 I. M ng ................................................................................................................... 67 II. Xâu ký t ............................................................................................................ 70 III. L p StringTokenizer ......................................................................................... 75 IV. M t s l p c b n c a Java ............................................................................... 77 V. Các l p t p h p .................................................................................................. 83 Ch ng 3: X LÝ NGO I L ............................................................................ 92 I. M c ích c a vi c x lý ngo i l .......................................................................... 92 II. Mô hình s lý ngo i l c a java .......................................................................... 92 III. c t ngo i l ................................................................................................... 93 III. Ném ra ngo i l ................................................................................................. 93 IV. B t ngo i l ....................................................................................................... 93 V. Kh i ‘finally’ ...................................................................................................... 95 VI. M t s l p ngo i l chu n c a Java ................................................................... 96 Ch ng 4: L P TRÌNH A TUY N ........................................................................ 97 I. Các ki n th c liên quan ........................................................................................ 97 II. L p trình a tuy n trong Java .............................................................................. 98 Ch ng 5: NH P XU T (Input/Output) ............................................................... 104 I. L p lu ng .......................................................................................................... 105 II. L p File ............................................................................................................ 113 Ch ng 6: L P TRÌNH HO AWT ................................................................ 120 I. Gi i thi u v h th ng ho c a Java .............................................................. 120 II. Trình qu n lý hi n th trong Java ...................................................................... 124 III. X lý s ki n trong Java .................................................................................. 125 Ch ng 7 L P TRÌNH C S D LI U .............................................................. 143 I. T ng quan 143 II. Các k u trình i u khi n JDBC......................................................................... 143 Trang 3

III. Các l p trong JDBC API dùng truy c p CSDL ........................................... 146 IV. K t n i CSDL v i JDBC ................................................................................. 147 V. T ng tác v i CSDL ........................................................................................ 152 VI. Qu n lý giao d ch ............................................................................................ 160 Ch ng 8: L P TRÌNH SOCKET .............................................................................. 164 I. Các ki n th c liên quan ...................................................................................... 164 II. Kh o sát m t s l p trong gói java.net .............................................................. 164 2. L p URL và URI .............................................................................................. 171 3. L p Socket........................................................................................................ 176 4. L p ServerSocket.............................................................................................. 182 5. L p DatagramSocket ......................................................................................... 185 6. L p DatagramPacket ......................................................................................... 185 III. TCP Socket ..................................................................................................... 185 Ch ng 9: JAVA MAIL .............................................................................................. 205 I. Các khái ni m MAIL ......................................................................................... 205 II. G i mail v i th vi n có s n c a java ............................................................... 206 III. Gi i thi u java mail API .................................................................................. 207 III. G i mail .......................................................................................................... 212 IV. Nh n mail ....................................................................................................... 215 V. Xoá mail ........................................................................................................... 221 Ch ng 10: L P TRÌNH PHÂN TÁN V I ................................................................. 222 JAVA RMI ( REMOTE METHOD INVOKE)............................................................. 222 I. RMI và l p trình phân tán i t ng .................................................................. 222 II. G i ph ng th c t xa và các v n phát sinh ................................................. 223 III. Vai trò c a các l p trung gian .......................................................................... 223 IV. Cài t i t ng phân tán .............................................................................. 224 Ch ng 11: JAVA JSP (JAVA SERVLET) ................................................................. 233 Ch ng 12: EJB (ENTERPRISE JAVA BEANS) ........................................................ 234 I. T ng quan v JavaBean ..................................................................................... 234 II. Xây d ng thành ph n JavaBean ........................................................................ 234 III. Tìm hi u Instrospector ..................................................................................... 247 IV. óng gói JavaBean ......................................................................................... 249

Trang 4

T ó. C u trúc “struct” và “union” c ng c lo i b kh i Java. âu âu c ng là s v t. . u tiên mã ngu n c biên d ch b ng công c JAVAC chuy n thành d ng ByteCode. Do v y nó s d ng các cú pháp c a C và các c tr ng h ng i t ng c a C++. nó ã tr thành m t công c l p trình c a các l p trình viên chuyên nghi p. Nó là ngôn ng l p trình h ng i t ng c l p thi t b . Java kh i thu tên là Oak. “Java” là cái tên c ch n.Ch ng 1: CÁC KHÁI NI M C B N BÀI 1. th nên kh u hi u c a các nhà thi t k Java là “Write One. H ng i t ng Có th nói java là ngôn ng l p trình hoàn toàn h ng i t ng. Run Any Where”. t t c c trong java u là s v t. thao tác nh ngh a ch ng toán t (operator overloading). nh ng ã l c b i các c tr ng ph c t p. ng ý b o java là C++ nh ng ã b i nh ng th ph c t p. II. Java em là ai Java là ngôn ng l p trình h ng i t ng. không c n thi t. Java không ch dùng vi t các ng d ng ch y n l hay trong m ng mà còn xây d ng các trình i u khi n thi t b cho n tho i di ng. M c tiêu c a các nhà thi t k Java là cho phép ng i l p trình vi t ch ng trình m t l n nh ng có th ch y trên b t c ph n c ng c th . L ch s java Java là m t ngôn ng l p trình c Sun Microsystems gi i thi u vào tháng 6 n m 1995. Java c s d ng r ng rãi vi t ch ng trình ch y trên Internet.là cây s i m c phía sau v n phòng c a nhà thi t k chính ông Jame Gosling. Java là ngôn ng v a biên d ch v a thông d ch. do v y không th dùng Java vi t m t ch ng trình h ng ch c n ng. Java t a nh C++. Nên có ng i b o Java là “C++--“. không c n thi t c a C và C++ nh : thao tác con tr . Ban u Java c thi t k làm ngôn ng vi t ch ng trình cho các s n ph m i n t dân d ng nh u video. c l p v i h n n M c tiêu chính c a các nhà thi t k java là c l p v i h n n hay còn g i là c l p ph n c ng và h u hành. … II. n tho i. sau này ông th y r ng ã có ngôn ng l p trình tên Oak r i. Ngày nay. máy nh n tin. LÀM QUEN V I JAVA I. M t s c tr ng c a java 1 n gi n Nh ng ng i thi t k mong mu n phát tri n m t ngôn ng d h c và quen thu c v i a s ng i l p trình.. Tuy nhiên v i s mãnh m c a Java ã khi n nó n i ti ng n m c v t ra ngoài s t ng t ng c a các nhà thi t k ra nó. ây là kh n ng m t ch ng trình c vi t t i m t máy nh ng có th ch y c b t k âu Trang 5 . PDA. 2. do v y nhóm thi t k quy t nh i tên. Java c xây d ng trên n n t ng c a C và C++. tivi.… Java không s d ng l nh “goto” c ng nh file header (. Java có th gi i quy t h u h t các công vi c mà các ngôn ng khác có th làm c.h). Java là tên c a m t quán cafe mà nhóm thi t k java hay n ó u ng. Sau ó c th c thi trên t ng lo i máy c th nh ch ng trình thông d ch JAVA. 3. không ph thu c vào h u hành.

M t ch ng trình ch ch y c trên m t s h i u hành c g i là ph thu c vào h u hành. g i th t c t xa… 7. EJB. v l p trình phân tán java có công ngh RMI. Web Service. ít l i n. nh d ch v thu nh t nh ng i t ng không còn s d ng n a (garbage collection). v l p trình web phía máy khách java có công ngh servlet/JSP. vi c ép ki u t ng b a bãi c a C. l p trình viên không ph i b n tâm n vi c c p phát b nh . V i java ta có th vi t các ch ng trình có kh n ng ch y song song m t cách d dàng. v i java ta có th vi t các ch ng trình s d ng các giao th c TCP.Java không s d ng con tr và các phép toán con tr . u này làm ch ng trình rõ ràng. C++ nay c h n ch trong Java. u này là không th có i v i m t s ngôn ng l p trình khác nh C/C++. M t ch ng trình ch ch y úng trên m t s h máy c th c g i là ph thu c vào ph n c ng. Trong ch ng trình Java. 4. i u này là không th có v i các ngôn ng l p trình khác. sáng s a. CORBA. i u này ã c nh ng ng i l p trình t cho nó m t kh u hi u vi t m t l n. hay l nh c a b vi x lý. M nh m Java là ngôn ng yêu c u ch t ch v ki u d li u. chu i khi th c thi m b o r ng các truy nh p ó không ra ngoài gi i h n kích th c. Trong các môi tr ng l p trình truy n th ng. Các ch ng trình vi t b ng java có th ch y trên h u h t các h n n mà không c n ph i thay i gì. v l p trình web phía máy khách java có công ngh java applet. Trang 6 . pascal … 6. Tính c l p v i h u hành c hi u theo ngh a m t ch ng trình Java có th ch y c trên t t c các h u hành. trình biên d ch s chuy n t p l nh thành mã máy (machine code). h n th n a vi c ng b tài nguyên dùng chung trong Java c ng r t ng gi n. l p trình viên ph i t mình c p phát b nh . chúng ta ph i biên d ch l i ch ng trình. H tr l p trình a tuy n ây là tính n ng cho phép vi t m t ch ng trình có nhi u n mã l nh c ch y song song v i nhau.Java ki m tra lúc biên d ch và c trong th i gian thông d ch vì v y Java lo i b m t m t s lo i l i l p trình nh t nh. C++ ho c m t ngôn ng nào khác. Phân tán Java h tr y các mô hình tính toán phân tán: mô hình client/server. Nên khi mu n ch y trên lo i CPU khác. V n n y sinh khi l p trình viên quên gi i phóng b nh ã xin c p tr c ó. Tr c khi ch ng trình k t thúc thì ph i t gi i phóng b nh ã c p. Qúa trình c p phát. i v i các ch ng trình vi t b ng C. gi i phóng c th c hi n t ng. Nh ng l nh này ph thu c vào CPU hi n t i trên máy b n. 5. UDP m t cách d dàng. ch b y l i c a Java giúp n gi n hóa qúa trình x lý l i và h i ph c sau l i. ch y m i n . H tr internet M c tiêu quan tr ng c a các nhà thi t k java là t o u ki n cho các nhà phát tri n ng d ng có th vi t các ch ng trình ng d ng internet và web m t cách d dàng.Tính c l p v i ph n c ng c hi u theo ngh a m t ch ng trình Java n u ch y úng trên ph n c ng c a m t h máy nào ó thì nó c ng ch y úng trên t t c các h máy khác. Java ki m tra t t c các truy nh p n m ng.

các ng d ng Web. Máy o Java (JVM-Java Virtual Machine) Máy o là m t ph n m m mô ph ng m t máy tính th t (máy tính o).8. 5. Web Service 8. Applet s c t i v và th c thi t i trình duy t. Nó có t p h p các l nh logic xác nh các ho t ng c a máy tính và có m t h u hành o. Các Java API ch y trên máy ch này m r ng kh n ng c a các ng d ng Java API chu n. máy tr giúp cá nhân… u h tr Java. 2. Applet là ch ng trình h a ch y trên trình duy t t i máy tr m. th c thi các giao d ch và th ng c th c thi thông qua máy ch Web. ng d ng c s d li u Các ng d ng này s d ng JDBC API k t n i t i c s d li u. 3. c bi t là các ng d ng mang tính ch t gi i trí nh game IV. Các ki u ng d ng Java V i Java ta có th xây d ng các ki u ng d ng sau: 1. Chúng còn có th c dùng x lý d li u. III. V i th vi n Socket b n có th l p trình v i hai giao th c: UDP và TCP. ho c Applet t i máy ch . X lý Form c a HTML là cách s d ng n gi n nh t c a JSP/Servlet. Ng i ta có th xem nó nh m t máy tính th t (máy tính có ph n c ng o. u này khi n java ch m ch p i ph n nào. ng d ng nhi u t ng V i Java b n có th xây d ng phân tán nhi u t ng v i nhi u h tr khác nhau nh : RMI. m t ch ng trình java c biên d ch thành mã byte code mã c l p v i h n n. ng d ng h a ây là các ch ng trình Java ch y c l p cho phép ng i dùng t ng tác qua giao di n h a. Applet c nhúng bên trong trang Web. Các ng d ng trên máy ch này c g i là các JSP/Servlet. Th nên b n có th xây d ng các ng d ng ch y trên các thi t b di ng này. máy tr m g i yêu c u t i máy ch . 7. Máy ch x lý và g i k t qu tr l i máy tr m. CORBA. ây là m t ki u ng d ng khá h p dãn. EJB. 4. ng d ng cho các thi t b di ng Hi n nay ph n l n các thi t b di ng nh : i n tho i di ng. b i vì các thi t b di ng này ngày càng ph bi n và nhu c u có các ng d ng ch y trên ó. ng d ng dòng l nh (console) Các ch ng trình này ch y t d u nh c l nh và không s d ng giao di n h a. 6. Thông d ch Các ch ng trình java c n c thông d ch tr c khi ch y. ng d ng m ng Java là m t ngôn ng r t thích h p cho vi c xây d ng các ng d ng m ng. h u hành Trang 7 . Các Java API ch y trên máy ch ch u trách nhi m x lý t i máy ch và tr l i các yêu c u c a máy tr m. nh ng Applet b gi i h n b i tính b o m t. Các thông tin nh p xu t c th hi n t i d u nh c l nh. Chúng có th là Applet hay ng d ng. JSP/Servlet Java thích h p phát tri n ng d ng nhi u l p. ch ng trình thông d ch java s ánh x mã byte code này lên m i n n c th . ng d ng Applets Applet là ch ng trình Java c t o ra s d ng trên Internet thông qua các trình duy t h tr Java nh IE hay Netscape. Khi trang Web hi n th trong trình duy t.

M t khái ni m thông d ng khác trong Java là trình biên d ch “Just In Time-JIT”. Các l nh này s c l u tr và s d ng m i khi g i n. Thanh ghi này tr t i l nh ang th c hi n. M c ích chính c a JIT là chuy n t p l nh bytecode thành mã máy c th cho t ng lo i CPU. Nó thi t l p các l p tr u t ng cho: Ph n c ng bên d i. mã ã biên d ch. Ø Các bi n c c b .o). h u hành. Ø Các toán h ng c a mã bytecode. m t thanh ghi c c b có tên “Program Counter” c s d ng. Trình biên d ch chuy n mã ngu n thành t p các l nh c a máy o mà không ph thu c vào ph n c ng và h u hành c th . Ø Các tham s truy n cho ph ng th c. Máy o t o ra m t môi tr ng bên trong th c thi các l nh b ng cách: Ø N p các file . Các trình duy t thông d ng nh Netscape hay IE u có JIT bên trong t ng t c th c thi ch ng trình Java.class Ø Qu n lý b nh Ø D n “rác” Vi c không nh t quán c a ph n c ng làm cho máy o ph i s d ng ng n x p l u tr các thông tin sau: Ø Các “Frame” ch a các tr ng thái c a các ph ng th c. Khi JVM th c thi mã. Trang 8 . có th thay i n i dung thanh ghi i h ng th c thi c a ch ng trình. Trình thông d ch trên m i máy s chuy n t p l nh này thành ch ng trình th c thi. Trong tr ng h p thông th ng thì t ng l nh m t n i ti p nhau s c th c thi. Khi c n thi t.

. ta không th nh ngh a l i ngh a c a các t khoá. ho c l p không final th k th a finally ph n cu i c a kh i x lý ngo i l ki u s th c float Câu l nh l p for Ch a c dùng goto Câu l nh l a ch n if ch r ng m t l p tri n khai t m t giao di n implements Khai báo s d ng th vi n import ki m tra m t i t ng có ph i là m t th hi n c a l p hay không instanceof s d ng khai báo giao di n interface ki u s nguyên long Khai báo ph ng th c c vi t b ng ngông ng biên d ch C++ native t o m t i t ng m i new Trang 9 . ng i l p trình ph i s d ng t khoá theo úng ngh a mà ng i thi t k ngôn ng ã ra. II. ph ng th c tr u t ng abstract Ki u d li u logic boolean c s d ng k t thúc vòng l p ho c c u trúc switch break ki u d li u s nguyên byte c s d ng trong l n switch case Ch a c s d ng ( dành cho t ng lai) cast c s d ng trong x lý ngo i l catch ki u d li u ký t char Dùng khai báo l p class Ch a c dùng const c dùng trong vòng l p b t u m t vòng l p m i continue c s d ng trong l nh switch default c dùng trong vòng l p u ki n sau do ki u d li u s th c double kh n ng l a ch n th hai trong câu l nh if else ch r ng m t l p c k th a t m t l p khác extends Gía tr logic false Dùng khai báo h ng s . các kí t c nhóm l i theo m t cách nào ó t o thành các t . do v y ta có th dùng các kí t unicode t tên cho các nh danh. T p ký t dùng trong java M i ngôn ng nói chung.BÀI 2 N N T NG C A JAVA I. T khoá c a Java M i ngôn ng l p trình có m t t p các t khoá. Sau ây là m t s t khoá th ng g p: T khóa Mô t S d ng khai báo l p. ph ng th c không th ghi è. các t l i c nhóm l i thành các câu (trong ngôn ng l p trình g i là câu l nh). m t ch ng trình máy tính tính là m t t p các câu l nh c b trí theo m t tr t t mà ng i vi t ra chúng s p t Ngôn ng java c c xây d ng trên b ng ch cái unicode. hàm. nh s d ng nó t tên bi n. ngôn ng l p trình nói riêng u ph i xây d ng trên m t t p h p ch cái (hay còn g i là b ng ch cái).

l p. giao di n ta vi t hoa các kí t u tiên c a m i t trong tên. C u trúc m t ch ng trình java . ví d l p WhileTest. ph ng th c sao cho ngh a c a chúng rõ ràng.M i ng d ng Java bao g m m t ho c nhi u n v biên d ch (m i là m t t p tin có ph n m r ng Java) . ví d area.null package private protected public return short static super switch synchronized this throw throws true try void while m t i t ng không t n t i Dùng khai báo m t gói c t truy xu t c t truy xu t c t truy xu t Quay t ph ng th c v ch g i nó ki u s nguyên Dùng khai báo bi n.M i n v biên d ch bao g m m t ho c nhi u l p Trang 10 n v biên d ch . các kí t toán h c nh +. %. h ng. . ví d PI.Không b t u b ng m t s . n u tên có nhi u t thì ghép l i thì: ghép t t c các t thành m t. readInteger… i v i tên l p. java có phân bi t ch hoa ch th ng . vi t hoa kí t u tiên c a m i t theo sau trong tên. Trong java tên c t theo quy t c sau: . ghi t u tiên ch th ng. Sau ây là quy c t tên trong java (chú ý ây ch là quy c do v y không b t bu c ph i tuân theo quy c này): i v i bi n và ph ng th c thì tên bao gi c ng b t u b ng ký t th ng.Tên h ng bao gi c ng vi t hoa./. nh danh (tên) Tên dùng xác nh duy nh t m t i l ng trong ch ng trình. *. MAX_VALUE IV.Gi ng nh C/C++. thu c tính t nh Truy xu t n l p cha l nh l a ch n m t ph ng th c c quy n truy xu t trên m t i t ng Ám ch chính l p ó Ném ra ngo i l Khai báo ph ng th c ném ra ngo i l Giá tr logic s d ng b t ngo i l Dùng khai báo m t ph ng th c không tr v giá tr Dùng trong c u trúc l p III. n u tên g m nhi u t thì chúng c n i v i hau b i kí t gh ch d i ‘_’. -. ch th ng nên ta ph i c n th n và chú ý. Circle . d hi u.. Do java có phân bi t ch hoa.Không ch a d u cách.Không trùng v i t khoá ._ .Trong java ta có th t tên v i dài tu ý .Ta có th s d ng các kí t ti ng vi t t tên Quy c v t tên trong java Ta nên t tên bi n.Tên nên t sao cho có th mô t c i t ng trong th c t . khoa h c và mang tính c l qu c t . tên ph i b t u b ng kí t ho c b t u b ng kí $. radius.Không trùng v i m t nh danh khác trong cùng m t ph m vi Chú ý: .

l p là m t n v m u có ch a d li u và mã l nh liên quan n m t th c th nào ó.Bên trong thân c a m i l p ta khai báo các thu c tính.”. Ki u d li u m i này c s d ng xác nh các bi n mà ta th ng g i là “ i ng”. do v y mã l nh ph i n m trong l p nào ó. i t ng là các th hi n (instance) c a l p. ph ng th c c a l p ó. M i l nh u c k t thúc b ng d u ch m ph y “. b n c n xác V c b nm tl p c khai báo nh sau: Trang 11 . .java //Nh p kh u các th vi n import th _vi n. nh d li u và các ph ng th c c a l p ó. //Xây d ng các l p public class clsMain{ public static void main(String args[]) { // mb t u c a ch ng trình } } class l p1 { } class l p2 { } - Trong ngôn ng Java. t n v biên d ch là m t t p tin .M i n v biên d ch có nhi u nh t m t l p c khai báo là public.Khi ban khai báo m t l p. trong khi ó m i i t ng là m t th hi n th c s . th c ch t b n ang t o ra m t m t ki u d li u. M i l p xác nh m t th c th .M i ng d ng c l p ph i có duy nh t m t ph ng th c main ( m b t u c a ng d ng) . Khi xây d ng m t l p. n u nh trong n v biên d ch có l p public thì tên c a n v biên d ch ph i trùng v i tên c a l p public (gi ng h t nhau c ký t hoa l n ký t th ng) .. T t c các i t ng u thu c v m t l p có chung c tính và hành vi. Java là ngôn ng h ng i t ng.

.B công c biên d ch và thông d ch JDK c a Sun Microsystem Sau khi cài t JDK (gi s th m c cài t là C:\JDK1....java thông d ch và ch y ch ng trình ta s d ng l nh Trang 12 ..Tên c a l p var_datatype ...... nó bao g m: JVM (Java Virtual Machine) máy o java vì các ch ng trình java c thông d ch và ch y trên máy o java và t p các th vi n c n thi t ch y các ng d ng java. Ch - biên d ch m t ch ng trình java sang mã byte code ta dùng l nh C:\JDK1. .} .JRE (Java Runtime Enviroment) môi tr ng th c thi c a java.Tên c a bi n met_datatype ........ki u d li u c a bi n variablename . <met_datatype> methodname (parameter_list){.. Có hai lo i l p trong ó là l p trong t nh “static” và l p trong không t nh “non static” + L p trong t nh (static) L p trong t nh c nh ngh a v i t khoá “static”.Ki u d li u tr v c a ph ng th c methodname .. } Trong ó: class .. + L p trong không t nh (non static) L p bên trong (không ph i là l p trong t nh) có th truy nh p t t c các thành ph n c a l p bao nó.B n còn có th nh ngh a m t l p bên trong m t l p khác.. các th hi n (instance) c a l p này t n t i bên trong th hi n c a m t l p che ph chúng..Cú pháp: class classname { var_datatype variablename. song không th ng c l i.4\BIN\javac TênT p.. L p trong t nh có th truy nh p vào các thành ph n t nh c a l p ph nó.4) ta s nh n c m t c u trúc th m c nh sau: V...T khoá xác nh l p classname ... ây là l p x p l ng nhau.Tên c a ph ng th c parameter_list – Các tham s c c a ph ng th c . Nó chi ph i vi c truy nh p n các thành ph n c a l p bao ph chúng... . ng trình JAVA u tiên có th biên d ch và ch y các ch ng trình java ta ph i cài ...

jar.c:\jdk1.4\jre\lib\rt.jar + path=….4\jre\lib\rt.4\BIN\java TênT p biên d ch và ch y ch ng trình Java n gi n ta nên thi t t hai bi n môi tr ng “paht” và “classpath” nh sau: .4\bin Kh i ng l i máy th y c tác d ng c a các bi n môi tr ng này Ví d u tiên: ch ng trình Hello World (ch ng trình khi ch y s in ra màn hình l i chào Hello World) Các b c: Trang 13 .C:\JDK1. trong ô value ta thêm vào cu i “.jar.4\bin” Công vi c t các bi n môi tr ng ã xong..i v i dòng WinNT: + R-Click vào My Computerà ch n Propertiesà ch n AdvancedàEnviroment Variables + Trong ph n System variables ch n new thêm bi n môi tr ng m i.C:\jdk1..C:\jdk1.i v i dòng Win9X: M t p C:\Autoexec.4\lib\tools.C:\jdk1.C:\jdk1.4\lib\tools.C:\jdk1.jar.4\lib\dt. th y c tác d ng c a các bi n môi t ng ta c n ph i kh i ng l i máy . m c ích cho d nhìn mà thôi) + C ng trong ph n System variables tìm n ph n path trong danh sáchàch n edit s a l i giá tr hi n có.C:\jdk1.C:\jdk1.4\lib\dt.jar” trong ô variable value (chú ý không gõ d u “ vào.jar. trong h p tho i hi n ra gõ “classpath” vào ô Variable Name và “.bat sau ó thêm vào hai dòng sau: +classpath=.

C++ Cách 2: s d ng c p // ý ngh a c a c p chú thích này gi ng nh c a C.- M m t ch ng trình so n th o v n b n h EditPlus… và gõ vào các dòng sau: public class HelloWorld { public static void main(String[] args){ System.class c ng không c t o ra + Gõ l nh java HelloWorld (chú ý không gõ ph n m r ng) ch y ch ng trình HelloWorld.println("Hello World"). Chú ý: Trong java ta có th t chú thích âu?. nh notepad. ây là ki u chú thích tài li u (không có trong C/C++). C++ Cách 3: s d ng c p /** và */.class trong cùng th m c.java (chú ý tên t p ph i trùng v i tên l p.java biên d ch ch ng trình. n u vi c biên d ch thành công (ch ng trình không có l i cú pháp) thì ta s thu c t p HelloWorld. v i cách chú thích hai ta ch có th chú thích trên m t dòng. V i cách th nh t và cách ba ta có th vi t chú thích trên nhi u dòng. Sau khi thông d ch và ch y ta nh n c - VI.M c a s DOS Prompt + Chuy n vào th m c C:\ + Gõ l nh javac HelloWorld. Chú thích trong ch ng trình Trong java ta có 3 cách ghi chú thích Cách 1: s d ng c p /* và */ ý ngh a c a c p chú thích này gi ng nh c a C. nó dùng t o ra tài li u chú thích cho ch ng trình. ph n m r ng là java) .out. Ghi l i v i cái tên C:\HelloWorld. Trang 14 . câu tr l i là: âu có th t cm t d u cách thì ó có th t chú thích. n u trong ch ng trình còn l i cú pháp thì trong b c này ta s nh n c m t thông báo l i và lúc này t p HelloWorld. wordpad. k c ch hoa ch th ng. } } tr asciii.

Do v y vi c truy xu t vào m t bi n ki u nguyên th y r t nhanh. Các ki u d li u nguyên thu u nguyên thu ki u logic boolean Ki u kí t Ki u s Ki u s Ki u s th c boolean char byte short int long float doubl e T khoá byte short int long float double char boolean void Kích c T i thi u (ki u s nguyên) s nguyên m t byte 8 bit -128 s nguyên ng n 16 bit -215 s nguyên 32 bit -231 s nguyên dài 64 bit -263 (ki u s th c) ki u th c v i chính 32 bit IEEE754 xác n Double-precision 64 bit IEEE754 floating point (ki u khác) ki u kí t 16 bit Unicode 0 ki u logic true ho c false - Mô t T i a 127 215-1 231-1 -263-1 L p bao Byte Short Integer Long IEEE75 Float 4 IEEE75 Double 4 Unicode Character 216-1 Boolean Void ph n c m c a các bi n có ki u nguyên th y là vùng nh c a chúng c c p phát stack. Ki u d li u 1. Là s cài t mô t v m t ng it ng trong bài toán.VII. m c a các bi n ki u tham chi u là nó ch a ng mà nó tr . c t o ra cho phép cài a ch c a it t Là m t l p thu n tr u t a th a k trong Java. Trang 15 Mô t T p h p các d li u cùng ki u. Ki u tham chi u Trong Java có 3 ki u d li u tham chi u Ki u d li u M ng (Array) L p (Class) Giao di n (Interface) c n. 2.

InitValue là giá tr kh i t o cho bi n.N u c n khai báo nhi u bi n có cùng m t ki u d li u ta có th t các khai báo các bi n trên m t dòng. tuy nhiên Java s báo l i n u ta s d ng m t bi n ch a c nh n giá tr 2. VIII.Java s x lý các bi n không c kh i u giá tr nh sau: + i v i thu c tính (bi n c khai báo trong ph m vi c a l p) thì Java s t ng kh i gán giá tr cho các bi n theo quy t c sau: + giá tr 0 cho ki u d li u s + false cho ki u logic + kí t null (mã 0) cho kí t + giá tr null cho ki u i t ng + i v i các bi n c c b thì bi n không c kh i gán giá tr m c nh. Ph m vi bi n M i bi n c khai báo ra có m t ph m vi ho t ng. u này xác nh c tính th y c và th i gian s ng c a bi n. Trang 16 . Vi c truy x t vào vùng nh heap ch m h n truy x t vào vùng nh stack tuy nhiên java có c ch cho phép truy c p vào vùng nh heap v i t c x p x b ng t c truy c p vào vùng nh stack.name là tên c a bi n.Bi n tham chi u it ng Vùng nh c a bi n tham chi u c c p phát vùng nh stack còn vùng nh c a i t ng c c p phát vùng nh heap. ây là ph n tu ch n. tên bi n là m t xâu kí t c t theo quy t c t tên c a java . trong ó: . các bi n này c phân cách nhau b i d u ph y . ph m vi c a bi n là n i mà bi n có th c truy c p. Khai báo bi n ng t ngôn ng C/C++.type là ki u d li u cu bi n . Khai báo bi n 1. khai báo bi n trong java ta s d ng cú pháp sau: type name [=InitValue]. n u b qua ph n này thì giá tr ban u c a bi n c kh i t o giá tr m c nh Chú ý: .

// c i và j u có giá tr 10 Trang 17 . // c i và j u s n sàng } // ch có i s n sàng // j không s n sàng vì n m ngoài ph m vi } Chú ý: Ta không th làm i u sau cho dù nó có th trong C/C++ { int i=1. { int i=10. ph m vi c a bi n tính t m bi n c khai báo cho n cu i kh i mà bi n c khai báo Ví d : { int i=1. M t s phép toán trên ki u d li u nguyên thu 1. Phép gán Cú pháp Bi n=Bi uTh c. do v y h ã quy t nh không cho phép che gi u m t bi n ph m vi l n h n. nó có ngh a là “ hãy tính toán giá tr bi u th c bên ph i d u gán. Chú ý: th i gian s ng c a các i t ng không tuân theo quy lu t th i gian s ng c a các bi n ki u nguyên thu . Phép gán c th c hi n b ng toán t ‘=’.// không c phép vì ã có m t bi n cùng tên v i nó } } Nh ng ng i thi t k java cho r ng u ó có th gây l n l n. // ch có i s n sàng s d ng { int j=10. tuy nhiên vi c khai báo ph i xu t hi n tr c khi bi n c s d ng Ø Bi n ph m vi c c b là bi n c khai báo bên trong m t kh i. VII. sau ó a giá tr ó vào ô nh có tên n m bên trái d u gán’ Chú ý: + Câu l nh gán g m m t d u ‘=’ + Ki u c a bi u th c bên ph i d u gán ph i t ng thích v i ki u d li u c a bi n + Trong java ta có th th c hi n m t d y gán nh sau: i = j = 10.Ø Bi n ph m vi l p là bi n c khai báo bên trong l p nh ng bên ngoài các ph ng th c và hàm t o.

nó xác nh m i quan h gi a chúng.( phép tr ). java c ng có phép toán t ng./ ( phép chia ). gi m. ví d ! = s tr v true n u 2 toán h ng là khác nhau. Toán t toán h c Ngôn ng java c ng có các phép toán s h c nh các ngôn ng khác: + ( phép c ng). t ng sau(gi m tr c. % ( phép toán chia l y ph n nguyên) Ta mô t tóm t t các phép toán s h c qua b ng t ng k t sau: Phép toán + * / % S d ng op1 + op2 op1 . gi m Gi ng nh ngôn ng C/C++. giá tr c a op c gi m xu ng sau khi ---op bi u th c ch a nó c tính Chú ý: n u toán t t ng tr c. Phép toán quan h Phép toán quan h bao gi c ng cho k t qu boolean. * ( phép nhân ). giá tr c a op c gi m xu ng tr c khi -op-bi u th c ch a nó c tính Gi m op xu ng1 n v . Ta tóm t t các phép toán qua b ng sau: Phép toán > >= < <= == != S d ng op1 > op2 op1 >= op2 op1 < op2 op1 <= op2 op1 == op2 op1! = op2 Nh n v giá tr true khi op1 l n h n op2 op1 l n h n ho c b ng op2 op1 nh h n op2 op1 nh h n ho c b ng op2 op1 b ng op2 op1 khác op2 Phép toán S d ng Ví d : S d ng các phép toán quan h public class RelationalDemo { public static void main(String[] args) { // a few numbers Trang 18 . chúng ch khác nhau khi chúng n m trong bi u th c 4. Toán t t ng. gi m sau) ng m t mình(không n m trong bi u th c ) thì chúng ho t ng nh nhau.op2 op1 * op2 op1/ op2 op1 % op2 Mô t C ng op1 v iop2 Tr op1 cho op2 Nhân op1 v i op2 chia op1 cho op2 Tính ph n d c a phép chia op1 cho op2 3. giá tr c a op c t ng lên sau khi bi u th c ++ ++op ch a nó c tính Gi m op xu ng1 n v . . giá tr c a op c t ng lên tr c khi bi u ++ op++ th c ch a nó c tính ng op lên 1 n v . ta có th mô t tóm t t qua các b ng sau: Mô t ng op lên 1 n v .2. phép toán quan h s so sánh 2 giá tr .

out.println("Less than or equal to.. int k = 42. System. i >= j = false j >= i = true k >= j = true Less than.out.// false System.out. System. System..out.println(" i <= j = " + (i <= j))..out..println(" j < i = " + (j < i))..// false //less than or equal to System..println("Greater than or equal to.. //greater than System.println(" k! = j = " + (k! = j)).println("Not equal to..// false System.// true System.println(" k <= j = " + (k <= j)).out.println(" i = " + i).out.println("Greater than.// false.out.println(" k < j = " + (k < j)).println(" i < j = " + (i < j)).out.println(" k >= j = " + (k >= j)). i > j = false j > i = true k > j = false Greater than or equal to.. System. System.println(" j >= i = " + (j >= i)).out.println(" k > j = " + (k > j)).out.println(" j > i = " + (j > i)).. System.println(" i == j = " + (i == j)). System. i = 37 j = 42 k = 42 Greater than.").// false System.// false System. System.out.// true System..out..println(" i > j = " + (i > j)).println(" i! = j = " + (i! = j)).println("Variable values..println("Equal to.out. int j = 42...out.out.// true System.int i = 37.out. System.").// false } } ây là u ra c a ch ng trình Variable values..// true //less than System. System.").println(" k == j = " + (k == j)). // false System.println("Less than. they are equal //greater than or equal to System....out.").out.out.out. Trang 19 ..out.").// true System.").out.// true System.println(" k = " + k).println(" i >= j = " + (i >= j)).out.println(" j <= i = " + (j <= i))..// true //not equal to System.println(" j = " + j).")..out.out.// true //equal to System.

. i == j = false k == j = true Not equal to. Phép toán d ch bit Ta s mô t phép toán d ch chuy n qua b ng sau: Phép toán S d ng K t qu D ch chuy n op1 sang ph i op2 bit. i! = j = true k! = j = false 5. op2 bit phía bên ph i s >> op1 >> op2 c n b ng các bít 0 D ch chuy n op1 sang trái op2 bit(gi nguyên d u c a op1).. op2 bit Sau ây là hình minh ho phép toán d ch bít Trang 20 .1... phép toán thao tác trên bit 6. giá tr c a op2 ch c tính khi op1 là true Ho c op1 ho c op2 là true.. i <= j = true j <= i = false k <= j = true Equal to.i < j = true j < i = false k < j = false Less than or equal to.. Phép toán logic Java h tr 6 phép toán logic Phép toán S d ng && || ! & | ^ op1 && op2 op1 || op2 ! op op1 & op2 op1 | op2 op1 ^ op2 c ch ra trong b ng sau: Nh n v giá tr true khi C op1 và op2 u là true. giá tr c a op2 luôn luôn c tính k c khi op1 là true N u op1 khác op2 Nh n xét: + Phép toán && ( & ) ch nh n giá tr true khi và ch khi c hai toán h ng u là true + Phép toán || ( | ) ch nh n giá tr false khi và ch khi c hai toán h ng là false + Phép toán ^ ch nh n giá tr true khi và ch khi hai toán h ng khác nhau 6. giá tr c a op2 luôn c tính k c khi op1 là false Ho c op1 ho c op2 là true. giá tr c a op2 ch c tính khi op1 là false op là false C op1 và op2 u là true. << op1 << op2 op2 bit n m bên trái s c n b ng các bít 0 >>> op1>>> op2 D ch chuy n op1 sang ph i op2 bit.

Ví d : 13>>1=6 vì 13=11012 do v y khi d ch ph i m t bit ta s c 1102=6 5<<1=10 vì 5=1012 do v y khi d ch trái 1 bit ta s c 10102=10 5<<2=100 vì 5=1012 do v y khi d ch trái 2 bit ta s c 101002=100 Nh n xét: phép toán d ch trái m t bit chính là phép nhân v i 2, còn d ch ph i chính là phép chia cho 2 6.2. Phép toán logic trên bit Các phép toán thao tác bit cho phép ta thao tác trên t ng bit riêng l trong m t ki u d li u thích h p, các phép toán thao tác bit th c hi n i s boolean trên các bit t ng ng c a 2 toán h ng t o ra k t qu Ta tóm t t các phép toán trong b ng sau: Phép toán S d ng & op1 & op2 Th c hi | op1 | op2 Th c hi ^ op1 ^ op2 Th c hi ~ ~op2 Th c hi B ng giá tr chân lý c a các phép toán Th c hi n n phép and các bit t ng ng c a op1 v i op2 n phép or các bit t ng ng c a op1 v i op2 n phép xor các bit t ng ng c a op1 v i op2 n phép l t not các bit c a op2 ái s boolean:

Trang 21

Phép AND op1 op2 0 0 0 1 1 0 1 1

Result 0 0 0 1

Phép XOR op1 op2 Result 0 0 0 0 1 1

Phép NOT op1 Result 0 1 1 0 op1 0 0 1 1 op2 0 1 0 1 Result 0 1 1 1

1 1

0 1

1 0

Ví d : 1101// 13 & 1100// 12 -----1100// 12 1101// 13 | 1100// 12 -----1101// 13 1101// 13 ^ 1100// 12 -----0001// 1 ! 10101=01010 7. Toán t gán t t Gi ng nh C/C++ java c ng có toán t gán, ta tóm t t các toán t gán qua b ng sau: Phép gán += -= *= /= %= S d ng op1 += op2 op1 -= op2 op1 *= op2 op1/ = op2 op1 %= op2 ng op1 = op1 + op2 op1 = op1 - op2 op1 = op1 * op2 op1 = op1/ op2 op1 = op1 % op2 Trang 22 ng

&= |= ^= <<= >>= >>>=

op1 &= op2 op1 |= op2 op1 ^= op2 op1 <<= op2 op1 >>= op2 op1 >>>= op2

op1 = op1 & op2 op1 = op1 | op2 op1 = op1 ^ op2 op1 = op1 << op2 op1 = op1 >> op2 op1 = op1 >>> op2

8. Th t u tiên c a các phép toán Th t u tiên c a các phép toán xác nh trình t tính toán giá tr c a m t bi u th c, java có nh ng quy t c riêng xác nh trình t tính toán c a bi u th c, ta ph i nh quy t c sau: Ø Các phép toán m t ngôi bao gi c ng c th c hi n tr c tiên Ø Trong m t bi u th c có nhi u phép toán thì phép toán nào có u tiên cao h n s c th c hi n tr c phép toán có u tiên th p Ø Trong m t bi u th c có nhi u phép toán có u tiên ngang nhau thì chúng s c tính theo trình t t trái qua ph i Ta có b ng tóm t t th t u tiên c a các phép toán trong b ng sau: postfix operators unary operators creation or cast multiplicative additive shift relational equality Bitwise AND Bitwise exclusive OR Bitwise inclusive OR Logical AND Logical OR Conditional Assignment []. (params) expr++ expr-++expr --expr +expr -expr ~! new (type)expr */ % +<< >> >>> < > <= >= instanceof ==! = & ^ | && || ?: = += -= *=/ = %= &= ^= |= <<= >>= >>>=

Trong b ng trên th t u tiên c a các phép toán c gi m t trên xu ng d i, trên cùng m t hàng thì chúng có u tiên ngang nhau. • Toán t d y Không gi ng nh C/C++, trong java ch duy nh t mà ta có th t toán t d y là bên trong c p ngo c tròn c a c u trúc for( s c mô t chi ti t trong ch ng sau ) IX. Toán t chuy n ki u 9.1 Chuy n i ki u không t ng minh Vi c chuy n i ki u th ng c di n ra m t cách t ng trong tr ng h p bi u th c g m nhi u toán h ng có ki u d li u khác nhau. u này ôi khi làm cho b n khá ng c nhiên vì nh n c m t k t qu không theo ý mu n. Ví d ta xét n trình sau: int two=2, three=3; Trang 23

float result=1.5 +three/two; k t qu nh n c c a result là 2.5. i u mà b n mong mu n là 3.0 ch không ph i là 2.5. K t qu 2.5 nh n c là do three và two là hai giá tr nguyên nên k t qu c a phép chia three/two cho ta m t giá tr nguyên bàng 1 ch không ph i là 1.5. nói r ng k t qu c a phép chia three/two là m t giá tr th c ch không ph i là m t giá tr nguyên thì m t trong hai toán h ng c a phép chia này ph i là m t s th c. Do v y ta c n ph i chuy n ki u c a m t trong hai toán h ng này ho c c hai thành s th c. nh n c k t qu úng trong tr ng h p này b n c n vi t nh sau: float result=1.5 + (float) three/two; ho c float result=1.5 + three/ (float)two; ho c float result=1.5 +(float)three/(float)two; Lý do mà ta vi t nh trên là n u trong m t phép toán có s tham gia c a nhi u toán h ng có ki u khác nhau thì java s chuy n ki u t ng cho các toán h ng m t cách t ng theo quy t c sau: byte -> short -> int -> long -> float -> double 9.2. Chuy n i ki u t ng minh chuy n i ki u m t cách t ng minh ta s d ng cú pháp sau: (type) bi u_th c; khi g p câu l nh này java s tính toán giá tr c a bi u th c sau ó chuy n i ki u giá tr c a bi u th c thành ki u type. Ví d : (int) 2.5 * 2 = 4 (int) 2.5 * 2.5 = 5 (int)(2.5 * 2.5) = 6 1+(float)5/2=1+5/(float)2=1+(float)5/(float)2=3.5 Chú ý: Phép toán chuy n ki u là phép toán có u tiên cao, nên (int)3.5*2≠(int)(3.4*2) C n chú ý khi chuy n m t bi u th c ki u d li u có mi n giá tr l n sang m t ki u có mi n giá tr nh h n. Trong tr ng h p này có th b n s b m t thông tin. X. Các hàm toán h c Các hàm toán h c nh sin, cos, sqrt c java vi t s n trong l p Math. L p này n m trong gói java.lang (gói m c nh) do v y b n không c n ph i thêm câu l nh import u ch ng trình có th s d ng l p này. Các hàm này c vi t là các ph ng th c t nh do v y ta không c n ph i t o ra th hi n c a l p Math. B ng sau li t kê m t s ph ng th c t nh trong l p Math: Tên ph ng th c Mô t ý ngh a tính sin c a arg sin(arg) Ki u tham s arg là m t bi u th double th hi n m theo radians tính cos c a arg arg là m t bi u th double th hi n m theo radians tính tang c a arg arg là m t bi u th double th hi n m theo radians tính sin-1 (arcsin) arg là m t bi u th Trang 24 Ki u tr v c ki u double t cung c ki u double t cung c ki u double t cung c ki u double trong h

cos(arg)

tan(arg)

asin(arg)

double th hi n m t cung radians theo radians tính cos-1 arg là m t bi u th c ki u double trong h acos(arg) (arccosin) c a arg double th hi n m t cung radians theo radians tính tan-1 arg là m t bi u th c ki u double trong h atan(arg) (arctang) c a arg double th hi n m t cung radians theo radians tính tan-1 arg1,arg2 là các bi u th c double trong h atan2 (arg1,arg2) (arctang) c a ki u double th hi n m t radians cung theo radians arg1/arg2 tính tr tuy t i arg là m t bi u th c ki u The same type as abs(arg) c a arg int, long, float, ho c double the argument ki u Nh n v giá tr l n arg1, arg2 là m t bi u th c Nh n v max (arg1,arg2) trong hai tham s ki u int, long, float, ho c cùng kiùu v i tham s double Nh n v giá tr arg1, arg2 lµ mét biùu thøc Nh n v ki u min (arg1,arg2) nh trong hai tham kiùu int, long, float, hoÆc cùng kiùu v i s double tham s Nh n v giá tr arg là bi u th c ki u float double ceil(arg) nguyên nh h n ho c double ho c b ng arg Nh n v giá tr arg là bi u th c ki u float double floor(arg) nguyên l n h n ho c double ho c b ng arg Tr v giá tr arg là bi u th c ki u float Nh n v ki u int round(arg) n u arg kiêu float, nguyên g n arg ho c double nh n v kiùu long nh t, giá tr này n u arg ki u chính là giá tr c a double arg sau khi ã làm tròn Gi ng nh arg là bi u th c ki u double double rint(arg) round(arg) tính c n b c hai arg là bi u th c ki u double double sqrt(arg) c a arg tính arg1arg2 C arg1 và arg2 là các bi u double pow (arg1,arg2) th c ki u double tính earg arg là bi u th c ki u double double exp(arg) tính logarithm s arg là bi u th c ki u double double log(arg) e c a arg double Nh n v m t s Không có tham s random() gi ng u nhiên n m trong kho n [0, 1) Ví d v các hàm toán h c trong l p Math, b n hãy gõ o n ch ng trình sau và cho ch y th th y c k t qu tính toán c a các hàm toán h c. Trang 25

arg

XI. Các phép toán trên ki u kí t i v i ki u kí t ta có th th c hi n các phép toán s h c (nh : +, -, *,/ ) và các phép toán quan h . Ví d : char kt1=’A’; char kt2=tk1+a;// kt2 nh n ký t B char kt3=(char)33*2;// kt3 nh n ký t B (kt1>kt2)= false; (kt2=kt3)= false;

Trang 26

BÀI 3.

U KHI N LU NG CH

NG TRÌNH

Ch ng trình là m t d y các l nh c b trí th c hi n theo m t trình t nào ó, nh ng ôi khi ta mu n u khi n lu ng th c hi n c a ch ng trình tu thu c vào i u ki n gì ó. Ngôn ng l p trình java cung c p m t s phát bi u cho phép ta u khi n lu ng th c hi n c a ch ng trình, chúng c li t kê trong b ng sau: Ki u l nh L p Quy t nh X lý l i R nhánh while, do-while, for if-else, switch-case try-catch-finally, throw break, continue, label:, return T khoá

I. C u trúc r nhánh 1.1. Phát bi u if a) D ng khuy t Cú pháp if (Boolean-expression) statement; s ho t ng c a c u trúc if thi u
T statement

c mô ta qua s

sau:

i u ki n
F

b) D ng Cú pháp if (Boolean-expression) statement1; else statement2; s ho t ng c a c u trúc if thi u

c mô ta qua s

sau:

úng
Statement 1

sai u ki n
Statement2

Trang 27

1.2. Bi u th c u ki n Cú pháp: Variable=booleanExpression? true-result-expression: false-result-expression; 1.3. c u trúc switch a) D ng khuy t Cú pháp switch (bi u_th c) { case gt_1: l nh 1; [ break;] case gt_2: l nh 2; [ break;] … case gt_n: l nh n; [ break;] } Sau ây là s kh i mô t s ho t ng c a c u trúc r nhánh switch d ng thi u

bi u_th c ng gt_1

Yes nh 1 break;

No
bi u_th c ng gt_2

Yes nh 2 break;

No .....................................................................

bi u_th c ng gt_n

Yes nh n break;

No

Trang 28

... .Câu l nh break thoát ra kh i c u trúc switch..] … case gt_n: l nh n. byte....... . n u bi u_th c có ki u khác v i các ki u li t kê trên thì java s a ra m t thông báo l i..] case gt_2: l nh 2........... kh i mô t s ho t ng c a c u trúc switch trong tr ng h p có l nh break Trang 29 . .... [ break.........Bi u_th c ph i là m t bi u th c có ki u char.................N u bi u_th c b ng giá tr c a gt_i thì các l nh t l nh i cho n l nh n n u không có default (l nh n+1 n u có default) s c th c hi n...] default: l nh n+1. } Sau ây là s kh i mô t s ho t ng c a c u trúc switch d ng bi u_th c ng gt_1 Yes No bi u_th c ng gt_2 nh 1 Yes nh 2 No ....... short...b) D ng Cú pháp switch(bi u_th c) { case gt_1: l nh 1... [ break.. [ break... bi u_th c ng gt_n Yes nh n No nh n+1 Chú ý: . int nh ng không th là ki u long.....

String result=a%2==0 ? a là s ch II. n u giá tr c a bi u th c logic là úng thì câu l nh trong thân c a while s c th c hi n. Trong ó bi u th c 1: Bi u th c 1 là m t bi u th c logic. hay nói cách khác toán t Cú pháp : Bi u th c 1? bi u th c 2 : bi u th c 3. C u trúc l p while và do-while 1. th c thi l p i l p l i m t l nh ho c m t kh i ng trình thông qua s kh i sau: sai i u ki n l p úng L nh tr c tiên phát bi u while s tính giá tr c a bi u th c logic. n u giá tr úng nó l i ti p t c th c hi n l nh trong thân while cho n khi giá tr c a bi u th c sai. } ta có th th y c lu ng th c hi n c a ch : a là s l . Ví d : n bi u th c u ki n sau tr v giá tr “a là s ch n” n u nh giá tr c a bi n a là s ch n. T c là nó tr tr v giá tr True ho c False bi u th c 2: Giá tr tr v n u bi u th c 1 nh n giá True. Ví d : Trang 30 . Toán t u ki n c bi t vì nó g m ba thành ph n c u thành u ki n là toán t 3 ngôi. Toán t u ki n là m t lo i toán t bi u th c u ki n. L p ki m tra u ki n tr c Ta có th s d ng c u trúc while l nh trong khi u ki n úng Cú pháp: while (BooleanExpression) { statement. sau khi th c hi n xong nó tính l i giá tr c a bi u th c logic.1.4. bi u th c 3: Giá tr tr v n u bi u th c 1 nh n giá tr False Chú ý: Ki u giá tr c a bi u th c 2 và bi u th c 3 ph i t ng thích v i nhau. ng c l i tr v giá tr “a là s l ” n u nh giá tr c a bi n a là s l .

StringBuffer copyToMe = new StringBuffer(). } while (expression). Th c hi n l nh b2. } } Chú ý: + Bi u th c bên trong c p ngo c tròn ph i là m t bi u th c logic ( bi u th c tr v giá tr true ho c false ) + Bi u th c u ki n ph i n m trong c p ngo c tròn + Sau t khoá while ta ch có th t c duy nh t m t l nh. while (c! = 'g') { copyToMe. c = copyFromMe. n u không chúng ta s r i vào vòng l p vô h n. + Câu l nh trong thân c u trúc while có th không c th c hi n l n nào (do bi u th c lôgic ban u có giá tr false ) 2. s ho t ng c a c u trúc này c th hi n qua s sau: L nh úng u ki n l p sai Nhìn vào s này ta th y s ho t ng c a nó nh sau: b1.println(copyToMe). char c = copyFromMe.out.append(c).charAt(++i).charAt(i).". int i = 0. } System. L p ki m tra u ki n sau Cú pháp: do { statement(s). do v y có th th c hi n nhi u tác v sau while ta ph i bao chúng trong m t kh i l nh + Bên trong thân c a vòng l p while ta nên có l nh làm thay i giá tr c a bi u th c logic. Sau khi th c hi n l nh xong nó tính giá tr c a bi u th c logic Trang 31 .public class WhileDemo { public static void main(String[] args) { String copyFromMe = "Copy this string until you " + "encounter the letter 'g'.

append(c). System. mà n i dung cu vòng l p c n ph i l p i l p l i m t s l n bi t tr c. kh i di n gi i s ho t ng c a c u trúc for sau: c th c hi n duy Trang 32 . C u trúc for ây la c u trúc l p ph bi n nh t trong các ngôn ng l p trình.charAt(++i). nó ch nh t m t lân tr c khi vòng l p b t u . + Câu l nh trong thân c u trúc do-while c th c hi n ít nh t m t l n III. StringBuffer copyToMe = new StringBuffer().". } } Chú ý: + Bi u th c bên trong c p ngo c tròn ph i là m t bi u th c logic ( bi u th c tr v giá tr true ho c false ) + Bi u th c u ki n ph i n m trong c p ngo c tròn + Sau t khoá do ta có th t c nhi u l nh + Bên trong thân c a vòng l p do-while ta nên có l nh làm thay i giá tr c a bi u th c logic. K t thúc vòng l p và th c hi n l nh sau do-while ví d : public class DoWhileDemo { public static void main(String[] args) { String copyFromMe = "Copy this string until you " + "encounter the letter 'g'. increment) { statement } Trong ó: . N u bi u th c logic úng nó quay tr l i b1. char c = copyFromMe. cú pháp c a nó nh sau: for (initialization.charAt(i). termination.println(copyToMe). n u sai thì b4 b4. do { copyToMe. c = copyFromMe. n u không chúng ta s r i vào vòng l p vô h n.termination là i u ki n dùng k t thúc quá trình l p . int i = 0.initialization là giá tr kh i t o tr c khi vòng l p b t u.b3.increment là câu l nh dùng u khi n quá trình l p .statement là câu l nh mà ta c n ph i th c hi n l p i l p l i.out. } while (c! = 'g').

termination. i < 5.out. j = i * 2) { System.out. ta có th t toán t d y c trong ph n initialization l n ph n increment Ví d v toán t d y public class CommaOperator { public static void main(String[] args) { for(int i = 1.println( "value: " + (int)c +" character: " + c).println("i= " + i + " j= " + j).initialization termination úng statement increment Nh n xét: + Thân c a c u trúc l p for ta ch có th t c duy nh t m t l nh. nh ví d sau + Ta có th mô t c u trúc while thông qua c u trúc for nh sau for (. Ví d : ki t kê ra 128 các kí t asciii u tiên public class ListCharacters { public static void main(String[] args) { for ( char c = 0.) statement. do v y có th th c hi n nhi u tác v trong thân for ta ph i bao chúng trong kh i l nh + Thân vòng l p for có th không c th c hi n l n nào + Các ph n initialization. j = i + 10. increment có th khuy t tuy nhiên d y ph y dành cho nó v n ph i có + S l n th c hi n initialization=1 + S l n th c hi n termination = s l n l p +1 + S l n th c hi n increment = s l n l p + Ta có th t m t vài khai báo bi n trong ph n initialization. trong java ch duy nh t mà ta có th t toán t d y ó là bên trong c u trúc l p for. } } } K t qu ch y ch i= 1 j= 11 ng trình sau: Trang 33 . Boolean_Expression. } }// /:~ Toán t d y và vòng l p for Trong bài tr c ta ã nh c n toán t d y (toán t d y là m t d y các l nh n c cách nhau b i d u ph y). i++. c++) if (c! = 26 ) // ANSI Clear screen System. c < 128.

ví d sau ch ra cách s d ng break và continue bên trong c u trúc l p for và while public class BreakAndContinue { public static void main(String[] args) { for(int i = 0. if(j == 1269) break. // An "infinite loop": while(true) { i++. tuy nhiên trong java v n có m t vài v t tích c a l nh nh y goto ( khét ti ng và c coi là ngu n sinh các l i ) ó là l nh break và continue Trang 34 .// Out of loop if(i % 10! = 0) continue.// Top of loop System. } } } k t qu ch y ch 0 9 18 27 36 45 54 63 72 10 20 30 40 ng trình sau: Bên trong c u trúc l p for giá tr c a i không th t c giá tr 100 vì phát bi u break s k t thúc vòng l p khi i=74 Chú ý: Java không có l nh nh y goto.println(i).out.println(i). int j = i * 27. i++) { if(i == 74) break. L nh break và continue Bên trong thân c a các c u trúc l p ta có th u khi n lu ng th c hi n b ng cách s d ng l nh break và continue. th c hi n l n l p ti p theo.i= 2 j= 4 i= 3 j= 6 i= 4 j= 8 IV. i < 100. } int i = 0.// Next iteration System.// Out of for loop if(i % 9! = 0) continue.out. continue s ng ng th c thi ph n còn l i c a thân vòng l p và chuy n u khi n v m b t u c a vòng l p. l nh break s ch m d t quá trình l p mà không th c hi n n t phân còn l i c a c u trúc l p.

i++. if(i == 2) { prt("continue").Nhãn c a vòng l p Trong th c t các vòng l p có th l ng vào nhau. break. } if(i == 3) { prt("break"). Nhãn là m t cái tên sau ó có 2 d u ch m Ví d LabelName: Ch duy nh t mà nhãn có ý ngh a ó là ngay tr c l nh l p. m c l ng nhau không h n ch . ) { // infinite loop inner:// Can't have statements here for(. th thì làm cách nào ta có th cho nó thoát ra kh i m t vòng l p tu ý nào ó. i < 10. câu tr l i là nó thoát ra kh i vòng l p mà l nh break c t. ta không th có b t c m t l nh nào n m gi a nhãn và l nh l p. i++. true. câu tr l i là java ã h tr cho ta m t công c ó là nhãn c a vòng l p. } } } } // Can't break or continue // to labels here Trang 35 . } for(int k = 0. break outer. continue outer. th thì câu h i t ra là l nh break s thoát ra kh i vòng l p nào. cách s d ng nhãn c a vòng l p thông qua ví d sau: public class LabeledFor { public static void (String[] args) { int i = 0. ta mô t s ho t ng. } if(i == 8) { prt("break outer"). i++) { prt("i = " + i). k++) { if(k == 3) { prt("continue inner"). k < 5. continue inner. // Otherwise i never // gets incremented. } if(i == 7) { prt("continue outer"). // Otherwise i never // gets incremented. outer: // Can't have statements here for(. continue.

println(s).} static void prt(String s) { System. } } k t qu ch y c i=0 continue inner i=1 continue inner i=2 continue i=3 break i=4 continue inner i=5 continue inner i=6 continue inner i=7 continue outer i=8 break outer ng trình nh sau: Trang 36 .out.

Ch ng 2: L P TRÌNH H NG IT NG L p là khái ni m tr ng tâm c a l p trình h ng i t ng. java là ngôn ng l p trình h ng i t ng. do v y có th quan ni m l p là t p h p các i t ng cùng ki u. m t ch ng trình java g m m t t p các i t ng. l p là s m r ng khái ni m RECORD trong pascal. hay struct c a C. ngoài các thành ph n d li u. Trang 37 . vì v y ng i ta còn g i l p là ki u d li u i t ng. ta có th xem l p là m t ki u d li u. Sau khi nh ngh a l p ta có th t o ra các i t ng ( b ng cách khai báo bi n ) c a l p v a t o. l p còn có các hàm ( ph ng th c. hành vi ). Các i t ng c mô t qua khái ni m l p. các i t ng này ph i h p v i nhau t o thành m t ng d ng hoàn ch nh.

2. M t l p c nh ngh a theo m u sau: [pbulic][final][abstract] class <tên_l p>{ // khai báo các thu c tính // khai báo các ph ng th c } sau âu là ví d n gi n nh ngh a l p ng n x p: T ng quát: m t l p c khai báo d ng sau: [public][<abstract><final>][ class <Tên l p> [extends <Tên l p cha>] [implements <Tên giao di n>] { <Các thành ph n c a l p.BÀI 1. B i m c nh m t l p ch có th s d ng b i m t l p khác trong cùng m t gói v i l p ó. NH NGH A L P I.1. do v y ta không th t o ra m t th hi n c a l p này 3. n u mu n gói khác có th s d ng l p này thì l p này ph i c khai báo là l p public. final là b t cho java bi t ây là m t l p không th k th a Trang 38 . Khai báo l p 1. abstract là b t cho java bi t ây là m t l p tr u t ng. bao g m: thu c tính và ph ng th c> } Trong ó: 1.

– N u m t thành ph n c a l p khi khai báo mà không s d ng m t trong 3 b t protected.. – Các thành ph n protected ng t nh các thành ph n private. e) Trong m t t p ch ng trình (hay còn g i là m t n v biên d ch) ch có m t l p c khai báo là public. – Ccác thành ph n private ch có th s d ng c bên trong l p. protected gi o h n s truy c p n thành ph n ó. c) Các thu c tính nên m c truy c p private m b o tính d u kín và lúc ó bên ngoài ph m vi c a l p có th truy c p c n thành ph n private này ta ph i t o ra các ph ng th c ph ng th c get và set. và tên l p public này ph i trùng v i tên c a t p k c ch hoa. Khai báo thu c tính Tr l i l p Stack public class Stack { private Vector items. nh ng có th truy c p c t b t c l p con nào k th a t nó. c nh ngh a nh sau: 4.class là t khoá cho ch ng trình bi t ta ang khai báo m t l p. chúng có th truy c p t b t c âu. // a method with same name as a member variable public Vector items() { . implements là t khoá cho java bi t l p này s tri n khai giao di n Interfaces. ta không th truy c p vào các thành ph n private t bên ngoài l p – Các thành ph n public có th truy c p c c bên trong l p l n bên ngoài l p. private. } } Trong l p Stack trên ta có m t thu c tính private Vector items. nó có th l i là m t bi n có ki u là chính l p ó b) Khi khai báo các thành ph n c a l p (thu c tính và ph ng th c) có th dùng m t trong các t khoá private. l p này có tên là NameOfClass 5. public thì s truy c p là b n bè. public. t c là thành ph n này có th truy c p c t b t c l p nào trong cùng gói v i l p ó.2. Vi c khai báo nh trên c g i là khai báo thu c tính hay còn g i là bi n thành viên l p T ng quát vi c khai báo m t thu c tính c vi t theo m u sau: Trong ó: Trang 39 . ch th ng 1. extends là t khoá cho java bi t l p này này c k th a t l p super 6. Chú ý: a) Thu c tính c a l p là m t bi n có ki u d li u b t k .. ây là m t d ng t ng t nh k th a b i c a java. d) Các ph ng th c th ng khai báo là public.

type là m t ki u d li u nào ó Ø name là tên c a thu c tính Chú ý: Ta ph i phân bi t c vi c khai báo nh th nào là khai báo thu c tính. khai báo nh ng ch khác s cho ta bi n.Ph n khai báo g m có nh ng ph n sau( chi ti t c a khai báo c mô t sau): .Ph n thân c a ph ng th c g m các l nh này c vi t b ng các l nh c a java. m t ph ng th c c ng g m có 2 ph n: ph n khai báo và ph n thân . Ø . II. Chi ti t v khai báo m t ph 1. nó c nh ngh a nh sau: C ng gi ng nh m t l p. 1. các hành vi ng th c c khai báo nh sau: //mô t m c truy c p n ph ng th c // ây là ph ng th c l p // ây là ph ng th c không có cài t //ph ng th c này không th ghi è //ph ng th c này c vi t trong m t ngôn ng khác // ây là ph ng th c ng b //giá tr tr v c a ph ng th c //tên c a ph ng th c //khai báo các ngo i l có th c nem ra t ph ng th c Trang 40 .transient và volatile ch a c dùng Ø . Khai báo ph ng th c Trong l p Stack trên ta có ph ng th c push dùng y m t i t ng vào nh ng n x p. T ng quát m t ph ng th c accessLevel static abstract final native synchronized returnType MethodName throws exception Trong ó: mô t hành vi c a ph ng th c.3.Ø accessLevel có th là m t trong các t public. private. ý ngh a c a các b t này c mô t ph n trên Ø .static là t khoá báo r ng ây là m t thu c tính l p. nó là m t thu c tính s d ng chung cho c l p. protected ho c có th b tr ng. khai báo th nào là khai báo bi n thông th ng? Câu tr l i là t t c các khai báo bên trong thân c a m t l p và bên ngoài t t c các ph ng th c và hàm t o thì ó là khai báo thu c tính. nó không là c a riêng m t i t ng nào.

các tham s c a m t ph ng th c c khai báo trong l i khai báo ph ng th c. Trang 41 . } 1.static là t khoá báo cho java bi t ây là m t ph ng th c l p . protected ho c b tr ng.returnType là m t ki u d li u.throws là t khoá dùng khai báo các ngo i l có th c ném ra t ph ng th c. tên c a ph ng th c c t theo quy t c t tên c a java . khi ph ng th c không tr v d li u thì ph i dùng t khoá void . ây là ki u tr v c a ph ng th c. Truy n tham s cho ph ng th c Khi ta vi t các ph ng th c. nó r t h u ích khi nhi u ph ng th c cùng truy c p ng th i vào tài nguyên mi n g ng . t ki u d li u nguyên thu cho n tham chi u i t ng. java b t bu c b n ph i khai báo giá tr tr v cho ph ng th c. bên trong thân c a ph ng th c ta ph i s d ng phát bi u return value. nó không có cài t.synchronized ây là m t ph ng th c ng b . . m nh return ôi khi còn c dùng k t thúc m t ph ng th c.native ây là t khoá báo cho java bi t ph ng th c này c vi t b ng m t ngôn ng l p trình nào ó không ph i là java ( th ng c vi t b ng C/C++) .abstract t khoá cho bi t ây là m t l p tr u t ng. double b){ return (a + b). tên nay c s d ng bên trong thân c a ph ng th c tham chi u n tham s c truy n vào. private. Nh n giá tr tr v t ph ng th c Ta khai báo ki u giá tr tr v t lúc ta khai báo ph ng th c. ý ngh a c a các b t này c mô t trong ph n khai báo l p .MethodName là tên c a ph ng th c. chúng ph i c khai báo chi ti t có bao nhiêu tham s . m i tham s c n ph i cung c p cho chúng m t cái tên và ki u d li u c a chúng. n u hàm c khai báo ki u void thì ta ch s d ng phát bi u return.accessLevel có th là m t trong các t khoá public. m t s ph ng th c yêu c u ph i có m t s tham s . Ví d : ta có m t ph ng th c dùng tính t ng c a hai s . 2. theo sau t khoá này là danh sách các ngo i l có th c ph ng th c này ném ra Chú ý: 1) N u trong l p có ít nh t m t ph ng th c tr u t ng thì l p ó ph i là l p tr u ng 2) không có thu c tính tr u t ng 3) ta không th t o i t ng c a l p tr u t ng 4) khác v i ngôn ng C/C++. 3. Tên tham s Khi b n khai báo m t tham s truy n vào ph ng th c thì b n ph i cung c p cho nó m t cái tên. nh n v k t qu . ph ng th c này c khai báo nh sau: public double tongHaiSo(double a.final ây là t khoá báo cho java bi t ây là ph ng th c không th ghi è t l p con . n u ph ng th c không tr v d li u thi dùng t khoá void (trong C/C++ khi ta không khai báo giá tr tr v thì m c nh giá tr tr v là int) 2.. Ki u tham s Trong java ta có th truy n vào ph ng th c m t tham s có ki u b t k .

System. } Object pop() { if (topelement == STACK_EMPTY) return null. boolean isEmpty() { if (topelement == STACK_EMPTY) return true. khi ó tên c a tham s s “che” i tên c a ph ng th c.out.*. ngh a là ph ng th c không th thay i giá tr c a các tham s truy n vào.out. } } Ví d : Xây d ng l p man import java. } } Ta s nh n c k t qu ra nh sau: Gia tri c a t truoc khi g i ham = 10 Gia tri c a t bên trong ham sau khi tang len 1 la 11 Gia tri c a t truoc khi g i ham = 10 4.println("Gia tri c a t bi?n trong ham sau khi tang len 1 la " + t). System..by – value ).println("Gia tri c a t truoc khi g i ham = " + t). 3. import java. public class Man ng th c pop c in m và Trang 42 . Object[] stackelements. Ta ki m tra u này qua ví d sau: public class TestPassByValue { public static void test(int t) { t++. System. thì b n sao giá tr c a tham s th c s s c chuy n n ph ng th c.out. test(t).*. import java.io.*. thì khi nh c n cái tên ó có ngh a là nh c n tham s ..Chú ý: Tên c a tham s có th trùng v i tên c a thu c tính. Truy n tham s theo tr Khi g i m t ph ng th c mà tham s c a ph ng th c có ki u nguyên thu .println("Gia tri c a t tru?c khi g i ham = " + t). } public static void main(String[] args) { int t = 10. ây là c tính truy n theo tr ( pass. b i v y bên trong thân c a ph ng th c mà có tham s có tên trùng v i tên c a thu c tính. else { return stackelements[topelement--].lang. Thân c a ph ng th c Trong ví d sau thân c a ph ng th c isEmpty và ph có m u class Stack { static final int STACK_EMPTY = -1. else return false. . int topelement = STACK_EMPTY.util.

println("Ho va ten:"+ten).get(Calendar.int birthday){ ten=name. } public void HienThiNgay() { Calendar now=Calendar. System. T khoá super Khi m t l p c k th a t l p cha trong c l p cha và l p con u có m t ph ng th c trùng tên nhau. System.get(Calendar. } } Trang 43 .println("Ngay hien tai=" +now. System.{protected String ten.println("Thang hien tai=" +now. lúc ó ch các thành viên c a i t ng ó ta dùng t khoá this. th thì làm th nào có th g i ph ng th c trùng tên ó c a l p cha.hue = hue.namsinh). int namsinh. } IV. System.brightness = brightness. System.MONTH)). T khoá this Thông th ng bên trong thân c a m t ph ng th c ta có th tham chi u n các thu c tính c a i t ng ó.out.get(Calendar. return (now.getInstance().HOUR)).out. HSBColor (int hue.YEAR) .out.println("Nam hien tai=" +now. brightness.namsinh=birthday.saturation = saturation. System. t khoá this dùng ch i t ng này. saturation. public Man(String name. java cung c p cho ta t khoá super dùng ch i t ng c a l p cha Ta xét ví d sau class ASillyClass { boolean aVariable. int brightness) { this. tuy nhiên trong m t s tình hu ng c bi t nh tên c a tham s trùng v i tên c a thu c tính. this.SECOND)).get(Calendar. this. } public int tuoi() {Calendar now=Calendar. void aMethod() { aVariable = true.out.YEAR)).get(Calendar. Ví d sau ch ra cho ta th y trong tình hu ng này b t bu c ph i dùng t khoá this vì tên tham s c a ph ng th c t o d ng l i trùng v i tên c a thu c tính class HSBColor { int hue. int saturation. } public void hienthi() {System.out.DATE)).out.println("Gio hien tai=" +now.get(Calendar.getInstance().out.println("Ho va ten:"+tuoi()).println("Phut hien tai=" +now. } III.

V. còn vùng nh dành cho các thu c tính c a i t ng này thì c c p phát trên heap. ta còn th y c hai l p này cùng có m t thu c tính tên aVariable có th truy c p vào các thành viên c a l p cha ta ph i dùng t khoá super.class ASillierClass extends ASillyClass { boolean aVariable. vi c khai báo m t bi n. <Tên_L p> <tên_mang>[kích th c m ng]. i u khi n vi c truy c p n các thành viên c a m t l p Khi xây d ng m t l p ta có th h n ch s truy c p n các thành viên c a l p.out. m ng các i t ng.4). Chú ý: Ta không th dùng nhi u t khoá này ch l p ông. l p c … ch ng h n vi t nh sau là sai: super.println(aVariable). nên ta có th t o ra các bi n. super. S d ng l p Sau khi khao m t m t l p ta có th xem l p nh là m t ki u d li u. m ng các i t ng c ng ng t nh khai báo m t bi n.super. m ng c a ki u d li u nguyên thu Vi c khai báo m t bi n. ta không th truy c p các thành viên private t bên ngoài l p này. Ví d : class Alpha Trang 44 .aMethod(). vùng nh dành cho con tr này thì c c p phát trên stack. System. VI. } } trong ví d trên ta th y trong l p cha có ph ng th c tên là aMethod trong l p con c ng có m t ph ng th c cùng tên. <Tên_L p>[kích th c m ng] <tên_mang>.add(1. t m t i t ng khác. 1. Các thành ph n private Các thành viên private ch có th s d ng bên trong l p. Ta tóm t t qua b ng sau: T khoá Truy c p trong chính l p ó X private X protected X public X default Truy c p trong l p con cùng gói X X X Truy c p trong l p con khác gói X X Truy c p trong Truy c p trong l p khác cùng gói l p khác khác gói X X X X - Trong b ng trên thì X th hi n cho s truy c p h p l còn – th hi n không th truy c p vào thành ph n này. System. V b n ch t m i i t ng trong java là m t con tr t i m t vùng nh .out. vùng nh này chính là vùng nh dùng l u tr các thu c tính.println(super. m ng c khai báo theo m u sau: <Tên_L p> < tên_bi n>.aVariable). void aMethod() { aVariable = false.

// không h p l } } 2. ta se xem ví d sau: package Greek.println("publicMethod"). void packageMethod() { System. private.iamprivate = 10.out.out. // h p l } } 4. class Alpha { int iampackage. private void privateMethod() { System.privateMethod().} } package Greek. Ví d package Greek. } } class Beta { void accessMethod() { Alpha a = new Alpha().iampublic = 10. public class Alpha { public int iampublic.publicMethod(). class Beta { void accessMethod() { Alpha a = new Alpha(). a.println("packageMethod"). // h p l a.} } package Roman.out. a. Các thành ph n protected Các thành viên protected s c th o lu n trong ch ng sau 3. protected thì java m c nh thành viên ó có m c truy c p gói. class Beta { Trang 45 . public void publicMethod() { System.*. Các thành ph n có m c truy xu t gói Khi ta khai báo các thành viên mà không s d ng m t trong các t public.println("privateMethod"). Các thành ph n public Các thành viên public có th truy c p t b t c âu.{ private int iamprivate.// không h p l a. import Greek.

// legal a.iampackage = 10.packageMethod().a.void accessMethod() { Alpha a = new Alpha().// legal} } Trang 46 .

i++) new Rock(). i++) new Rock2(i). Thông th ng ng i ta th ng s d ng hàm t o kh i gán giá tr cho các thu c tính c a i t ng và có th th c hi n m t s công vi c c n thi t khác nh m chu n b cho i t ng m i. 2. hàm t o này th c ch t không làm gì c . n u trong l p ã có ít nh t m t hàm t o thì hàm t o m c nh s không c t o ra.BÀI 2. u này th ng x y ra khi chúng ta không xây d ng hàm Trang 47 . } } public class SimpleConstructor2 { public static void main(String[] args) { for(int i = 0.// call constructor } } Ví d 2: s d ng hàm t o có i class Rock2 { Rock2(int i) { System.// g i hàm t o có i } }// /:~ 3. i < 10. Công d ng Ph ng th c t o d ng là m t ph ng th c c a l p ( nh ng khá c bi t ) th ng dùng kh i t o m t i t ng m i. khi ta t o ra m t i ng thì s có m t hàm t o nào ó c g i.out. n u trình biên d ch không tìm th y hàm t o ng ng nó s thông báo l i.println("Creating Rock"). i < 10.println( "Creating Rock number " + i).out. Hàm t o m c nh Khi xây d ng m t l p mà không xây d ng hàm t o th thì java s cung c p cho ta m t hàm t o không i m c nh. Ph ng th c t o d ng (constructor) 1. } } public class SimpleConstructor { public static void main(String[] args) { for(int i = 0. Cách vi t hàm t o a) c m c a ph ng th c t o d ng Ø hàm t o có tên trùng v i tên c a l p Ø hàm t o không bao gi tr v k t qu Ø nó c java g i t ng khi m t i t ng c a l p c t o ra Ø hàm t o có th có i s nh các ph ng th c thông th ng khác Ø trong m t l p có th có nhi u hàm t o b) Ví d Ví d 1: s d ng hàm t o in ra màn hình xâu “Creating Rock” class Rock { Rock() {// This is the constructor System. KH I U VÀ D N D P I.

// g i n hàm t o không i c a chính l p này } public static void main(String[] args) { TestPassByValue thu=new TestPassByValue(10). } Trang 48 . G i hàm t o t hàm t o Khi b n vi t nhi u hàm t o cho l p. có ôi lúc b n mu n g i m t hàm t o này t bên trong m t hàm t o khác tránh ph i vi t l p mã.out.println("Day la ham tao khong doi"). Ví d : public class Test { public Test () { System. // l i vì l p này không có hàm t o không i TestPassByValue thu1 = new TestPassByValue("Hello World"). } public TestPassByValue(int i) { System.println(s). System.out. } public Test ( int i) { this(). } public static void main(String[] args) { TestPassByValue thu = new TestPassByValue(). } } Chú ý: a) bên trong c u t ta ch có th g i c t i a m t c u t . // không v n gì } } 4.// không th g i hai hàm t o tr lên bên trong m t hàm t o this(10).println("Day la ham tao doi so nguyen").out. Cú pháp this(danh sách i s ).out.t o không i nh ng khi t o d ng ra trong ví d sau: it ng ta l i không truy n vào tham s .println("hàm t o không i"). nh c ch public class TestPassByValue { public TestPassByValue(String s) { System.println("Day la ham tao doi so xau"). u này có ngh a là ta không th g i c t 2 c u t tr lên bên trong m t c u t khác nh c ch ra trong ví d sau: public class TestPassByValue { public TestPassByValue() { System. } public TestPassByValue(String s) { this(). có th g i n hàm t o ta s d ng t khoá this.out.

Kh i kh i u vô danh và kh i kh i u t nh 1. các kh i vô danh c g i tr c c hàm t o.println ( "khoi khoi dau thu 3 "). }// k t thúc kh i vô danh //b t u kh i vô danh { System. }//k t thúc kh i vô danh // b t u kh i vô danh { Trang 49 . khi ó kh i l nh này c g i là kh i vô danh. thông th ng ta hay s d ng kh i vô danh kh i u các thu c tính c a l p ho c c s d ng kh i t o cho các th c tính c a m t l p vô danh(vì l p vô danh không có tên do v y ta không th vi t hàm t o cho l p này. } // b t u kh i vô danh { System.println ( "Day la ham tao" ). ngh a là kh i này không thu c b t c ph ng th c nào k c hàm t o.println("Day la ham tao doi so xau").public static void main(String[] args) { TestPassByValue thu = new TestPassByValue(). trong tr ng h p này kh i vô danh là gi i pháp duy nh t ) Ví d : ví d này ta có 3 kh i vô danh. } public Test (String s) { System. column 9 II. Kh i vô danh Trong java ta có th t m t kh i l nh không thu c m t ph ng th c nào.println("Day la ham tao khong doi").println ( "khoi khoi dau thu 1 "). nên ví d sau s b báo l i public class Test{ public Test () { System.java": call to this must be first statement in constructor at line 7.out.out. this().// TestPassByValue thu1 = new TestPassByValue("Hello World").out. } } u n u cho d ch ví d trên trình biên d ch s phàn nàn "Test.out. kh i vô danh này c java g i th c thi khi m t i t ng ct o ra.out. khi ch y java cho th c thi các kh i vô danh này theo th t t trên xu ng d i public class Untitled1{ // hàm t o public Untitled1 (){ System.// } } b) khi g i m t hàm t o bên trong m t hàm t o khác thì l i g i hàm t o ph i là l nh tiên trong thân ph ng th c.// g i n c u t ph i là l nh u tiên } public static void main(String[] args) { Test thu = new Test ( Hello World ).

out. b n th y c s khác nhau gi a kh i kh i u t nh và kh i vô danh public class Untitled1 { public Untitled1 () { System. sau ây là m t ví d có 1 kh i kh i u t nh và m t kh i vô danh.println ( " ây là kh i kh i u t nh").out. } static {// ây là kh i kh i u t nh System. tr c kh i l nh này ta t t khoá static. }//k t thúc kh i vô danh public static void main ( String[] args ) { Untitled1 dt1 = new Untitled1 ().println ( " ây là kh i vô danh "). k c hàm t o. } {// ây là kh i vô danh System.out.println ( " ây là hàm t o" ). thông t ng ta s d ng kh i kh i u t nh kh i u các thu c tính t nh ( static ). kh i này ch c g i 1 l n khi i t ng u tiên c a l p này c t o ra. t khoá này báo cho java bi t ây là kh i kh i u t nh./ / t o ti p th hi n th 2 c a l p } } c khi cho ch y ch ng trình ta s c k t qu ra nh sau: ây là kh i kh i u t nh Kh i này ch c g i 1 l n khi th hi n u tiên c a l p Trang 50 c t o ra .System.println("Kh i này ch c g i 1 l n khi th hi n u tiên c a l p o ra").out. Kh i kh i u t nh Kh i kh i u t nh là m t kh i l nh bên ngoài t t c các ph ng th c. System.println ( "khoi khoi dau thu 2 "). } } khi ch y ch ng trình s cho k t qu sau: khoi khoi dau thu 3 khoi khoi dau thu 1 khoi khoi dau thu 2 Day la ham tao khoi khoi dau thu 3 khoi khoi dau thu 1 khoi khoi dau thu 2 Day la ham tao 2.out. Untitled1 dt2 = new Untitled1 (). } public static void main ( String[] args ) { Untitled1 dt1 = new Untitled1 (). kh i kh i u t nh này c ng c java g i t ng tr c b t c hàm t o nào./ / t o ra th hi n th nh t c a l p Untitled1 dt2 = new Untitled1 ().

it hu nh làm Trang 51 . Ph ng th c finalize Java không có ph ng th c h y b . tuy nhiên nó không ph i là ph ng th c h y b . D n d p: k t thúc và thu rác 1. Trong java ta không c n quan tâm n u ó. qu th t âu là m t u t i t . r i nó t ng thu h i vùng nh dành cho i t ng ó. hàm này c g i là hu t hay còn g i là hàm hu . C ch gom rác c a java Ng i l p trình C++ th ng s d ng toán t new c p phát ng m t i t ng. S d nó không ph i là ph ng th c h y b vì khi i t ng c h y b thì ph ng th c này ch a ch c ã c g i n.ây là kh i vô danh ây là hàm t o ây là kh i vô danh ây là hàm t o Nhìn vào k t qu ra ta th y kh i kh i u t nh ch c java g i th c hi n 1 l n khi i ng u tiên c a l p này c t o. ph i vi t ra hàm hu riêng vi c ó. nh ng l i th ng quên g i toán t delete gi i phóng vùng nh này khi không còn dùng n n a. còn kh i vô danh c g i m i khi m t i t ng m i c t o ra III. Ph ng th c finalize t ng t nh ph ng th c h y b c a C++. do v y ng i l p trình C++. tuy nhiên java l i không có khái ni m hàm hu hay m t cái gì ó t ng t . Ph ng th c này c g i n ch khi b thu rác c a Java c kh i ng và lúc ó i t ng không còn c s d ng n a. nó thông minh bi t i t ng t ng nào không dùng n a. thông th ng hàm hàm m c nh là là d n d p. u này làm rò r b nh ôi khi d n n ch ng trình ph i k t thúc m t cách b t th ng. 2. s có m t hàm cg ng. Do v y ph ng th c finalize có th không c g i n. java có m t c ch thu rác t ng. Trong ngôn ng C++ khi m t i t ng b phá hu . tuy nhiên trong m t s tr ng h p thì hàm hu m c l i không th áp ng c.

c 2 cách truy xu t trên u có tác d ng nh nhau + kh i gán giá tr cho thu c tính t nh thành ph n t nh c kh i gán b ng m t trong 2 cách sau: Ø S d ng kh i kh i u t nh (xem l i bài tr c ) Ø S d ng kh i u tr c ti p khi khai báo nh ví d trên Chú ý: Ta không th s d ng hàm t o kh i u các thu c tính t nh. + Ta không th s d ng t khoá this bên trong ph ng th c t nh Trang 52 . II.// ây là thu c tính t nh int j = 10. t c là bên trong ph ng th c t nh ta ch có th truy c p n các thành viên t nh mà thôi. CÁC THÀNH PH N T NH I. nó không là c a riêng m t i t ng nào c .tên_thu c_tính_t nh. Thu c tính t nh Thu c tính c khai báo v i t khoá static g i là thu c tính t nh Ví d : class Static{ static int i = 10.out. + Vì ph ng th c t nh là c l p v i i t ng do v y bên trong ph ng th c t nh ta không th truy c p các thành viên không t nh c a l p ó.// ây là thu c tính th ng … } + Các thu c tính t nh c c p phát m t vùng b nh c nh. b i vì hàm t o không ph i là ph ng th c t nh.println ( i ).// ây là thu c tính t nh // ph ng th c t nh static void println (){ System. trong java b nh dành cho các thu c tính t nh ch c c p phát khi l n u tiên ta truy c p n nó. nó không l thu c vào m t i t ng c th nào + L i g i ph ng th c t nh xu t phát t : tên c a l p: tên_l p. tên_ph ng_th c_t nh(tham s ). + truy xu t n thu c tính t nh ta có th dùng m t trong 2 cách sau: tên_l p.BÀI 3. tên_ i_t ng.tên_ph ng_th c_t nh(tham s ). + Thành ph n t nh là chung c a c l p. tên c a i t ng: tên_ i_t ng. } } c g i là ph ng th c t nh + Ph ng th c t nh là chung cho c l p.tên_thu c_tính_t nh. Ph ng th c t nh M t ph ng th c c khai báo là static Ví d : class Static{ static int i.

11). java d a vào s khác nhau v s l ng i c ng nh ki u d li u c a các i này phân bi t các ph ng th c trùng tên ó. print(99. "Int first"). nên ta ph i cho java bi t c n ph i g i ph ng th c nào th c hi n. có th ây là m t khuy t m. hi n ng các ph ng th c trong m t l p có tên gi ng nhau c g i là b i t i ph ng th c.println( "String: " + s + ". Yêu c u c a các ph ng th c b i t i Do s d ng chung m t cái tên cho nhi u ph ng th c. String s) { System.BÀI 4. Ví d : public class OverloadingOrder { static void print(String s. } static void print(int i. int: " + i). N P CH NG PH NG TH C I.out. } }// /:~ Chú ý: 1) N u n u java không tìm th y m t hàm b i t i thích h p thì nó s a ra m t thông báo l i 2) Ta không th s d ng giá tr tr v c a hàm phân bi t s khác nhau gi a 2 ph ng th c b i t i 3) Không nên quá l m d ng các ph ng th c b i t i vì trình biên d ch ph i m t th i gian phán oán tìm ra hàm thích h p. int i) { System. Khái ni m v ph ng th c b i t i Java cho phép ta xây d ng nhi u ph ng th c trùng tên nhau. Trang 53 . u này ôi khi còn d n n sai sót 4) Khi g i các hàm n p ch ng ta nên có l nh chuy n ki u t ng minh trình biên d ch tìm ra hàm phù h p m t cách nhanh nh t 5) Trong java không th nh ngh a ch ng toán t nh trong ngôn ng C++. vì nó quá ph c t p. String: " + s). } public static void main(String[] args) { print("String first". nh ng nh ng ng i thi t k java cho r ng u này là không c n thi t.println( "int: " + i + ". II.out. trong cùng m t l p.

n u b n không làm i u này thì java s làm giúp ban. thì nó ch a bên trong nó m t s v t con c a l p c s . L p c s và l p d n xu t -M tl p c xây d ng thông qua k th a t m t l p khác g i là l p d n xu t (hay còn g i là l p con. ngh a là java luôn t ng thêm l i g i c u t c a l p c s vào c u t c a l p d n xu t n u nh ta quên làm i u ó. Cách xây d ng l p d n xu t nói l p b là d n xu t c a l p a ta dùng t khoá extends. Khi ta t o ra m t i t ng c a l p suy d n. nó còn c k th a t t c các thành ph n c a l p cha II. package c al pc s IV. cú pháp nh sau: class b extends a { // ph n thân c a l p b } III. Kh i u l p c s L p d n xu t k th a m i thành ph n c a l p c . Th a k các thu c tính Th c tính c a l p c s c th a k trong l p d n xu t.BÀI 5.println ( "Ham tao c a lop dan xuat" ).println ( "Ham tao c a lop co so" ). l p dùng xây d ng l p d n xu t c g i là l p c s ( hay còn g i là l p cha. K TH A (INHERITANCE) I. i u này d n ta n m t hình dung. có th g i c u t c a l p c s ta s d ng t khoá super Ví d 1: ví d này không g i c u t c a l p c s m t cách t ng minh class B { public B () { System.} } public class A extends B { public A () {// không g i hàm t o c a l p c s t ng minh System. k th a không ch là sao chép giao di n c a l p c a l p c s . Th a k ph ng th c L p d n xu t k th a t t c các ph Ø Ph ng th c t o d ng Ø Ph ng th c finalize ng th c c a l p c s tr : V. th c hi n u ó tr ng java ta làm nh sau: Th c hi n kh i u cho l p c s b ng cách g i c u t c a l p c s bên trong c u t c a l p d n xu t. ho c l p t tiên ) Ø M t l p d n xu t ngoài các thành ph n c a riêng nó. nh ng th c t không ph i v y. th thì l p c s ph i c b o m kh i u úng. s v t con này nh th ta ã t o ra m t s v t t ng minh c a l p c s .out. nh v y t p thu c tính c a l p d n xu t s g m: các thu c tính khai báo trong l p d n xu t và các thu c tính c a l p c s .out. tuy nhiên trong l p d n xu t ta không th truy c p vào các thành ph n private. l p h u du ). là l p d n xu t có cùng giao di n v i l p c s và có th có các thành ph n m i b sung thêm. } Trang 54 .

out. } } khi ch y ch ng trình ta th y k t qu gi ng h t nh ví d trên Chú ý 1: N u g i t ng minh c u t c a l p c s .out. column 15 Chú ý 2: ta ch có th g i n m t hàm t o c a l p c s bên trong hàm t o c a l p d n xu t.} public B ( int i ) {System.} Trang 55 .public static void main ( String arg[] ) { A thu = new A (). } } u tiên. thì l i g i này ph i là l nh n u ví d trên i thành class B { public B () {System.out.} } public class A extends B {public A () {// L i g i c u t c a l p c s không ph i là l nh System.out.println ("Ham tao c a lop dan xuat"). super ().println ( "Ham tao c a lop co so" ). } } public class A extends B { public A () { super().println ( "Ham tao c a lop co so" ). } public static void main ( String arg[] ) { A thu = new A (). } } K t qu ch y ch ng trình nh sau: Ham tao c a lop co so Ham tao c a lop dan xuat Ví d 2: ví d này s d ng t khoá super g i c u t c a l p c s m t cách t ng minh class B { public B () { System.println ( "Ham tao c a lop dan xuat" ).println ( "Ham tao c a lop co so" ). u tiên N u biên d ch n mã này ta s nhân c m t thông báo l i nh sau: "A.println ( "Ham tao c a lop co so" ). } public static void main ( String arg[] ) { A thu = new A ().out. ví d ch ra sau ã b báo l i class B { public B (){System.out.java": call to super must be first statement in constructor at line 15.// g i t o c a l p c s m t cách t ng minh System.

out. nh ng nói chung nó mu n nói “cái này không th thay i c”. public static void main ( String arg[] ) Trang 56 .println ( "Ham tao c a lop dan xuat" )./ / không th g i nhi u h n 1 hàm t o c a l p c s System. Chú ý: N u m t ph ng th c c a l p c s b b i t i ( Overload ). super ( 10 ). Thành ph n protected Trong m t vài bài tr c ta ã làm quen v i các thành ph n private. sau khi ã h c v k th a thì t khoá protected cu i cùng ã có ý ngh a. T khoá protected báo cho java bi t ây là thành ph n riêng t i v i bên ngoài nh ng l i s n sàng v i các con cháu VII. n u có hi n t ng ghi è thì ph ng th c b ghi è c a l p c s s b n i.overridden MethodName(). public. } public static void main ( String arg[] ) { A thu = new A (). Tr t t d n d p M c dù java không có khái ni m hu t nh c a C++. T khoá final T khoá final trong java có nhi u ngh a khác nhau. cú pháp sau: super. u này có ngh a là trong cây ph h thì các c u t s c g i theo tr t t t g c xu ng d n n lá 2. chú ý Override khác Overload. } } 1. Thu c tính final Trong java cách duy nh t t o ra m t h ng là khai báo thu c tính là final Ví d : public class A { // nh ngh a h ng tên MAX_VALUE giá tr 100 static final int MAX_VALUE = 100. VI. ngh a c a nó tu thu c vào ng c nh c th . G i ph ng th c b ghi è c a l p c s Bên trong l p d n xu t.} public class A extends B { public A () {super (). 1. Ghi è ph ng th c ( Override ) Hi n t ng trong l p c s và l p d n xu t có hai ph ng th c gi ng h t nhau ( c tên l n b tham s ) g i là ghi è ph ng th c ( Override ). Tr t t kh i u Tr t t kh i u trong java c th c hi n theo nguyên t c sau: java s g i c u t c a l p c s tr c sau ó m i n c u t c a l p suy d n. VI. có th g i ph ng th c b ghi è c a l p c s ta dùng t khoá super truy c p n l p cha. tuy nhiên b thu rác c a java v n ho t ng theo nguyên t c làm vi c c a c u t C++. thì nó không th b ghi è ( Override ) l p d n xu t. t c là tr t t thu rác thì ng c l i so v i tr t t kh i u.

Xây d ng l p c s package JavaContent.//không cho phép thay System. import java. column 9 3.out. b t c c g ng nào thay i giá tr c a i u gây ra l i lúc d ch Ví d sau b báo l i lúc d ch vì nó c g ng thay i giá tr c a i final public class A { static public void thu ( final int i ) { i=i+1.{ } } A thu = new A (). System.util. ôi khi ta không mu n ph ng th c c a ta b ghi è l p d n xu t vì lý do gì ó. thu ( i ).println("MAX_VALUE= " +thu. Ph ng th c final M t ph ng th c bình th ng có th b ghi è l p d n xu t. tuy nhiên ta th y r ng các ph ng th c private s t ng là final vì chúng không th th y c trong l p d n xu t lên chúng không th b ghi è. ngh a là bên trong thân c a ph ng pháp này.*. } } 2. Chú ý: Do m t l p là final (t c không th k th a )do v y ta không th nào ghi è các ph ng th c c a l p này. i giá tr c a tham s final ch ng trình này s b báo l i: "A. thì b n hãy dùng t khoá final ng n c n b t c ai mu n k th a t l p này. Chú ý: 1) Khi ã khai báo m t thu c tính là final thì thu c tính này la h ng.println ( i ).. L p final N u b n không mu n ng i khác k th a t l p c a b n. class HocSinh { //Khai bao du lieu thanh phan protected Trang 57 .out. } public static void main ( String arg[] ) { int i = 100.java": variable i might already have been assigned to at line 5.MAX_VALUE). do v y ng c g ng cho m t ph ng th c c a l p final là final Ví d v tính k th a 1. nên cho dù b n có cho m t ph ng th c private là final thì b n c ng ch th y m t hi u ng nào 4. m c ích ch y u c a các ph ng th c final là tránh ghi è. do v y ta không th thay i giá tr c a nó 2) Khi khai báo m t thu c tính là final thì ta ph i cung c p giá tr ban u cho nó 3) N u m t thu c tính v a là final v a là static thì nó ch có m t vùng nh chung duy nh t cho c l p i s final Java cho phép ta t o ra các i final b ng vi c khai báo chúng nh v y bên trong danh sách i.

double d2.7). import java.io.YEAR)-namSinh).1977. } public static void main(String args[]) {HocSinh ng1=new HocSinh("Nguyen Tam Hung".println("Dia chi ="+diaChi). double d3.getInstance(). System.in)). System.Detructor.6. System.} //-------------------------------------------------public double diemTBUT() {return (dToan*2+dLy+dHoa+dTin*2)/6.double d2. ng1. Address. import java. double dLy.out. double dHoa.6. } public double tongDiem() {return (dToan+dLy+dHoa).double d1.9. static private BufferedReader br=new BufferedReader(new InputStreamReader(System.} public void hienThi() {System.*. int namSinh.int birthday. protected double dToan.*.out. d1. } //Khai bao cac phuong thuc cua lop Man public int tinhTuoi() {Calendar now=Calendar.String hoTen.String Address. System.hienThi(). String Address. public HocSinhCD(String name.println("Diem Hoa="+dHoa). d3).println("Tuoi="+tinhTuoi()).diaChi=Address. birthday.out.0.println("CAC THONG SO VE CAN BO").lang.println("Diem Ly="+dLy).} //-------------------------------------------------public void hienThi1() {System.dTin=d4.} //----------------Xay dung cac phuong thuc public double tongDiem() {return (dToan+dLy+dHoa+dTin).4.println("Tong diem cac mon="+tongDiem()). Trang 58 ."Quang Ninh". System.println("Diem Toan="+dToan).double d3) {hoTen=name.dLy=d2. int birthday. System.out. Xây d ng l p d n xu t package JavaContent. d2. return (now.namSinh=birthday.get(Calendar. //Khai bao Contructor & Detructor public HocSinh(String name.out.out. } } 2.out. public class HocSinhCD extends HocSinh {//-------------------Khai bao du lieu thanh phan cho lop CanBo protected double dTin. String diaChi.println("Ho va ten nhan su="+hoTen).dToan=d1.out. //-----------------Khai bao Contructor.double d4) { super(name.dHoa=d3. double d1.

"Ha Tay".d4).d2.toString()).out.out.0).readLine(). } //-------------------------------------------------public static long readLong() { long d=0. System.out.d1.dc=" ".readLine(). } //----------------Xay dung cac phuong thuc nhap du lieu public static int readInt() {int d=0.parseFloat(str).0.0.d2=readDouble(). //Goi phuong thuc Hie Thi cua lop co so //Doi hpuong thuc readDoube hs1.} return d.out.hienThi(). System.d3=0. int ns=0.print("Nhap vao nam sinh:"). try{ String str=br. d=Long.parseInt(str).out.7.d3. try{ String str=br.out.d4=0.out.print("Nhap vao diem Hoa:").parseLong(str).out.out.d4=readDouble().d1=readDouble().println("Diem TBC co uu tien=" +diemTBUT()). System.hienThi1().dc=readString().7.print("Nhap vao diem in:").print("Nhap vao ho ten:").print("Nhap vao diem Toan:"). System.ns=readInt().1980. System.hienThi().0.print("Nhap vao diem Ly:"). // HocSinhCD hs1=new HocSinhCD("Nguyen Van Thanh". d=Integer. System. hs1.out.print("Nhap vao dia chi:").println("Loi IO "+ex.dc.} Trang 59 . HocSinhCD hs1=new HocSinhCD(ht.println("Loi IO "+ex.ns.hienThi(). TK1[0].//Khai bao mot mang hoc sinh trong 1 lop TK1[0]=hs1. System. HocSinhCD TK1[]=new HocSinhCD[100]. }catch(IOException ex){System.println("Diem mon Tin=" +dTin).d2=0.out. d=Float. double d1=0. } //-------------------------------------------------public static void main(String args[]) {String ht=" ".d3=readDouble(). try{ String str=br.readLine(). System.println("Loi IO "+ex.out.toString()). }catch(IOException ex){System. } //-------------------------------------------------public static float readFloat() { float d=0.ht=readString().toString()). System.} return d.7.7. }catch(IOException ex){System.

println("Loi IO "+ex.parseDouble(str).toString()).toString()).} return d. } //------------------------------------------------------public static String readString() { String str=" ".println("Loi IO "+ex. }catch(IOException ex){System.out.} return str. } } Trang 60 .readLine().out. d=Double.readLine().return d. try{ str=br. } //-------------------------------------------------public static double readDouble() { double d=0. }catch(IOException ex){System. try{ String str=br.

do l p tr u t ng ch làm l p c s cho các l p khác. Không th t o ra i t ng c a l p tr u t ng Ph Trang 61 . b i vì nó c dùng nh ngh a m t giao di n chung cho các l p khác. N u m t l p k th a t l p tr u t ng thì: ho c chúng ph i ghi è t t c các ph ng th c o c a l p cha. vi c cài t c th s dành cho l p con Chú ý: 1. N u trong l p có ph ng th c tr u t ng thì l p ó ph i c khai báo là tr u t ng 2. L P C S TR U T NG M t l p c s tr u t ng là m t l p ch c dùng làm c s cho các l p khác. ho c l p ó ph i là l p tr u t ng 3. do v y các ph ng th c tr u t ng c ng không c cài t c th . chúng ch g m có khai báo.BÀI 6. ta không th t o ra th hi n c a l p này. ng th c tr u t ng M t l p tr u t ng có th ch a m t vài ph ng th c tr u t ng.

trong l p d n xu t này ta s ghi è các ph ng th c c a l p c s ( i v i l p c s th ng). các i t ng khác nhau. ho c là m t giao di n). khi có nhi u ph ng th c trùng tên nhau nh ng các l p có c p b c khác nhau. Các b c t o a hình thái: 1) Xây d ng l p c s (th ng là l p c s tr u t ng. a hình thái cho phép các v n khác nhau.. th c hi n hành vi a hình thái Khái ni m v t o khuôn lên. vì m t i t ng c a l p con c ng có y các thành ph n c a l p cha. các cách gi i quy t khác nhau theo cùng m t l c chung. A HÌNH THÁI a hình thái trong l p trình h ng i t ng c p n kh n ng quy t nh trong lúc thi hành (runtime) mã nào s c ch y. 3) Th c hi n vi c t o khuôn xu ng. ho c l p tr u t ng).. vi c t o khuôn lên là an toàn. ho c tri n khai chi ti t ( i v i giao di n ). các ph ng th c khác nhau. Trang 62 .BÀI 7. vi c t o khuôn xu ng luôn c java ch p thu n. Chú ý: Kh n ng a hình thái trong l p trình h ng i t ng còn c g i v i nhi u cái tên khác nhau nh : t ng ng b i. l p này s c các l p con m r ng( i v i l p th ng. do v y khi t o khuôn xu ng ta không c n ph i ép ki u t ng minh. tuy nhiên vi c t o khuôn lên s b báo l i n u nh ta không ép ki u m t cách t ng minh. 2) Xây d ng các l p d n xu t t l p c s v a t o. t o khuôn xu ng Ø Hi n t ng m t i t ng c a l p cha tham tr n m t i t ng c a l p con thì c g i là t o khuôn xu ng. ho c tri n khai chi ti t nó ( i v i l p c s tr u t ng ho c giao di n). Ø Hi n t ng m t i t ng c a l p con tham tr t i m t i t ng c a l p cha thì c g i là t o khuôn lên. k t ghép ng. thông qua l p s .

b i trong java không có khái ni m k th a b i. Gi ng nh m t l p ta c ng có th thêm b t public vào tr c nh ngh a c a interface. u này cho phép ta có th t o ra các l p c c b . m t l p không có b t c hàm nào c cài t Ø Th c hi n hành vi t ng t nh k th a b i. Ta có th ngh nó nh là m t l p abstract “thu n tuý”. L P TRONG. Sau ây là hình nh c a m t interface. final String oracleTicker = "ORCL". ch cs d ng n i b bên trong m t n v ó. GIAO DI N. nó cho phép ta t o ra m t l p thu n o. nó có k th a t m t giao di n khác hay không. final String ciscoTicker = "CSCO". ph n khai báo cho bi t m t s thông tin nh : tên c a interface. } Trang 63 . double newValue). Nh ng do java t ng làm các tr ng thành final nên ta không c n thêm b t này. Giao di n T khoá interface ã a khái ni m abstract i xa thêm m t b c n a. M t interface g m có 2 ph n: ph n khai báo và ph n thân. trong java ta có th nh ngh a m t l p bên trong m t l p khác. l p này ch g m t p các giao di n cho các l p mu n d n xu t t nó. trong ngôn ng C++ I. th m chí ta còn có th t o l p trong. m t interface c ng có th có các tr ng. tuy nhiên java t ng làm các tr ng này thành static và final t o ra m t interface. Ph n thân ch a các khai báo h ng. nh c a C++ L p trong cho ta m t cách th c tinh vi che gi u mã m t cách t i a. khai báo ph ng th c ( nh ng không có cài t). GÓI Giao di n là m t khái ni m c java a ra v i 2 m c ích chính: Ø t o ra m t l p c s thu n o.BÀI 8. Ta không th t o ra m t l p trong. void valueChanged(String tickerSymbol. ta dùng t khoá interface thay vì t khoá class. do v y ta có th nh ngh a l i giao di n nh sau: Nh ng do java t ng làm các tr ng thành final nên ta không c n thêm b t này public interface StockWatcher { final String sunTicker = "SUNW". bên trong thân c a m t ph ng th c.

2. các ph n khác là tu ch n. tri n khai m t giao di n b n bao g m t khoá implements vào ph n khai báo l p.equals(ciscoTicker)) { . int z). public void valueChanged(String tickerSymbol. n u ta thêm các b t khác nh private. T t c các thành ph n c a m t giao di n t ng là public do v y ta không c n ph i cho b t này vào. nên ta không c n ph i cho b t này vào.1. T t c các tr ng t ng là final và static. do v y các l p d n xu t t l p này ph i tri n khai y t t c các khai báo bên trong giao di n... các ph ng th c này ph i k t thúc v i d u ch m ph y ‘.. Tri n khai giao di n B i m t giao di n ch g m các mô t chúng không có ph n cài t. các ph ng th c r ng ( không có cài t ). } else if (tickerSymbol. . 2.. int y).equals(sunTicker)) { . Ph n thân Ph n thân khai báo các các h ng.’. public void volume(int x. . Ph n khai báo c a giao di n T ng quát ph n khai báo c a m t giao di n có c u trúc t ng quát nh sau: Public interface InterfaceName Extends SuperInterface { InterfaceBody } //giao di n này là công c ng //tên c a giao di n //giao di n này là m r ng c a 1 giao di n khác //thân c a giao di n Trong c u trúc trên có 2 ph n b t bu c ph i có ó là ph n interface và InterfaceName. l p c a b n có th tri n khai m t ho c nhi u giao di n ( hình th c này t ng t nh k th a b i c a C++) Ví d 1 public class StockApplet extends Applet implements StockWatcher { . double newValue) { if (tickerSymbol. Trang 64 . .equals(oracleTicker)) { . int y. Java yêu c u t t c các thành ph n c a giao di n ph i là public. các giao di n c nh ngh a cho các l p d n xu t tri n khai. . 3. } else if (tickerSymbol. b i vì chúng không có ph n cài t Chú ý: 1. protected tr c các khai báo thì ta s nh n c m t l i lúc d ch 3. } } } Ví d 2 public interface MyInterface{ public void add(int x.

out.out.println("Gia tri hang so price="+price). int y.} //Ho c interface Interface_Const{ public static final double price = 100.println("Gia tri hang so counter="+counter). public boolean hasMoreElements() { Trang 65 .size() . Tuy nhiên b n ph i hi u r ng l p trong không ph i là là h p thành Ví d : public class Stack { private Vector items. public static final int counter = 5.8). v n không c java h tr + M t giao di n có th m r ng m t giao di n khác.’ + L p tri n khai giao di n ph i th c thi t t c các ph ng th c c khai báo trong giao di n.println("Tong cua 2 so "+x+" + " + y+" la:"+ (x+y)). uu.volume(20.Interface_Const { public void add(int x. L p trong là m t tính n ng có giá tr vì nó cho phép b n g p nhóm các l p v m t logic thu c v nhau và ki m soát tính th y c c a các l p này bên trong l p khác. uu. int z) { System. do v y ta có l i d ng u này th c hi n hành vi k th a b i.0.out.} public void volume(int x. . L p trong Có th t m t nh ngh a l p này vào bên trong m t l p khác. System. u này c g i là l p trong. } public static void main(String args[]) {Use_MyInterface uu=new Use_MyInterface().//code for Stack's methods and constructors not shown. public Enumeration enumerator() { return new StackEnum(). public class Use_MyInterface implements MyInterface.15. b ng hình th c k th a II. System.. .add(4.println("Tich cua 3 so "+x+" * " + y+"*"+z+" la:"+ (x*y*z)). n u nh l p ó không tri n khai. } + S d ng Interface trên package JavaContent.1..out. } } Chú ý: + N u m t l p tri n khai nhi u giao di n thì các giao di n này c li t kê cách nhau b i d u ph y ‘.. ho c tri n khai không h t thì nó ph i c khai báo là abstract + Do giao di n c ng là m t l p tr u t ng do v y ta không th t o th hi n c a giao di n + M t l p có th tri n khai nhi u giao di n. } class StackEnum implements Enumeration { int currentItem = items. int y) {System.9).

} } } L p trong r t h u hi u khi b n b n mu n t o ra các l p thi t k giao di n ng i dùng ) uh p( c bàn k khi nói v Trang 66 . } public Object nextElement() { if (!hasMoreElements()) throw new NoSuchElementException(). else return items.return (currentItem >= 0).elementAt(currentItem--).

9}.//nh trên . 9 Trang 67 . t c là m i ph n t c a m ng s nh n giá tr : + 0 n u KDL là ki u s + ‘\0’ n u KDL là kí t + false n u KDL là boolean + null n u KDL là m t l p nào ó. 7. “ ào Th M n”. T o ra m t m ng g m 5 ph n t .Bài 9. Ngoài cách khai báo trên Java còn cho phép ta k t h p c khai báo và kh i gán các ph n t c a m ng theo cách sau: int[] mangInt = {1. Ø Khi m ng c t o ra thì m i ph n t c a m ng s nh n m t giá tr m c nh. M ng 1 chi u a) Khai báo Cú pháp khai báo: . “H ng Yên”). //T o ra m ng Cách 2: int mangInt[]=new int[100]. 3.KDL tên_m ng[]. arraySinhVien[99]=new SinhVien(“sv100”. “Nguy n V n An”. …. arraySinhVien[1]=new SinhVien(“sv02”.KDL []tên_m ng. 5. “Hà Nam”). các ph n t c a m ng l n l t c gán các giá tr là: 1. Chú ý: Ø M ng trong Java là m t i t ng Ø C ng nh các i t ng khác. M NG. Ø Spt là s ph n t c a m ng.//T o ra m t m ng có spt ph n t Trong cú pháp trên thì: Ø KDL là m t ki u d li u b t k nh : ki u nguyên th y. 5. m ng ph i c t o ra b ng toán t new nh sau: Tên_m ng=new KDL[spt]. quy t c kh i t o giá tr cho các ph n t c a m ng c ng chính là quy t c kh i u giá tr cho các thu c tính c a i t ng. Ví d 2: Gi s ta có l p SinhVien ã c nh ngh a. kh i t o t ng ph n t c a m ng ta ph i làm nh sau: arraySinhVien[0]=new SinhVien(“sv01”. hãy khai báo m t m ng g m 100 i t ng c a l p SinhVien SinhVien arraySinhVien[]=new SinhVien[100]. 7. “B c Giang”). M ng 1. T P H P I.//Khai báo m t con tr m ng . 3. Ví d 1: Khai báo m t m ng s nguyên g m 100 ph n t Cách 1: int mangInt[]. XÂU KÝ T . //Khai báo m t con tr n m ng các s nguyên mangInt=new int[100].KDL tên_m ng[] = new KDL[spt]. Chú ý: Lúc này m i ph n t c a m ng arraySinhVien là m t con tr c a l p SinhVien và hi n gi m i ph n t c a m ng ang tr n giá tr null. ki u i t ng… nó xác nh ki u d li u c a t ng ph n t c a m ng. “Nguy n Th Bình”.

out. Ví d : int a[]=new int [3]. “HN”) mangSinhVien [2]=new SinhVien(“sv03”. “Nguy n V n A”.theht. //Khai báo và t o ra m ng g m 3 ph n t Lúc này các ph n t c a m ng l n l t c truy xu t nh sau: .println("M ng v a nh p là").length. “Nguy n V n A”.i<a.length Ví d 1: Nh p vào m t m ng và in ra màn hình import com. //Nh p d li u cho m ng for(int i=0. do v y nó c ng có các thu c tính và các ph ng th c nh các i t ng khác. } } Trang 68 . new SinhVien(“sv02”. “HY”). “BG”). class ArrayDemo{ public static void main(String[] args) { //Nh p s ph n t c a m ng System.out.i++){ System.out.readInt(). new SinhVien(“sv03”. l y v s ph n t c a m ng ta s d ng thu c tính length nh sau: Tên_m ng.print("a[" + i + "]=").print(a[i] + " ").length. int n=Keyboard.print("Nh p s ph n t c a m ng:").Ph n t th 3 ng th i là ph n t cu i cùng c a m ng là a[2] c) L y v s ph n t hi n t i c a m ng M ng trong Java là m t i t ng. for (int i = 0. i < a. null }. “BG”) mangSinhVien [3]=null b) Truy x t n các ph n t c a m ng m t chi u truy xu t n ph n t th ind c a m ng ta s d ng cú pháp nh sau: Tên_m ng[ind-1] Chú ý: Ph n t u tiên c a m ng có ch s là 0. “HY”) mangSinhVien [1]=new SinhVien(“sv02”.Ph n t u tiên c a m ng là a[0] .readInt(). “HN”). “Nguy n Th B”. “Nguy n Th B”. //Khai báo m ng v i s ph n t b ng n int a[]=new int[n]. “ Th Q”. giá tr c a các ph n t l n l t c kh i gán nh sau: mangSinhVien [0]=new SinhVien(“sv01”.SinhVien[] mangSinhVien = { new SinhVien(“sv01”.out. a[i]=Keyboard. “ Th Q”. i++) System. } //In m ng ra màn hình System.Ph n t th 2 c a m ng là a[1] . Khai báo m t m ng g m 4 ph n t .Keyboard.

readInt().println("Dãy t ng d n").. a[i]=Keyboard. for (int i = 0.println("Dãy không ph i t ng d n").out.length-1.readInt().Keyboard. N l nN l n Trong ó: Ø KDL là m t ki u d li u b t k : nguyên thu ho c l p Ø sp1.//Thoát kh i vòng l p } if(kt) System. } } 2. sp2.length. i++) if(a[i+1]-a[i]<0){ kt=false.i<a.out. M ng nhi u chi u a) Khai báo Khai báo m ng N chi u trong Java KDL [][]…[] tên_m ng.print("Nh p s ph n t c a m ng:").i++){ System.print("a[" + i + "]="). ho c int a[][]. Nl n ho c c ti n hành nh sau: KDL tên_m tên_m ng [][]KDL[spt1][spt2]…[sptN].out.Khai báo m t con tr c a m ng 2 chi u int[][] a . //Khai báo m ng v i s ph n t b ng n int a[]=new int[n]. N Ví d : .Ví d 2: Nh p vào m t m ng s th c sau ó ki m tra xem m ng có ph i là m t dãy t ng hay không? import com. int n=Keyboard.. 3 c t Trang 69 . //Nh p d li u cho m ng for(int i=0. class ArrayDemo2{ public static void main(String[] args) { //Nh p s ph n t c a m ng System. } //Ki m tra dãy t ng boolean kt=true.//thay i tr ng thái c break. . 2. i < a. KDL ng [][]…[] =new [] .out. …. Ø Khai báo và t o ra m ng 2 chi u: int[][] a = new int[2][3]. else System.theht. // Ma tr n g m 2 hàng. sptN l n l t là s ph n t trên chi u th 1.

theht. 5}.print(a[i][j] + " ").out. class MaTram { public static void main(String[] args) { //Nh p s hàng và s c t System.print("a[" + i + ". } //In m ng hai chi u ra màn hình for (int i = 0.length. System. j < a[i]. //Các ph n t trên hàng th nh t {2. a[1][2].length.readInt(). i++) for (int j = 0. //Các ph n t trên hàng th hai {1. Xâu ký t Vi c x lý các xâu ký t trong Java c h tr b i hai l p String và StringBuffer. a[0][2]. a[1][0]. i < a. //Khai báo m ng hai chi u g m sh hàng và sc c t float a[][] = new float[sh][sc]. Trang 70 . a[0][1]. int sc = Keyboard.Keyboard. j < a[i].readInt(). //Nh p d li u cho m ng hai chi u for (int i = 0. L p StringBuffer c s d ng i v i nh ng xâu ký t ng. t c là có th thay i cn i dung bên trong c a xâu.out.out.println()." + j + "]="). II. h ng 2 g m 4 ph n t và hàng th 3 g m 2 ph n t . ngh a là nh ng xâu ch c và sau khi c kh i t o giá tr thì n i dung bên trong xâu không th thay i c. } } } Ví d 2: Nh p vào ma tr n vuông sau ó tính t ng các ph n t trên ng chéo chính.out. a[2][0]. Chú ý: V i khai báo trên n u ta li t kê các ph n t c a m ng theo trình t t trái qua ph i và t trên xu ng d i thì các ph n t l n l t là: a[0][0]. 9}. i++) { for (int j = 0.print("Nh p s hàng:"). //Các ph n t trên hàng th ba } Khai báo trên s t o ra m t m ng hai chi u g m: 3 hàng. a[2][1] b) Truy xu t n ph n t m ng nhi u chi u tên_m ng[ind1][ind2] Ví d 1: Nh p vào m t ma tr n và in ra màn hình import com. j++) System. 7}.length. 7.. a[1][1].Khai báo và kh i gán giá tr cho các ph n t c a m ng 2 chi u: int a[][]={ {1. int sh = Keyboard. c t j a[i][j] = Keyboard.length. i < a. j++) { System.print("Nh p s c t:"). nh ng trên m i hàng l i có s ph n t khác nhau.readFloat(). 4. System.out. c th là: trên hàng th nh t có 3 ph n t . 2. a[1][3]. //Nh p li u cho ph n t hàng i. L p String dùng cho nh ng xâu ký t b t bi n.

là s l ng ký t k t ký t b t u.2).boolean startsWith(String s ) Ph ng th c này tr v giá tr ki u logic (Boolean). StrSecond = “Chaplin”. //str2 ch a “Hello World” char ch[] = {‘A’. StrFirst = “Charlie”. ph ng th c này không th ng xuyên n i hai chu i t i v trí cu i cùng c a chu i u tiên. m. Trang 71 . String str3 = new String(ch). Nó cung c p các ph ng th c kh i t o (constructor) khác nhau: String str1 = new String( ). Bi n “ch” ch a giá tr “L”. chu i m i ó s ch a giá tr c a c hai. char ch = name. ng th c concat( ) ch làm vi c v i hai chu i t i m t th i ng th c c a l p String ng th c c a l p String. String str2 = new String(“Hello World”). Toán t “+” c s d ng c ng chu i khác vào chu i ang t n t i. t ó v trí các s b t u t 0.’D’. Ví d : String strFirst.char charAt(int index ) Ph Ví d : String name = new String(“Java Language”). i u này có th c gán cho chu i ang t n t i. . //str1 ch a m t chu i r ng. strSecond. Không gi ng nh toán t “+”. Ph ng th c “concat( )” c a l p String c ng có th th c hi n vi c n i chu i. //str4 ch a “AB” vì 0.concat(strSecond).’C’.1. strFinal. //str3 ch a “ABCDE” String str4 = new String(ch. chúng ta s xem xét các ph . boolean flag = strname.’B’. Ví d : String strname = “Java Language”.’E’}.charAt(5). n i chu i c th c hi n thông qua l p “StringBuffer”. Thay vào ó. //…. Toán t “+” này c g i nh là “n i chu i”. ph thu c vào chu i có b t u v i m t chu i con c th nào ó không.startsWith(“Java”). Các ph thao tác v i Trong ph n này.tính t ký t b t u.b ng cách s d ng ph Ph ng th c concat( ) gán v i m t chu i ang t n t i. 2. ph ng th c này tr v m t chu i m i. StrFinal = strFirst. L p String Chu i là m t dãy các ký t . L p String cung c p các ph ng th c các chu i.0. Chúng ta s th o lu n v l p này trong ph n sau. ây. ng th c này tr v m t ký t t i v trí index trong chu i.

ph thu c vào chu i k t thúc b ng m t chu i con nào ó không. String lower = new String(“good morning”). . System. .’a’. System.’a’. int index3 = day.String copyValueOf( ) Ph ng th c này tr v m t chu i c rút ra t m t m ng ký t c truy n nh m t i s . Tham s u tiên ch nh v trí t n i các ký t ph i c rút ra. Bi n “flag” ch a giá tr false.println(“Lowercase: “+upper.’g’. Ví d : String strname = “Java Language”.2).String trim() Ph ng th c này c t b kho ng tr ng hai u chu i. //ch a m c 0 . boolean flag = strname. . Ph ng th c này c ng l y hai tham s nguyên.2). String day = new String(“Sunday”).toUpperCase( )).’u’.out.toLowerCase( )). char textArray[] = text. và tham s th hai ch nh s ký t c rút ra t m ng. Hãy th s khác nhau tr c và sau khi c t b kho ng tr ng. String subname = String . Ví d : String text = new String(“Hello World”).indexOf(‘z’.endsWith(“Java”). //ch a 2 int index2 = day.out.Edited by Foxit Reader Copyright(C) by Foxit Software Company. Bi n “flag” ch a giá tr true.’g’. . Trang 72 n mã sau th y Ten lop .indexOf(“Sun”).’n’.int indexOf(String sunString ) Ph ng th c này tr v th t c a m t ký t nào ó. //ch a –1 n u “z” không tìm th y t i v trí 2. int index1 = day. ho c m t chu i trong ph m vi m t chu i. Bây gi bi n “subname” ch a chu i “ag”.boolean endsWith(String s ) Ph ng th c này tr v m t giá tr ki u logic (boolean).indexOf(‘n’).toCharArray( ).String toUpperCase( ) Ph ng th c này tr v ch hoa c a chu i.5. String upper = new String(“JAVA”).2005-2008 For Evaluation Only.char [] toCharArray( ) Ph ng th c này chuy n chu i thành m t m ng ký t .’e’}. Các câu l nh sau bi u di n các cách khác nhau c a vi c s d ng hàm. .copyValueOf(name.String toLowerCase( ) Ph ng th c này tr v ch th ng c a chu i. . Ví d : char name[] = {‘L’.println(“Uppercase: ”+lower.

//ch a 0 System.length()). ó là các ký t và các chu i có th c chèn vào gi a i t ng StringBuffer.equals(name2).length()).out. Ph ng th c “length()” c p n s các ký t mà i t ng th c ch a.out. ho c n i thêm d li u vào t i v trí cu i.println(s1. Dung l ng c a StringBuffer có th thay i v i ph ng th c s int ã c truy n n ph ng th c này.boolean equals(String s) Ph ng th c này so sánh n i dung c a hai it ng chu i. xâu nh n c là “true” ho c “false” t ng ng v i giá tr true ho c false c a b static String valueOf(char c)//Chuy n kí t thành xâu static String valueOf(int i)//chuy n m t s nguyên thành xâu static String valueOf(long l)//Chuy n m t giá tr long thành xâu static String valueOf(float f)//chuy n m t giá tr float thành xâu static String valueOf(double d)//chuy n m t giá tr double thành xâu 2. Các i t ng c a l p này r t m m d o.Các ph ng th c valueOf c n p ch ng cho phép chuy n m t giá tr thành xâu static String valueOf(Object obj)//Chuy n m t i t ng thành xâu.capacity()). b ng cách g i n ph ng th c toString c a i t ng obj static String valueOf(char[] characters)//Chuy n m ng các ký t thành xâu.trim()).out. trong khi “capacity()” tr v t ng dung l ng c a m t i t ng (m c nh là 16) và s ký t trong i t ng StringBuffer. System. Bi n “flag” ch a giá tr false.capacity()). //Sau khi c t b kho ng tr ng .out.println(s2. L p StringBuffer L p StringBuffer cung c p các ph ng th c khác nhau thao tác m t i t ng d ng chu i. //ch a 28 } } “length()” và “capacity()” c a StringBuffer là hai ph ng th c hoàn toàn khác nhau.out. L p này cung c p nhi u ph ng th c kh i t o. Ch ng trình sau minh ho cách s d ng các ph ng th c kh i t o khác nhau t o ra các i t ng c a l p này. String space = new String(“ Spaces “). StringBuffer s3 = new StringBuffer( StringBuffer ).out. //ch a 20 System. System. //ch a 12 System. System. . class StringBufferCons{ public static void main(String args[]){ StringBuffer s1 = new StringBuffer(). i c tính toán nh sau: .println(space). System.capacity()).println(space.out. StringBuffer s2 = new StringBuffer(20). và dung l ng m i NewCapacity = OldCapacity * 2 + 2 Trang 73 “ensureCapacity()”.out.println(s2. static String valueOf(boolean b)//Chuy n m t giá tr logic thành xâu.println( s3 = + s3). //ch a 16 System. String name1 = “Java”.println(s3. name2 = “JAVA”.println(s3.2005-2008 For Evaluation Only.Edited by Foxit Reader Copyright(C) by Foxit Software Company. boolean flag = name1.

u ki n sau s c ki m tra: N u dung l ng(NewCapacity) m i l n h n i s c truy n cho ph ng th c “ensureCapacity()”. System.char charAt() Ph ng th c này tr v m t giá tr ký t trong nh.void insert() Ph ng th c này có hai tham s . thì dung l ng m i (NewCapacity) c t.capacity()). dung l StringBuffer str = new StringBuffer(“James Gosling”).ensureCapacity(8). . Ví d : StringBuffer str = new StringBuffer(“Java sion”).charAt(6). V trí chèn s l n h n hay b ng 0. Bi n “str” ch a chu i “Jbava sion”. . m t giá tr nguyên (int). class test{ public static void main(String args[]){ StringBuffer s1 = new StringBuffer(5). Thi t l p dung l ng c a s1 n 12 =(5*2+2) b i vì dung l ng truy n vào là 8 nh h n dung l ng c tính toán là 12 .’b’). .ensureCapacity(8).capacity()).N u dung l ng m i nh h n i s c truy n cho ph ng th c “ensureCapacity()”. Câu l nh s1. Thi t l p dung l ng c a “s1” n 30 b i vì dung l ng truy n vào là 30 thì l n h n dung ng c tính toán (12*2+2). Tham s th hai có th là m t chu i. str. hay m t giá tr s th c (float) c chèn vào.out. //ch a 12 m = +s1.ensureCapacity(30). thì dung l ng c t b ng giá tr tham s truy n vào. chúng ta s xem xét các ph ng th c c a l p StringBuffer v i m t ch ng trình.println( Dung l ng c a b nh s1.ensureCapacity(30). c chuy n sang chu i và sau ó m i c chèn vào. Các ph ng th c l p StringBuffer Trong ph n này.insert(1. m t ký t (char). s1. . Tham s u tiên là v trí chèn. char letter = str. tr ký t ho c chu i. Ví d : StringBuffer s1 = new StringBuffer(“Good”).append(“evening”).println( Dung l ng c a b nh } } Tr m = +s1.out. System. System.void append() Ph ng th c này n i thêm m t chu i ho c m t m ng ký t vào cu i cùng c a i ng StringBuffer. //ch a 5 m = +s1.println( Dung l ng c a b nh s1. Giá tr trong s1 bây gi là “goodevening”.Ví d : it ng StringBuffer t i v trí c ch Trong o n mã trên. Ch ng trình sau minh ho dung l ng c tính toán và c t nh th nào.c khi dung l ng c a StringBuffer c t l i. //ch a 30 ng ban u c a s1 là 5. và nh h n hay b ng chi u dài c a i t ng StringBuffer. s1. //ch a “G” Trang 74 . B t k i s nào.out.capacity()).

Ví d : it ng StringBuffer.reverse().. và tr v m t i StringBuffer str = new StringBuffer(“devil”).). StringBuffer strrev = str. char ch[] = new char[10].. và sao chép chúng vào m t m ng. tab. L p StringTokenizer M t l p StringTokenizer có th s d ng tách m t chu i thành các ph n t (token) nh h n. Bây gi bi n “ch” ch a “par” .void setCharAt(int index. Bi n “name” ch a “Java”. Ví d .0).’v’).setLength(str. Ph ng th c getChars() có b n tham s sau: Ch s u: v trí b t u. str.ch.void setLength() Ph ng th c này thi t l p chi u dài c a i t ng StringBuffer. N u chi u dài ch nh nhi u h n chi u dài d li u thì các ký t null c thêm vào ph n cu i c a StringBuffer StringBuffer str = new StringBuffer(10). B ng sau tóm t t 3 ph ng th c t o d ng c a l p StringTokenizer: Ý ngh a T o ra m t Trang 75 it ng StringTokenizer m i Ph ng th c xây d ng StringTokenizer(String) .void reverse() Ph ng th c này o ng c n i dung c a m t ng StringBuffer khác. tách ra các thành token ta có th tu bi n ch ra m t t p d u phân cách các token khi kh i t o i t ng StringTokenizer.length() +10). . và -) trong khi phân tích m t bi u th c. N u chi u dài c ch nh nh h n chi u dài d li u hi n t i c a nó. n i mà các ký t c sao chép. . thì các ký t th a s b c t b t. Tuy nhiên. Ví d : StringBuffer str = new StringBuffer(“Leopard”). III.. /. name. . thay th ký t trong m t StringBuffer b ng m t ký t StringBuffer name = new StringBuffer(“Jawa”). char value) Ph ng th c này khác t i m t v trí c s d ng c ch nh. l p StringTokenizer ã i xa h n vi c phân tách các t trong câu.6. m i t trong m t câu có th coi nh là m t token. Bi n “strrev” ch a “lived”. *.getChars(3. str. Ta c ng có th s d ng t p các toán t toán h c (+. V trí b t u trong m ng ích: Các ký t c sao chép vào m ng ích t v trí này.setCharAt(2. t n i mà ký t c l y ra. N u ta không ch ra t p d u phân cách thì m c nh là d u tr ng (space.char [] getChars() Ph ng th c này c s d ng trích ra các ký t t i t ng StringBuffer. Ch s k t thúc: v trí k t thúc M ng: M ng ích.

và m t c hi u cho bi t n u các d u phân cách s c tr v nh các token hay không. Tr v True n u còn có token ang c ánh d u trong chu i. import java.bbbb. nh v i “st1”. +. nó bao g m các ph ng th c hasMoreElements() và nextElement(). C hai tokenizer. public class StringTokenizerImplementer{ public static void main(String args[]){ // t m t bi u th c toán h c và t o m t tokenizer cho chu i ó. Th hai. T o ra m t i t ng StringTokenizer m i d a trên (String. Nó gi ng h t nh hasMoreElements. ph ng th c hasMoreTokens() và nextToken() c s d ng duy t qua t p các token. m t t p các d u phân cách. String. /. L p StringTokenizer cài t giao di n Enumeration. “st2” phân tách m t dòng c a các tr ng c phân cách b i d u ph y. Nó thì gi ng nh nextElement. true). Vì th . StringTokenizer st3 = new StringTokenizer(“aaa. Tr v Token k ti p trong chu i.StringTokenizer(String. và sau ó tr v token k ti p trong chu i. các ký t xu ng dòng. Câu l nh th hai trong ví d trên xây d ng m t i t ng StringTokenizer cho các bi u th c toán h c b ng cách s d ng các ký hi u *. StringTokenizer c a “st1” s c xây d ng b ng cách s d ng các chu i c cung c p và d u phân cách m c nh. Câu l nh th 3. StringTokenizer c a “st3” s d ng d u ph y nh m t d u phân cách. StringTokenizer st2 = new StringTokenizer(“4*3/2-1+4”. “st1” c s d ng phân tách m t bi u th c toán h c. Tr v True n u còn có token ang c ánh d u trong chu i. String) chu i c ch nh và m t t p các d u phân cách. boolean) d a trên chu i c ch nh. Trang 76 . hai i t ng StringTokenizer ã c t o ra. và hi n th các token. “. và -. D u phân cách m c nh là kho ng tr ng.*. Nó thì gi ng h t nh hasMoreTokens. trên c minh h a trong các ví d sau: Các ph ng th c t o d ng StringTokenizer st1 = new StringTokenizer(“A Stream of words”). Tr v token k ti p trong chu i.”).util. Các ph ng th c có th s d ng c a l p StringTokenizer c tóm t t trong b ng sau: Ph ng th c countTokens() hasMoreElements() hasMoreTokens() nextElement() nextToken() nextToken(String) M c ích Tr v s các token còn l i. T o ra m t i t ng StringTokenizer d a trên chu i c ch nh. Strìng) StringTokenizer(String. u tiên. Các d u phân cách này thì ch s d ng khi phân tách v n b n. Thay i b d u phân cách b ng chu i c ch nh. Nó thì gi ng nh nextToken. Trong câu l nh u tiên. Hãy xem xét ch ng trình ã cho bên d i. tab. Trong ví d này. “+-*/”.ccc”.

Nh ng l p này c xây d ng trong gói java. while (st2. hi n th System. các l p Wrapper (l p bao c a các ki u d li u nguyên th y). } } K t qu ch y ch ng trình c mô t nh hình d i. String commas = field1. Byte Short Integer Long Float Double Trang 77 .. . hi n th .and field4 . khi c n s d ng các l p trong gói này ta không c n ph i import nó). true). *+/.field2.hasMoreTokens()) System. //trong khi v n còn token. //t o m t chu i c a các tr ng c phân cách b i d u ph y và t o //m t tokenizer cho chu i.println( Tokens of mathExpr: )..String mathExpr = 4*3+2/4 .out..println( Comma-delimited tokens : ). M t s l p c b n c a Java Các l p c b n.println(st2. IV.false). String và l p StringBuffer.lang (gói m c nh c a Java.println(st1. M i l p trong Java u là l p con c a l p Object .out. StringTokenizer st1 = new StringTokenizer(mathExpr.hasMoreTokens()) System.out. Object Boolea Characte Voi Numbe Math Strin StringBuff . while(st1. //trong khi v n còn các token.out.nextToken()). Math.nextToken()). System. StringTokenizer st2 = new StringTokenizer(commas.field3. hay s d ng c a Java nh : Object.

Class getClass() Tr l i tên l p c a i t ng hi n th i. boolean equals(Object obj) Cho l i k t qu true khi i t ng hi n th i và obj là cùng m t i t ng. hàm này có th s d ng xác nh duy nh t giá tr cho m i i t ng. protected void finalize() throws Throwable Hàm này c g i ngay tr c khi i t ng b d n vào “thùng rác”. Các l p bao ki u nguyên th y (Wrapper class) Các giá tr nguyên th y không ph i là i t ng trong Java.lang cung c p các l p bao gói (Wrapper) cho t ng ki u d li u nguyên th y (g i t t là l p bao). Hàm này th ng c vi t è các l p con cho phù h p v i ng c nh so sánh b ng nhau trong các l p m r ng ó. Integer intObj = new Integer(“2002”). Các toán t này s ném ra ngo i l NumberFormatException khi giá tr String truy n vào hàm t o không h p l . Toán t th hai: chuy n các i t ng l p String bi u di n cho các giá tr nguyên th y v các l p t ng ng. Hàm println() l p PrintStream s chuy n các i s c a nó sang d ng v n b n khi s d ng hàm toString(). kí t và logic) thì gói java. Các l p bao (tr l p Character ch có m t toán t t o l p) u có hai toán t t o l p: Toán t t o l p s d ng giá tr nguyên th y t o ra i t ng t ng ng Character charObj = new Character(‘a’).lang 1. L p Object T t c các l p c xây d ng trong các ch ng trình Java u ho c là tr c ti p ho c gián ti p c m r ng t l p Object.14F). u này m b o tính nh t quán c a h th ng khi th c hi n ch ng trình. Boolean boolObj = new Boolean(“true”). String toString() N u các l p con không vi t è hàm này thì nó s tr l i d ng bi u di n v n b n (textual) c a i t ng. Integer intObj = new Integer(2002).C u trúc phân c p m t s l p trong gói java. ngh a là tr c khi i ng ó b hu b . có th thao tác c trên các giá tr nguyên th y (giá tr s . ngh a là t o ra b n copy m i c a i t ng hi n th i. 2. ây là l p c s nh t. Double doubleObj = new Double(3. Các l p bao có nh ng c tính chung sau: Các toán t t o l p chung. nh ngh a h u nh t t c nh ng ph ng th c ph n c b n các l p con cháu c a nó s d ng tr c ti p ho c vi t è. protected Object clone() throws CloneNotSupportedException i t ng m i c t o ra có cùng các tr ng thái nh i t ng hi n th i khi s d ng clone(). Float floatObj = new Float(3.14). Trang 78 . Object cung c p các ph ng th c sau: int hashCode() Khi các i t ng c l u vào các b ng b m (hash table). Boolean boolObj = new Boolean(true).

equals(‘b’).valueOf(“3.charValue().valueOf(“2002”). // “a” String boolStr = boolObj.valueOf(“3. toString(). Có các hàm ti n ích chung: valueOf(String s). Double doubleObj= Double. Character.equals(intObj1). boolean b = boolObj. Boolean.floatValueOf(). typeValue(). // false Integer intObj1 = Integer. boolean charTest = charObj.14”).doubleValueOf(). Double doubleObj= new Double(“3.valueOf(“true”). String charStr = charObj. // “2002” String doubleStr = doubleObj. Character charObj = new Character(‘a’). boolean intTest = intObj.14”).14F”).MAX_VALUE và các giá tr ki u ký t Unicode.14F double d = doubleObj. Các hàm này ném ra ngo i l NumberFormatException khi giá tr String truy n vào ph ng th c không h p l . Ngoài ra l p này còn nh ngh a m t s hàm static x lý trên các ký t : static boolean isLowerCase(char ch)// true n u ch là ký t th ng static boolean isUpperCase(char ch)// true n u ch là ký t vi t hoa static boolean isDigit(char ch) // true n uch là ch s static boolean isLetter(char ch)// true n u ch là ch cái static boolean isLetterOrDigit(char ch) // true n u ch là ch ho c là s static char toUpperCase(char ch)// Chuy n ch v ch vi t hoa Trang 79 .valueOf(“2010”). // false L p Boolean L p này nh ngh a hai i t ng Boolean.14” Các l p nh ngh a hàm typeValue() tr l i các giá tr nguyên th y t các i t ng nguyên th y. Boolean boolObj = Boolean. // “true” String intStr = intObj.TRUE. Integer intObj = Integer.14 char c = charObj.toString().MIN_VALUE.14F”). M i l p (tr l p Character) u nh ngh a hàm static valueOf(String s) tr l i i ng t ng ng. // ‘a’ ng ng v i Các l p vi t è hàm equals() th c hi n so sánh b ng nhau c a các i t ng nguyên th y. // “3. equals().FALSE bi u di n cho hai giá tr nguyên th y true và false t ng ng. // 2002 float f = floatObj.toString().toString().Float floatObj = new Float(“3.toString(). L p Character L p Character nh ngh a hai giá tr c c ti u.intValue(). // 3. Float floatObj = Float. Các l p vi t è hàm toString() tr l i là các i t ng String bi u di n cho các giá tr nguyên th y d ng xâu. // true int i = intObj. // 3. c c i Character.booleanValue().

readLine().MAX_VALUE là các gi i h n c a các s trong ki u ó.out.length.14”).println("Nhap vao " + n + " so nguyen").static char toLowerCase(char ch)// Chuy n ch v ch vi t th ng static char toTitleCase(char ch) // Chuy n ch v d ng tiêu . Float.parseInt(“2002”). }catch(IOException e){ System. k++) System. System. System. Integer.in).MIN_VALUE <L p bao>. k < n.print(k + ": ). import java. day[k] = Integer. str = stream. Trong các l p này u xác nh hai giá tr : <L p bao>. Long.MAX_VALUE. Ví d : Vi t ch ng trình nh p vào m t dãy s tùy ý và s p x p theo th t t ng d n. k++){ try{ System.out. class SapXep{ static int[] day. Double là các l p con c a l p Number. // 2147483647 Trong m i l p bao có hàm typeValue() chuy n các giá tr c a các i t ng nguyên th y v giá tr s : byte byteValue() short shortValue() int intValue() long longValue() float floatValue() double doubleValue() Trong m i l p bao còn có hàm static parseType(String s) chuy n các giá tr c bi u di n d i d ng xâu v các giá tr s : byte value1 = Byte. byte minByte = Byte.print(day[k] + " ").err. // -128 int maxInt = Integer.println(). DataInputStream stream = new DataInputStream(System. int n = day.println("I/O Error!"). Short. static void nhap(){ String str. k < n.MIN_VALUE. } } } static void hienThi(){ int n = day.out.io.valueOf(str).intValue(). for (int k = 0. Trang 80 .*.parseDouble(“3.length. double value3 = Double. Các l p bao ki u s Các l p Byte.parseByte(“16”).out. for (int k = 0. Ví d . int value2 = Integer.

tìm s c c i. k = j. int n. max. j < i. j++) if (max < day[j]){ max = day[j].println("Day so duoc sap xep: "). v. System.out. i > 0.} static void sapXep(){ int x.E và Math. DataInputStream stream = new DataInputStream(System. } n = Integer.valueOf(str). L p Math L p final class Math nh ngh a m t t p các hàm t nh th c hi n các ch c n ng chung c a toán h c nh các phép làm tròn s . for(int i =day.day = new int[n]. hienThi().intValue().out. 3. System. s pi thông qua Math. static double ceil(double d) Trang 81 . } day[k] = day[i]. str = "0".length-1. Các hàm làm tròn và x lý các giá tr gi i h n static int abs(int i) static long abs(long l) static float abs(float f) static double abs(double d) + Hàm abs() c n p ch ng tr l i giá tr tuy t i c a i s . SapXep. L p final class Math còn cung c p nh ng h ng s nh s e (c s c a logarithm).readLine(). nhap(). i--){ max = day[i]. k.k = i. for (int j = 0. } } public static void main(String[] args){ String str.print("\nCho biet bao nhieu so nhap vao: "). } } L p Void L p này ký hi u cho i t ng c a l p Class bi u di n cho giá tr void.PI.in).println("I/O Error!"). }catch(IOException e){ System. sinh s ng u nhiên. try{ str = stream.v. sapXep().err. c c ti u. day[i] = max.

max(int a. Ví d ceil(3. static double random() + Hàm random() cho l i giá tr là s ng u nhiên trong kho ng t 0. double b) c n p ch ng tr l i giá tr c c i c a hai is . static int round(float f d) static long round(double d) + Hàm round() c n p ch ng static int static long static float static double + Hàm max() i s và l i b ng i s và l i b ng tr l i s nguyên g n nh t c a is . float b) static double min(double a. double d2) + Hàm pow() tr l i giá tr là l y th a c a d1 và d2 (d1d2). double b) + Hàm min() c n p ch ng tr l i giá tr c c ti u c a hai Các hàm l y th a static double pow(double d1. i s âm. long b) max(float a.0 n 1.0 là s sàn d i c a i s . int b) static long min(long a. static double floor(double d) + Hàm floor() tr l i giá tr l n nh t ki u double mà không l n h n s nguyên. static double exp(double d) + Hàm exp() tr l i giá tr là lu th a c s e và s m d (ed).0 là s tr n trên c a i s . int b) max(long a. float b) max(double a. i d ng radian. static int min(int a. Ví d floor(3.0. Trang 82 . is .+ Hàm ceil() tr l i giá tr nh nh t ki u double mà không nh h n s nguyên. static double sqrt(double d) + Hàm sqrt() tr l i giá tr là c n b c hai c a d . static double log(double d) + Hàm log() tr l i giá tr là lô-ga-rit t nhiên (c s e) c a d.14) cho giá tr 3. i d ng radian. ho c giá tr NaN n u Các hàm ng giác static double sin(double d) + Hàm sin() tr l i giá tr là sine c a góc d static double cos(double d) + Hàm cos() tr l i giá tr là cose c a góc d static double tan(double d) + Hàm tan() tr l i giá tr là tangent c a góc d Hàm sinh s ng u nhiên c cho d c cho d c cho d i d ng radian.14) cho giá tr 4. long b) static float min(float a.

m r ng thành các giao di n khác nh Set. và có l p interface c s nh ngh a các phép toán các l p s d ng và cài t các ánh x t khoá sang các giá tr M r ng c a Map cài t các ánh x khoá theo th t Ph n cài t Gói java. <<interface >> <<interface >> <<interface >> <<interface >> <<interface >> <<interface >> Các giao di n lõi c a c u trúc Collection interface Mô t Collection Set SortedSet List Map SortedMap c mô t trong b ng sau: interface c s nh ngh a t t c các phép toán c b n cho các l p c n duy trì th c hi n và cài t chúng M r ng Collection cài t c u trúc t p h p. trong ó không có ph n t c l p và chúng c s p x p theo th t M r ng Collection cài t c u trúc danh sách. Ph n giao di n Giao di n (interface) Collection là c s phát tri n. tìm ki m và c thao tác nh là các ph n t c a t p h p.V. trong ó các ph n t c s p x p theo th t . Trang 83 . Các i t ng b t k có th c l u tr .util cung c p t p các l p cài t các giao di n lõi t o ra nh ng c u trúc d li u th ng s d ng nh : Vector. HashSet. TreeSet. Các l p t p h p T p h p (Collection) trong Java cho phép l u l i tham chi u n các i t ng. v. List. SortedSet và Map và giao di n c s m r ng thành SortedMap. Hình sau mô t c u trúc phân c p theo quan h k th a c a các giao di n lõi. trong ó không có ph n t c l p và chúng không cs px p M r ng Set cài t c u trúc t p h p c s p. Nh ng l p này và giao di n lõi c xây d ng theo c u trúc phân c p nh trong hình H6-3. HashTable. LinkedList.v.

boolean isEmpty().Tr l i true n u t p h p ch a obj. Gói java. static void sort(List list) S p x p các ph n t trong danh sách list theo th t t ng d n. ng c l i false.Xác nh kích th c c a t p h p. boolean contains(Object obj). Object obj) Thay th t t c các ph n t trong danh sách list b ng obj. Collection Giao di n Collection c xây d ng nh là m u h p ng cho t t c các c u trúc t p h p có th d a vào ó mà th c thi và cài t. ng c l i false. static void fill(List list. tìm ki m và d ch chuy n các ph n t . // Tùy ch n Trang 84 . boolean add(Object obj).<< interface>> Collection HashMap HasTable << interface>> Map << interface>> Set << interface>> List << interface>> Sorted Map Tree Map Hash Set << interface>> Sorted Set Array List Vector LinkedList Tree Set Các giao di n lõi và các l p cài t chúng Trong hình trên ký hi u à bi u di n cho quan h k th a gi a các giao di n và --> bi u di n cho s cài t các giao di n.util. static void shuffle(List list) Hoán v các ph n t c a danh sách list m t cách ng u nhiên.Tr l i true n u t p h p r ng. M t s hàm trong s ó là: static int binarySearch(List list. Ph n thu t toán L p java. Các phép toán c s int size(). 1.util cung c p các l p t p h p và cài t h u h t các hàm c a Collection.Collection (c n phân bi t v i giao di n Collection) cung c p m t s hàm static th c hi n nh ng thu t toán a x cho nh ng phép toán khác nhau trên t p h p. k c s p x p. Object key) S d ng thu t toán tìm ki m nh phân xác nh ch s c a ph n t key trong danh sách list.

retainAll(b) a.addAll(b) a. Set (t p h p) T p h p Set là c u trúc d li u.boolean remove(Object obj).retainAll(b) Hình Các phép toán trên các t p h p 2. boolean addAll(Collection c). Gi s a. // Tùy ch n Ki m tra xem t p h p hi n th i có ch a c t p h p c hay không. trong ó a. Sau ây chúng ta xét m t s l p th c thi cài HashSet M t d ng cài t nguyên th y c a Set là l p HashSet. Giao di n Set không nh ngh a thêm các hàm m i mà ch gi i h n l i các hàm c a Collection không cho phép các ph n t c a nó c l p l i. b là hai t ph pb tk .b (Hi u t p h p) a = a ∩ b (Giao t p h p) a = ∅ (T p r ng) t giao di n Set.removeAll(b) a. ng c l i false.clear() ng ng b ⊆ a ? (T p con) a = a ∪ b (H p t p h p) a = a . trong ó không có s l p l i và không có s s p x p c a các ph n t .containsAll(b) a. // Tùy ch n Th c hi n phép tr hai t p h p boolean retainAll(Collection c). a b a a a a a. K t qu th c hi n trên a. b có th mô t nh trong b ng sau: Các hàm trong Các phép h p t Set a. // Tùy ch n Tr l i true n u t p h p th c hi n thành công vi c b sung (lo i b ) obj.removeAll(b) a. b là hai t p h p (hai i t ng c a các l p cài t Set). boolean cotainAll(Collection c). L p này có các toán t t o l p: HashSet(): o ra m t t p m i không có ph n t nào c (t p r ng). HashSet(Collection c) Trang 85 . trong ó các ph n t c a nó là không c s p.addAll(b) a.// Tùy ch n Th c hi n phép h p hai t p h p boolean removeAll(Collection c). M t s phép toán khác Nh ng phép toán sau th c hi n trên t p h p nh m t n v c u trúc d li u. // Tùy ch n Th c hi n phép giao hai t p h p void clear() // Tùy ch n H yb i t ng trong t p h p các phép trên tr l i true n u th c hi n thành công và cho k t qu th c hi n c minh h a nh trong hình H6-4.

So sánh hai t p ó.containsAll(tap1). // L y t ng i s c a ch ng trình Set tap2 = new HashSet(). import java. e] va [ ] la roi nhau Trang 86 . HashSet(int initCapacity. public class TapKT { public static void main(String args[]) { int nArgs = args.4 Khi th c hi n các i s c a vào sau tên ch ng trình theo dòng l nh. // S ký t trong m i i s for (int j = 0.println(tap2 + " va " + tap1 + " co " + tapChung + " la phan chung").*.length. // S i s c a ch ng trình Set tap1 = new HashSet().addAll(tap2).// h p tap2 vào tap1 } } } D ch và th c hi n ch ng trình v i các i s nh sau: java TapKT em voi em anh s cho k t qu : [m.retainAll(tap2). i < nArgs. else { // tap2 có ph i là t p con c a tap1? boolean isSubset = tap1. j++)// T p th 2 ch a các ký t c a arg tap2. else if (isSuperset) System. else if (isSubset) System.size() == 0.out. // tap1 có b ng tap2? if (isSuperset && isSubset) System. thông báo k t qu ra màn hình.// T o ra t p th 2 int size = arg. sau ó c ng d n tap2 vào tap1 và l i ti p t c nh th i v i i s ti p theo cho n h t.println(tap2+" va "+tap1+" la roi nhau").println(tap2+" la tap cha cua "+tap1). } tap1.// tapChung = tap1 ∩ tap2 boolean b = tapChung. HashSet(int initCapacity) T o ra m t t p m i r ng có kích th c (kh n ng ch a) là initCapacity.util. else System.length().add(new Character(arg.println(tap2+" la tap con cua "+tap1). if (b) System. Ví d 6.out.T o ra m t t p m i ch a các ph n t c a t p h p c nh ng không cho phép l p. Ch ng trình b t u v i tap1 là r ng và l y các ký t c a i s u tiên t o ra tap2.println(tap2 + " bang tap " + tap1).containsAll(tap2). tapChung. i++){ String arg = args[i]. j < size.out.charAt(j))). // T o ra t p th nh t là r ng for (int i = 0. float loadFactor) T o ra m t t p m i r ng có kích th c (kh n ng ch a) là initCapacity và y u t c n p vào là loadFactor.out. // tap1 có ph i là t p con c a tap2? boolean isSuperset = tap2.out. // T o ra t p tapChung chính b ng tap1 Set tapChung = new HashSet(tap1).

h.lang. List (danh sách) C u trúc List là d ng t p h p các ph n t c s p theo th t (còn c g i là dãy tu n t ) và trong ó cho phép l p (hai ph n t gi ng nhau). int indexOf(Object elem) Cho bi t v trí l n xu t hi n u tiên c a elem trong danh sách. Hi u su t s d ng hai l p này là t ng ng nhau.5 H th ng có m t dãy N_DIGIT (5) ch s bí m t. e] la tap con cua [m. i. Collection c) // Tùy ch n Chèn các ph n t c a t p h p c vào v trí c xác nh b i index. Trong ó ListIterator là giao di n m r ng giao di n Iterator ã có trong java.err. Ngoài nh ng hàm mà nó c k th a t Collection.*. i. int toIndex) L y ra m t danh sách con t v trí fromIndex n toIndex . v. List subList(int fromIndex. o] la roi nhau 3. e. return.[v. void add(int index. e] la roi nhau [m.length != N_DIGIT) { System. ListIterator listIterator(int index) Cho l i các ph n t liên ti p b t u t ph n t c xác nh b i index. n] va [m. v. List còn b sung thêm nh ng hàm nh : Object get(int index) Cho l i ph n t c xác nh b i index. e.// T o danh sách biMat là r ng Trang 87 . import java. i. Các l p ArrayList.util. Object set(int index. ListIterator listIterator() Cho l i các ph n t liên ti p b t u t ph n t u tiên. boolean addAll(int index.println("Hay doan " + N_DIGIT + " chu so!"). Object remove(int index) // Tùy ch n B i ph n t c xác nh b i index. o] va [m. Ví d 6. } List biMat = new ArrayList(). public static void main(String args[]){ if(args. public class NhapDoanSo { final static int N_DIGIT = 5. Hãy vi t ch ng trình nh p vào N_DIGIT ch s oán xem có bao nhiêu ch s trùng và có bao nhiêu v trí các ch s trùng v i dãy s cho tr c. Object elem) // Tùy ch n Chèn elem vào sau ph n t c xác nh b i index. int lastIndexOf(Object elem) Cho bi t v trí l n xu t hi n cu i cùng c a elem trong danh sách. Object elem) // Tùy ch n Thay th ph n t c xác nh b i index b ng elem. Vector và LinkedList Ba l p này có nh ng toán t t o l p t o ra nh ng danh sách m i r ng ho c có các ph n t l y theo các t p h p khác. o] [a. Vector và ArrayList là hai l p ki u m ng ng (kích th c thay i c). tuy nhiên n u xét theo nhi u khía c nh khác thì ArrayList là c u trúc hi u qu nh t cài t c u trúc danh sách List.

// B sung các s vào dãy biMat biMat. Song. Cho giá tr true n u value c ánh x b i m t key nào ó."). Map (ánh x ) Map nh ngh a các ánh x t các khoá (keys) vào các giá tr .add("3").get(i))) ++nChua. ng c l i là false.println(nViTri + " vi tri doan trung. M i koá c ánh x sang nhi u nh t m t giá tr . Các ánh x không ph i là các t p h p. List doan = new ArrayList().remove(doan. Cho giá tr true n u key c ánh x sang m t giá tr nào ó. ListIterator kiemTra = biMat.listIterator(). i < N_DIGIT.next().add("2"). biMat. ngh a là th c hi n c phép b i remove() for(int i = 0.// biMat.hasNext())// Khi còn ph n t ti p theo // Ki m tra xem l n l t các v trí c a hai dãy có trùng nhau hay không if (kiemTra. boolean containsValue(Object value).add(args[i]).// T o danh sách doan là r ng for(int i = 0.listIterator(). c giá tr c xác nh b i key n u có ánh x . phép ánh x có th xem nh là m t lo i t p h p theo ngh a: các khoá (key) t o thành t p h p và t p h p các giá tr (value) ho c t p các c p <key. value> Object get(Object key). m s các ch s trùng nhau. i++) if (lap."). ListIterator thu = doan. ng c l i cho null n u không có ánh x ng v i key.next())) nViTri++. i < N_DIGIT.// L u l u biMat sang lap int nChua = 0. } } D ch và th c hi n ch ng trình: java NhapDoanSo 3 2 2 2 7 s cho k t qu : 4 chu so doan trung 1 vi tri doan trung 4. biMat. c g i là ánh x n. // Tìm nh ng v trí oán trúng trong hai dãy có l p while (kiemTra. Object value). value>. // Tùy ch n Chèn vào m t c p <key. // a các s t i s ch ng trình vào doan List lap = new ArrayList(biMat).out. // Thông báo k t qu ra màn hình System.out. Giao di n Map khai báo nh ng hàm sau: Object put(Object key.add("5"). biMat. L u ý: các khóa ph i là duy nh t (không cho phép l p).equals(thu. i++) doan.add("7"). System.add("2").println(nChua + " chu so doan trung. int nViTri = 0. Object remove(Object key). Trang 88 . ng c l i là false. giao di n Map c ng không ph i là m r ng c a các Collection. boolean containsKey(Object key). // Tùy ch n Lo i b ánh x c xác nh b i key.

Integer dem = (Integer) demNhom. i++){ double trongL = Double. public class NhomTrongluong { public static void main(String args[]){ // T o ra m t ánh x l u t n su t c a m i nhóm Map demNhom = new HashMap(). Integer nhomTL=new Integer((int)Math.round(trongL/5)*5). // S p x p l i theo các nhóm tr ng l ng Collections.parseDouble(args[i]). Xác nh t p các ánh x <key.keySet()). Cho s các c p ánh x <key. Chúng cho phép t o ra các ánh x m i có th r ng ho c có nh ng kích th c tùy ý. ng c l i là false.next(). Integer demCu = (Integer)demNhom. // S d ng hàm fill() c a l p Array t o ra xâu g m demInt các d u char[] bar = new char[demInt]. Xác nh t p h p các giá tr . // c các tr ng l ng c nh p vào t i s và chia nhóm cách nhau 5 nv.util.listIterator(). // Tùy ch n Xoá i t t c các ánh x . demNhom. int demInt = dem. demMoi).*. Collection values().put(nhomTL.get(nhom). Set keySet(). i < nArgs. value>. boolean isEmpty(). int nArgs = args. Ví d 6. Các l p HashMap và HashTable Hai l p này cài t giao di n Map và c xây d ng trong java. void clear(). Integer demMoi = (demCu == null)? new Integer(1): new Integer(demCu.sort(keys). // Tìm t n su t c a các tr ng l ng c nh p vào trong các nhóm while(keyIterator. // T ng s l n tr ng lu ng trong cùng nhóm.int size(). M t s phép toán th ng dùng void putAll(Map t). // Tùy ch n Sao l i các ánh x t t.intValue().intValue()+1). import java. value>.hasNext()) { Integer nhom = (Integer) keyIterator. ListIterator keyIterator = keys. Cho giá tr true n u ánh x r ng. Trang 89 . Xác nh t p các khoá. for(int i = 0.lang.length. n u là l n âu (demCu = null) thì t là 1.6 Vi t ch ng trình nh p vào các tr ng l ng và in ra t n su t c a các tr ng l ng ó trong các nhóm cách nhau 5 n v (kg). } // L y ra t p các giá tr t ánh x demNhom List keys = new ArrayList(demNhom. Set entrySet().get(nhomTL).

Comparator comparator() Cho l i th t so sánh c a c u trúc c s p. SortedMap tailMap(Object fromKey). '*'). SortedMap headMap(Object toKey). 4. cho null n u các ph n t c s p theo th t t nhiên (t ng d n) Giao di n SortedMap SortedMap là giao di n m r ng c a Map cung c p các hàm x lý các ánh x c s p theo th t c a khoá (key). Object toKey). Object lastKey().out. Object first(). } } } D ch và ch y ch ng trình NhomTrongLuong v i các tham s : java NhomTrongLuong 75 72 93 12 34 s cho k t qu : * * 1. SortedSet subSet(Object fromElem. SortedSet headSet(Object toElem). ** 95 * Nh v y. Giao di n SortedSet SortedSet là giao di n m r ng c a Set cung c p các hàm x lý các t p c s p. System. Object toElem). 35 kg có 1.Cho l i ph n t u tiên (c c ti u) c a ánh x c s p. Object last().Cho l i ph n t cu i cùng (c c i) c a t p c s p.Cho l i ph n t u tiên (c c ti u) c a t p c s p. Cho l i t p c s p g m nh ng ph n t k t fromElem n toElem.Cho l i ánh x c s p g m nh ng ph n t cu i ng sau fromKey. SortedSet (t p c s p) và SortedMap (ánh x c s p) Các c u trúc t p h p (set) và ánh x (map) có giao di n c bi t là SortedSet và SortedMap nh trong hình H6-5 cài t nh ng c u trúc có các ph n t c s p theo th t ch nh.println(nhom+"\t" + new String(bar)). nhóm 10 kg có 1. Cho l i t p c s p g m nh ng ph n t ng tr c toElem.Arrays.fill(bar.Cho l i ánh x c s p g m nh ng ph n t k t fromKey n toKey. Object firstKey().Cho l i ánh x c s p g m nh ng ph n t ng tr c toKey. SortedSet tailSet(Object fromElem). 75 kg có 2 và 95 kg có 1.Cho l i ph n t cu i cùng (c c i) c a ánh x c s p. Cho l i t p c s p g m nh ng ph n t cu i ng sau fromElem. TreeSet và TreeMap Hai l p này cài t hai giao di n SortedSet và SortedMap t toán t t o l p nh sau: TreeSet() TreeMap() Trang 90 ng ng. SortedMap subMap(Object fromKey. Chúng có b n lo i .

TreeSet(SortedSet s) TreeMap(SortedMap m) T o ra nh ng t p ho c ánh x m i c s p và có các ph n t l y t s ho c t m t ng ng. c s p theo th t t ng d n c a các ph n t ho c c a khoá. TreeSet(Collection c) TreeMap(Map m) T o ra nh ng t p ho c ánh x m i c s p và có các ph n t l y t c ho c t m ng ng. Trang 91 . TreeSet(Comparator c) TreeMap(Comparator c) T o ra nh ng t p ho c ánh x m i c s p và xác nh th t so sánh theo c.T o ra nh ng t p ho c ánh x m i và r ng.

. i v i l i lúc th c thi. ây là l i d phát hi n và s a ch a. các ngo i l có th phát sinh c n c mô t chi ti t trong l nh khai báo c a ph ng th c. Ti n trình này òi h i c ch x lý ngo i l thích h p. m t ngo i l s x y ra và ch ng trình b h y mà không óng t p tin l i. ta có th ném ra bi t l m t cách t ng minh ( i u này s c gi i thi u sau). Trang 92 . M c ích c a vi c x lý ngo i l M t ch ng trình nên có c ch x lý ngo i l thích h p.M i l p bi t l trong java u c d n xu t t l p c s Throwable. II.M i ph ng th c u có th phát sinh các ngo i l . Quá trình tìm ki m này g i là b t bi t l . mà ng i l p trình không cung c p mã x lý l i. thông th ng l i runtime th ng do nguyên nhân khách quan nh : truy c p vào m t a nh ng a này l i ch a s n sàng. d a vào trình biên d ch. . . t t c các ngu n tài nguyên mà h th ng c p nên c thu h i l i. N u vi c chuy n i ki u d li u không th c hi n úng. trong bài hôm nay ta s bàn v v n s lý ngo i l trong java. Ví d . vi c khai báo này c g i là c t ngo i l . và b t ngo i l . k t n i v i máy tính xa nh ng máy ó l i không t n t i…. thì h th ng thi hành java b t u ti n trình tìm mã x lý l i. hay th c hi n phép chia nh ng m u s l i b ng 0. ta hoàn toàn có th ki m soát c chúng.L i lúc th c thi ( runtime error) i v i l i cú pháp ng i l p trình có th phát hi n và s a l i.L i cú pháp (syntac error) . Mã x lý l i hay còn g i là mã x lý bi t l . tuy nhiêmn ây c ng là l i gây khó kh n và chán n n i v i ng i m i h c l p trình. tránh tr ng h p này.L i logic thu t toán .Ch ng 3: X LÝ NGO I L i v i ng i l p trình h có th g p m t trong các l i sau: . b t u t ph ng th c hi n t i. tuy nhiên trong bài này ta không bàn lu n v v n này. Trong tr ng h p ó. Lúc ó t p tin d b h h i và các ngu n tài nguyên c c p phát cho t p tin không c tr l i cho h th ng. ây là l i khó phát hi n và s a ch a nh t. java runtime s tìm mã x lý l i b ng cách l n ng c tr l i chu i các ph ng th c g i nhau. i v i l i thu t toán. u này gây lãng phí tài nguyên. Mô hình s lý ngo i l c a java Mô hình s lý ngo i l c a java d a trên ba ho t ng chính: c t ngo i l . xét thao tác vào ra (I/O) trong m t t p tin. vi c này c g i là ném ra bi t l . Ch ng trình s k t thúc n u không tìm th y mã x lý bi t l . t t c các ngu n tài nguyên mà h th ng ã c p không c gi i phóng. thì ngo i l c chuy n n ph ng th c g i ph ng th c ó.Sau khi JVM ném ra m t ngo i l . . ném ra ngo i l . ch ng trình s b ng t khi m t ngo i l x y ra.Khi m t câu l nh trong ph ng th c gây l i. khi m t l i runtime x y ra JVM s phát sinh m t ngo i l . N u không. ta có th t o ra l p ngo i l riêng b ng cách m r ng l p Throwable I. n u m t ch ng trình không cung c p mã s lý ngo i l có th k t thúc không bình th ng.

III.c t ngo i l c t ngo i l là khai báo cho trình biên d ch bi t là ph ng th c này có th gây ra ngo i l lúc thi hành. } Trang 93 . Thông tin này có th c nh n v và c x lý. i t ng này sau ó c truy n cho ph ng th c là n i mà ngo i l x y ra. Ném ra ngo i l M t ph ng th c sau khi ã khai báo các bi t l . V n i v i ng i l p trình java là ph i bi t c n mã nào c a anh ta có th gây ra l i. thì b n (ho c ch ng trình th c thi java) có th ném ra các i t ng bi t l . Chú ý: . có kh n ng gây ra l i ó trong kh i try ( th làm). thì ph n vi c quan tr ng nh t là b t và x lý bi t l . catch ( TypeExceptionN ex){ // Mã c th c thi khi m t ngo i l TypeExceptionN c phát sinh trong kh i try } finally{ // kh i l nh nay luôn c th c hi n cho dù ngo i l có x y ra trong kh i try hay không. Khi h ã khoanh vùng c n mã có th gây ra l i h s t n mã. ví d : public void myMethod() throws IOException. và t n mã x lý l i trong kh i catch ( b t gi ).’ III. Sau khi b n ã bi t cách khai báo và ném ra bi t l . RemoteException t khoá throws ch cho trình biên d ch java bi t r ng ph ng th c này có th ném ra ngo i l IOException và RemoteException. i t ng t ng ng v i ngo i l ó c t o ra. Cú pháp c a l nh ném ra ngo i l : throw ExceptionObject. Khi m t ngo i l x y ra. Khuôn d ng t ng quát nh sau: try{ // Các l nh có kh n ng gây l i } catch ( TypeException1 ex){ // Mã c th c thi khi m t ngo i l TypeException1 c phát sinh trong kh i try } catch ( TypeException2 ex){ // Mã c th c thi khi m t ngo i l TypeException2 c phát sinh trong kh i try } . Các ngo i l này có th là m t ngo i l chu n c a Java ho c có th là m t ngo i l do ta t o ra.M t ph ng th c ch có th ném ra các ngo i l mà nó c khai báo IV.B n ph i chú ý gi a l nh khai báo bi t l và l nh ném ra ngo i l . có ki u mà ta ã khai báo trong danh sách throws. n u m t ph ng th c ném ra nhi u ngo i l thì các ngo i l c khai báo cách nhau b i d u ph y ‘.. i t ng này ch a thông tin chi ti t v ngo i l . L p ‘Throwable’ c Java cung c p là cha c a t t c các ngo i l trong Java (l p u tiên trong cây th a k ).. B t ngo i l M t ngo i l (exception) trong ch ng trình Java là d u hi u ch ra r ng có s xu t hi n m t u ki n không bình th ng nào ó. khai báo bi t l ta s d ng t khoá throws trong khai báo ph ng th c.

err Ví d : Trang 94 . n u ki u ngo i l so kh p v i ki u ngo i l trong m nh catch. n u không tìm th y m t ki u ng i l nào c so kh p java s k t thúc ph ng th c ó và chuy n bi t l ó ra ph ng th c ã g i ph ng th c này quá trình này c ti p t c cho n khi tìm th y mã x lý bi t l . ch ng trình có th ch m d t và in thông báo l i ra lu ng l i chu n System. n u không tìm th y mã x lý bi t l trong chu i các ph ng th c g i nhau. trong tr ng h p m t trong các câu l nh bên trong kh i try gây ra m t ngo i l thì.Th c hi n kh i try yes Tìm kh i x lý l i (kh i catch) th c hi n Có ngo i x y ra trong kh i try no u ngo i l sinh ra trong kh i try là m t th hi n c a l p ngo i l false true Th c hi n kh i catch ng v i ngo i l 1 u ngo i l sinh ra trong kh i try là m t th hi n c a l p ngo i l false ………… true Th c hi n kh i catch ng v i ngo i l 2 Th c hi n kh i finally u ngo i l sinh ra trong kh i try là m t th hi n c a l p ngo i l true Th c hi n kh i catch ng v i ngo i l 1 N u không có m t ngo i l nào phát sinh trong kh i try thì các m nh catch s b b qua. thì mã l nh trong kh i catch ó s c th c thi. thì java s b qua các câu l nh còn l i trong kh i try i tìm mã x lý ngo i l .

V. Ch ng trình s th c thi câu l nh u tiên c a kh i ‘finally’ ngay sau khi g p câu l nh ‘return’ hay l nh ‘break’ trong kh i ‘try’. try{ //Các l nh có kh n ng ném ra ngo i l } catch(Exception1 ex1){ … } catch(Exception2 ex2){ … } catch(Exceptionn exn){ … } finally{ //Mã l nh d n d p } Kh i ‘finally’ là tu ch n. thì các o n mã phía sau (ví d nh o n mã có ch c n ng thu h i tài nguyên. Kh i này c t sau kh i ‘catch’ cu i cùng.println(a. bi t c ngo i l này có th x y ra do v y ta b t nó và x lý trong kh i catch(ArithmeticException ex).println( Loi chia cho 0 ). Java cung c p kh i finally gi i quy t vi c này. Thông th ng kh i ‘finally’ ch a các câu l nh mang tính ch t d n d p nh : óng k t n i CSDL.println(1/n). nh các l nh óng t p vi t cu i ph ng th c) s không bao gi c g i.…. ta có th l y cá thông tin v ngo i l ch ng h n nh l y v mô t ngo i l nh sau: System.class TryClass{ public static void main(String args[]) { int n=0. Trang 95 . ây ex là m t i t ng c a l p ArithmeticException ch a các thông tin v ngo i l x y ra.} } } Khi ch y ch ng trình này ta se thu Loi chia cho 0 c m t dòng in ra màn hình nh sau: Trong o n ch ng trình trên khi chia m t s cho 0 s g p ngo i l ArithmeticException.out.out. try { System. óng t p tin. không b t bu c ph i có.getMessage()). N u u này x y ra. Kh i ‘finally’ Khi m t ngo i l xu t hi n. ph ng th c ang c th c thi có th b d ng mà không c hoàn thành.out. } catch(ArithmeticException ex) {System.

lang L i v s h c.Kh i ‘finally’ b o không. Ph ng th c yêu c u không t n t i. b t ch p có ngo i l x y ra hay Hình minh h a s th c hi n c a các kh i ‘try’. ‘catch’ và ‘finally’. M t s l p ngo i l chu n c a Java Danh sách m t s l p ngo i l Tên l p ngo i l Throwable Exception Ý ngh a ây là l p cha c a m i l p ngo i l trong Java ây là l p con tr c ti p c a l p Throwable. nó mô t m t ngo i l t ng quát có th x y ra trong ng d ng L p c s cho nhi u ngo i l java. ch b o m t không cho phép th c hi n. Khi m t lu ng b ng t. try block No Exception Exception occurs finally block catch block finally block VI. RuntimeException ArthmeticException IllegalAccessException IllegalArgumentException ArrayIndexOutOfBoundsExeption NullPointerException SecurityException ClassNotFoundException NumberFormatException AWTException IOException FileNotFoundException EOFException NoSuchMethodException InterruptedException Trang 96 . Vi c chuy n i t chu i sang s không thành công. Không th n p l p yêu c u. Ngo i l v AWT L p cha c a các l p ngo i l I/O Không th nh v t p tin K t thúc m t t p tin. Khi truy c p i t ng null. ví d nh ‘chia cho 0’. i s không h p l . L i truy c p ra ngoài m ng. L p không th truy c p. m lúc nào c ng c th c thi.

s h u m t con tr l nh. ví d H H windows. ví d H H DOS là H H n nhi m. C n phân bi t c gi a ti n trình và ch ng trình. Running: các ch th c a ti n trình ang c x lý. các t p tin. Ti n trình ( process) Ti n trình là m t th hi n c a m t ch ng trình ang x lý.. Các tr ng thái c a ti n trình Tr ng thái c a m t ti n trình t i m t th i m c xác nh b i ho t ng hi n th i c a ti n trình ó. các ti u trình chia s CPU v i nhau gi ng nh cách chia s gi a các ti n trình. b nh . hay nói cách khác ti n trình ang s h u CPU 3.Ch ng 4: L P TRÌNH A TUY N I. hoàn thành tác v c a mình. 3. các ti u trình bên trong cùng m t ti n trình chia s nhau không gian a ch chung. m t t p các thanh ghi và m t vùng nh stack riêng. tuy nhiên m t ti u trình ch có th thu c v m t ti n trình. Linux là các H H a nhi m Ø H a nhi m u tiên: các ti n trình c c p phát th i gian s d ng CPU theo m c u tiên khác nhau Ø H a nhi m không u tiên: các ti n trình không có m c u tiên nào c . nên không th có nhi u ti n trình ch y t i m t th i m. Ø H a nhi m cho phép nhi u ti n trình ch y t i m t th i m. Ti u trình ( thread ) M t ti u trình là m t n v x lý c b n trong h th ng. 4. H u hành n nhi m. Blocked: ti n trình ang ch c c p tài nguyên. M t ti u trình c ng có th có các tr ng thái gi ng n các tr ng thái c a m t ti n trình. m t ti n trình còn c n n m t s tài nguyên khác nh : CPU. T o m i: ti n trình ang c thành l p 2. Trong quá trình s ng m t ti n trình thay i tr ng thái do nhi u nguyên nhân nh : h t th i gian s d ng CPU. i u này có ngh a là các ti u trình có th chia s nhau các bi n toàn c c c a ti n trình. hay ch m t s ki n nào ó x y ra 4. M t ti n trình s h u nhi u ti u trình. Nên thông th ng s a ch ng ch là gi l p. khi cho th c thi ch th này thì ch ng trình s bi n thành ti n trình Có th nói tóm t t ti n trình là m t ch ng trình ch y trên h u hành và c qu n lý thông qua m t s hi u g i là th 2. K t thúc: ti n trình ã hoàn t t vi c x lý Trang 97 . chúng “t giác” nh quy n ki m soát CPUsau khi k t thúc ph n công vi c Chú ý: trong th c t m i máy th ng ch có 1 CPU. và i u ph i CPU qua l i gi a các ti n trình. S h u m t con tr l nh. M t ch ng trình là m t th hi n th ng. M i ti u trình x lý tu n t các n code c a nó. các thi t b ngo i vi. hay i m t thao tác nh p/xu t hoàn t t… T i m t th i m m t ti n trình có th nh n m t trong các tr ng thái sau ây: 1. a nhi m Ø H n nhi m là H H ch cho phép 1 ti n trình ch y t i m t th i m. t p các thanh ghi và các bi n. Ready: ti n trình ang ch c p CPU x lý 5. ch a các ch th u khi n máy tính th c hi n m c ích gì ó. Các ki n th c liên quan 1. ph i ch m t s ki n nào ó x y ra. Unix. Chúng c gi l p b ng cách l u tr nhi u ti n trình trong b nh t i m t th i i m.

M t ng d ng có th bao g m nhi u lu ng. nh ng A không nh n c. nh v y B ã tr A 300$. t t c các ti n trình trong t p h p u b khoá v nh vi n!. nó c p nh t l i trong tài kho n là 400$. chúng c th c thi ng th i v i các lu ng khác. II. c ng nh gi i phóng tài nguyên cho các ti n trình khác s d ng. Mi n g ng ( Critical Section ) a) V n tranh ch p tài nguyên Ta xét tình hu ng sau: Ø gi s A có 500$ trong tài kho n ngân hàng Ø A quy t nh rút ra 100$ t tài kho n ngân hàng. nh v y không có ti n trình nào có th ti p t c x lý. m i ti n trình trong t p h p u u ch i m t s tài nguyên ang b n m gi b i các ti n trình khác.Míi t¹o KÕt thóc Ready Running Blocked S¬ ®å chuyÓn tr¹ng th¸i cña mét tiÕn tr×nh 5. do v y B c p nh t vào trong tài kho n c a A là 800$ ( =500$ +300$). L p trình a tuy n trong Java V i Java ta có th xây d ng các ch ong trình a lu ng. M i lu ng c gán m t công vi c c th . Khoá ch t (deadlock) M t t p các ti n trình c nh ngh a là trong tình tr ng khoá ch t n u nh . Có hai cách t o ra lu ng Cách 1: T o ra m t l p k th a t l p Thread và ghi è ph ng th c run c a l p Thread nh sau: class MyThread extends Thread{ public void run(){ //Mã l nh c a tuy n } Trang 98 . B tr A 300$. sau ó A ti p t c công vi c 2. b) Mi n g ng (Critical Section) o n ch ng trình trong ó có th x y ra các mâu thu n truy xu t trên tài nguyên d ng chung c g i là mi n g ng ( Critical Section ) 6. thao tác c a A g m 2 b c: 1) l y ra 100$ 1 50 2) gi m s tài kho n i 100$ A 500 Ø Tình hu ng gi a 2 thao tác 1 và 2 500$ 2.

b n ph i ghi è ph ng th c này th c thi nhi m v c a tuy n. chú ý sleep() là ph ng th c t nh. gián n và ng ng tuy n. Ø public void interrupt() làm gián o n tuy n thi hành Ø public static boolean isInterrupt() ki m tra xem tuy n có b ng t không Ø public void setpriority( int p) n nh u tiên cho tuy n thi hành. khi start() c g i thì ph ng th c run() c ng c kích ho t Ø public void stop() có ch c n ng ng ng tuy n thi hành. do v y có th nguy c d n n deadlock ( khoá ch t ). u tiên c xác nh là m t s nguyên thu c o n [1. do v y b n nên dùng ph ng th c notify () thay vì s d ng ph ng th c resume() Ø public static void sleep( long millis) Threadows InterruptedException t tuy n thi hành vào tr ng thái ng . ghi è ph class MyThread implements Runnable{ public void run(){ //Mã l nh c a tuy n } } ng th c run 1. b n nên dùng ph ng th c wait(). ph ng th c này không an toàn. b i vì ph ng th c này không nh tài nguyên mà nó l m gi . thông th ng ph ng th c này c dùng k t h p v i ph ng th c suspend(). b n nên gán null vào bi n Thread d ng tuy n.} Cách 2: T o ra m t l p tri n khai t giao di n Runnable. ti p t c. k t java 2 ph ng th c này cùn v i ph ng th c suspend()b t ch i. ph ng th c này ít c s d ng. ph ng th c start() c g i. trong java 2. b i vì ph ng th c run()c a l p Thread ch là ph ng th c r ng Ø public void start() khi ta t o ra tuy n nó ch a th c s ch y cho n khi. trong kho ng th i gian xác nh b ng mili giây.10] Ø public final void wait() throws InterruptException Trang 99 . L p Thread L p Thread ch a ph ng th c t o d ng Thread() c ng nh nhi u ph ng th c h u ích có ch c n ng ch y. t m ng ng. kh i ng. t o ra và ch y m t tuy n ta c n làm 2 b c: Ø M r ng l p Thread và Ghi è ph ng th c run() Ø G i ph ng th c start() b t u th c thi tuy n L p Thread không có nhi u ph ng th c l m. n u tuy n ang thi hành thì ph ng th c này b b qua. t m ng ng tuy n thay vì s d ng ph ng th c suspend() Ø public void resume() Ti p t c v n hành tuy n n u nh nó ang b ng ng. chúng ch có m t vài ph ng th c h u d ng c li t kê sau: Ø public void run() c java g i th c thi tuy n thi hành. thay vì s d ng ph ng th c stop() Ø public void suspend() Có ch c n ng t m ng ng tuy n.

trên i t ng này public final void notifyAll() ánh th c t t c các tuy n ang ch trên i t ng này isAlive() Tr v True. i++ ) System. n u lu ng là v n còn t n t i (s ng) getPriority() Tr v m c u tiên c a lu ng join() i cho n khi lu ng k t thúc isDaemon() Ki m tra n u lu ng là lu ng m t lu ng ch y ng m (deamon) setDeamon(boolean on) ánh d u lu ng nh là lu ng ch y ng m Ví d : Ta t o ra 2 tuy n thi hành song song. i <= 200. i h c s ph m k thu t H ng Yên i h c s ph m k thu t H ng Yên chào m ng b n n v i java i h c s ph m k thu t H ng Yên chào m ng b n n v i java i h c s ph m k thu t H ng Yên chào m ng b n n v i java chào m ng b n n v i java …………. cho n khi có m t tuy n khác thông báo thì nó l i ti p t c. trong khi tuy n này ang th c thi thì có m t tuy n khác v n ti p t c in 200 dòng ch “chào m ng b n n v i java” public class Hello{ public static void main ( String[] args ){ new ChaoDH ().println ( " i h c s ph m k thu t H ng Yên" ).Ø Ø Ø Ø Ø Ø Ø t tuy n vào tr ng thái ch m t tuy n khác.out. i <= 200. Trang 100 . new ChaoJV (). ây là ph ng th c c a l p c s Object public final void notify () ánh th c tuy n ang ch . m t tuy n th c hi n vi c in 200 dòng “ i h c s ph m k thu t H ng Yên”.. } } class ChaoJV extends Thread{ public void run (){ for ( int i = 1.start (). i++ ) System. } } class ChaoDH extends Thread{ public void run (){ for ( int i = 1..println ( "chào m ng b n n v i java" )..out.start (). } } khi ta ch y ch ng trình th y k t qu xen k nhau nh ……………….

Ch c b n s t h i.2. Giao di n Runnable m c tr c b n ã t o ra các lu ng th c hi n song song v i nhau. Trong Java có hai lo i lu ng: .start (). Nó là m t lu ng có quy n u tiên th p. mà ta tri n khai giao di n Runnable public class Hello{ public static void main ( String[] args ){ Thread t = new Thread ( new ChaoDH () ).Lu ng ch y ng m (deamon) Ng i s d ng t o ra các lu ng ng i s d ng. Máy o Java th c hi n ti n trình thoát. trong java ta còn có th t o ra các tuy n thi hành song song b ng cách tri n khai giao di n Runnable. Máy o Java có ít nh t m t lu ng deamon là lu ng “garbage collection” (thu m tài nguyên d n rác). thì b n không th k th a t l p Thread n a. Lu ng d n rác th c thi ch khi h th ng không có tác v nào. t1. Ta vi t l i ví d trên. khi ó ch còn duy nh t lu ng deamon v n còn s ng. l i v a mu n a tuy n thì b n b t bu c ph i dùng giao di n Runnable. ch ng h n nh b n vi t các Applet.Lu ng ng i s d ng . b n v a mu n nó là Applet.public void setDaemon(boolean on) . câu tr l i ch . t. trong khi các lu ng deamon là các lu ng ch y n n.public boolean isDaemon() 4. Vòng i c a Thread Hình sau th hi n tr ng thái c a tuy n trong vòng i c a chúng 3. java không h tr k th a b i. L p lu ng có hai ph ng th c làm vi c v i lu ng deamon: . n u ch ng trình c a b n v a mu n k th a t m t l p nào ó. Thread t1 = new Thread ( new ChaoJV () ).start (). } Trang 101 . Lu ng deamon cung c p các d ch v cho các lu ng khác. chúng khác gì nhau?. nh ng l n này ta không k th a l p Thread. ã có l p Thread r i t i sao l i còn có giao di n Runnable n a. l i v a mu n th c thi nhi u tuy n. thì b n v a ph i k th a t l p Applet. Lu ng ch y ng m (deamon) M t ch ng trình Java k t thúc ch sau khi t t c các lu ng th c thi xong. nh ng n u ã k th a t l p Applet r i.

u tiên c a m t tuy n bi u th b i m t s nguyên n m trong n t 1 n 10.”ThisThread”). th t n gi n. i u này là ti n l i khi ta mu n qu n lý nhi u tuy n th c hi n các tác v t ng t nhau. Thi t l p u tiên cho tuy n Khi m t tuy n c t o ra. i++ ) { System.println(" i h c s ph m k thu t H ng Yên"). l n h n u tiên c a tuy n t Chú ý: 1.setPriority(10). Ø t o m t nhóm tuy n ta c n: + t o ra m t nhóm tuy n b ng cách s d ng ph ng th c t o d ng c a l p ThreadGroup() ThreadGroup g=new ThreadGroup(“ThreadGroupName”). ThreadGroup g= new ThreadGroup(ParentThreadGroup. 2) n u m t tuy n không c t u tiên thì nó s nh n u tiên m c nh ( b ng 5 ). new ThreadClass(). Ta vi t l i ví d trên nh sau: Thêm vào ph ng th c main() 2 dòng l nh: t. for ( int i = 1. lý do là ta ã t u tiên c a tuy n t1. // Tuy n này có u tiên là 1 Ch y l i ch ng trình này sau khi s a và tr c khi s a ta th y tuy n t1 c c p th i gian s d ng CPU nhi u h n tuy n t. …) thì t t c các tuy n trong nhóm u nh n c cùng tác ng ó.out.out.println ( "chào m ng b n n v i java" ). } } } Cho ch y ví d này ta th y k t qu ra không khác gì v i ví d tr c. m t l i s phát sinh n u ta gán cho nó u tiên. n m ngoài kho ng này 2. ôi khi ta mu n u ch nh u tiên c a tuy n t c m c ích c a ta.“ThreadGroupName”). i <= 200.setPriority(1). 5.Nhóm tuy n là m t t p h p g m nhi u tuy n. //Tuy n này có u tiên là 1 t1. } } } class ChaoJV implements Runnable{ public void run (){ for ( int i = 1. i++ ) { System. Nhóm tuy n (Thread Group) . Dòng l nh trên t o ra m t nhóm tuy n g có tên là “ThreadGroupName”. khi ta tác ng n nhóm tuy n ( ch ng h n nh t m ng ng. i <= 200. ta có th ki m tra u này b ng cách g i ph ng th c getPriority() 6. + a các tuy n vào nhóm tuy n dùng ph ng th c t o d ng c a l p Thread() : Thread =new Thread (g. Trang 102 . tên c a tuy n là m t chu i và không trùng v i tên c a m t nhóm khác.} class ChaoDH implements Runnable{ public void run (){ ChaoDH thu = new ChaoDH (). nó nh n m t u tiên m c nh. t u tiên cho m t tuy n ta ch c n g i ph ng th c setPriority() và truy n cho nó m t s nguyên s này chính là u tiên mà b n c n t.

t khoá này c thêm vào nh ngh a c a ph ng th c báo cho java bi t ây là m t ph ng th c ng b . Các lu ng khác c báo ch i monitor. M t “monitor” là m t i t ng mà c khóa c quy n. và r i thì m i cho phép các lu ng k ti p th c thi. khi ó tài nguyên dùng chung có th b h ng. b qu n lý khoá này ch cho 1 ph ng th c synchronized c a i t ng ó ch y t i m t th i m M u ch t c a s ng b hóa là khái ni m “monitor” (giám sát). cho n khi lu ng u tiên thoát kh i monitor. Trong nh ng tr ng h p này. d li u có th b sai. b n c n cho phép m t lu ng hoàn thành tr n v n tác v c a nó. t t c các thao tác có th d n n h ng hóc u th c hi n qua ph ng th c.ng b các tuy n thi hành Khi nhi u tuy n truy c p ng th i vào tài nguyên dùng chung. Trang 103 . Khi hai ho c nhi u h n m t lu ng c n thâm nh p n m t tài nguyên c chia s . B i trong java không có bi n toàn c c. Ch m t lu ng có th có monitor t i m i th i m. T t c các lu ng khác c g ng thâm nh p vào monitor s b trì hoãn. trong khi lu ng khác c g ng thay i d li u. cho nhi u tuy n. m i i t ng s có m t b qu n lý khoá. mà tài nguyên này l i không th chia s . m t lu ng có th c g ng c d li u. Ví d . M t lu ng có th monitor m t i t ng nhi u l n. hay còn g i “semaphore” (c hi u). b n c n ch c ch n r ng tài nguyên ós c s d ng ch b i m t lu ng t i m t th i i m. 7. Trong tr ng h p này. chúng ta ch có thu c tính c a i t ng. do v y java cung c p t khoá synchronized.

dù d li u c l u tr i hình th c nào. ngu n thông tin ngoài không ch g m d li u c l u tr trên a t . ho c có th là c l u tr trên m ng… dù chúng c l u tr âu chúng c ng ch có 1 s d ng nh : i ng. nó ng nh t m i ngu n d li u v i nhau: nh n v các thông tin. hình nh ho c âm thanh. b nh . a CD mà nó có th là d li u c a m t ch ng trình khác. d i d ng th c nh th nào. Socket) và c các thông tin tu n t . có th l u tr lâu dài chúng ta ph i l u tr và nh n l i d li u t thi t b l u tr ngoài. m t ch ng trình m m t lu ng liên k t v i i t ng ngu n( t p tin. thì thu t toán c/ghi tu n t u t a nh sau: c c vào t âu ho c ghi Trang 104 . ng t ghi thông tin ra các thi t b ngoài b ng cách m m t lu ng n i t ng ích và ghi thông tin ra m t cách tu n t nh Lu ng là s tr u t ng hoá m c cao. do v y b t k d li u ra âu.Ch ng 5: NH P XU T (Input/Output) M t ch ng trình th ng xuyên làm vi c v i d li u. u này là r t tinh vi nó làm cho ta không c n ph i quan tâm d li u c l u tr âu. kí t . l u tr âu thì java u tr u t ng hoá thành các lu ng.

Lu ng h ng byte có th c ghi 1 byte. x lý m i lo i d li u. hai l p InputStream và OutputStream là hai l p c s tr u t ng cho các lu ng h ng byte. L p lu ng Java a ra nhi u l p lu ng. hai l p này cung c p t giao di n chung cho t t c các l p c/ ghi h ng kí t . L p nh p. java chia lu ng ra thanh 2 lo i: lu ng byte ( byte stream) và lu ng kí t (character stream). l p InputStream và OutputStream là hai l p c s cho m i lu ng nh p xu t h ng byte. và l p Reader/ Writer là hai l p c s cho vi c c ghi h ng kí t .2. ta ph i s d ng lu ng h ng byte.I. m i l n c/ ghi ra lu ng là c 2 byte t ng ng v i m t kí t unicode. p RandomAccessFile k th a t l p Object và tri n khai giao di n. m i lân c/ ghi ra lu ng là c/ ghi 8 bit d li u ra lu ng. xu t h ng kí t Reader và Writer là hai l p c s tr u t ng cho lu ng h ng kí t . Sau ay là mô hình phân c p các l p c/ ghi ng kí t 1. 1. ây là l p duy nh t h tr c c l n ghi. InputStream và OutputStream. Hình sau th hi n m i quan h phân c p gi a l p c/ ghi h ng byte Trang 105 .1.

ví d l p Reader có các ph ng th c sau giúp cho vi c c m t kí t ho c t m ng các kí t int read() int read(char cbuf[]) int read(char cbuf[]. ví d l p Writer nh ngh a các ph ng th c ghi m t kí t . int offset.t ng t gi a hai lu ng h ng byte và h ng kí t p Reader và InputStream có m t giao di n gi ng nhau. int offset. m t m ng các kí t ra lu ng int write(int c) int write(char cbuf[]) int write(char cbuf[]. int length) Thì trong l p InputStream c ng có các ph ng th c v i tên t ng t cho vi c c t byte ho c m t m ng các byte int read() int read(byte cbuf[]) int read(byte cbuf[]. int offset. int length) C ng t ng t v y l p Writer và OutputStream c ng có m t giao di n t ng t nhau. chúng ch khác nhau v ki u d li u c vào. FileReader và FileWriter cho vi c c ghi h ng kí t . Trang 106 . ta s d ng các lu ng liên quan n t p tin nh FileInputStream và FileOutputStream cho vi c c ghi t p h ng byte. thông th ng mu n s d ng lu ng t p tin ta s ng hàm t o c a các l p t ng ng liên k t lu ng v i m t t p tin c th . m t ng byte ra lu ng int write(int c) int write(byte cbuf[]) int write(byte cbuf[]. int length) Thì l p OutputStream c ng có các ph ng th c t ng ng. ghi m t byte. int offset. int length) lý t p tin x lý t p tin ngo i trú.

close().io.read())! = -1) out.close().txt"). // Ch ng trình copy s d ng lu ng h ng byte public class CopyBytes { public static void main(String[] args) throws IOException { File inputFile = new File("farrago.io.*.public void FileInputStream ( String FileName) public void FileInputStream ( File file) public void FileOutputStream ( String FileName) public void FileOutputStream (File file) public void FileWriter ( String FileName) public void FileWriter (File file) public void FileReader ( String FileName) public void FileReader (File file) Ví d : Vi t ch ng trình file copy. out. // ch ng trình copy s d ng lu ng h ng kí t public class CopyCharacter { public static void main(String[] args) throws IOException { File inputFile = new File("C:/in. while ((c = in.txt"). FileOutputStream out = new FileOutputStream(outputFile). out. Trang 107 . while ((c = in.write(c).*. int c. int len) Ghi m t m ng byte ra lu ng Ghi m t m ng byte ra lu ng k t v trí off.close(). ta s d ng lu ng DataInputStream và DataOutputStream. FileInputStream in = new FileInputStream(inputFile).read())! = -1) out. int off. } } import java. ta s vi t ch d ng c 2 lu ng h ng byte và h ng kí t import java. l p DataInputStream tri n khai giao di n DataInput.write(c). int c. File outputFile = new File("outagain. } } ng trình này Lu ng d li u c/ ghi các ki u d li u nguyên thu . in.txt"). FileWriter out = new FileWriter(outputFile). th c hi n vi c copy m t t p. còn l p DataOutputStream tri n khai giao di n DataOuput Các ph ng th c sau c nh ngh a trong giao di n DataOutput void write(byte[] b) void write(byte[] b. in. File outputFile = new File("C:/out.close(). FileReader in = new FileReader(inputFile).txt").

.65535 c m t xâu kí t Unicode qua n byte t lu ng c Sau ây là m t ví d nh v lu ng nh p xu t d li u.*.255 c m t s nguyên không d u trong n t 0. ví d này ghi d li u ra t p r i l i lai: import java.io. // ghi s long Trang 108 .txt")).writeLong(123456789).void write(int b) void writeBoolean(boolean v) void writeByte(int v) void writeBytes(String s) void writeChar(int v) void writeChars(String s) void writeDouble(double v) void writeFloat(float v) void writeInt(int v) void writeLong(long v) void writeShort(int v) void writeUTF(String str) Các ph ng th c sau c boolean readBoolean() byte readByte() char readChar() double readDouble() float readFloat() void readFully(byte[] b) voidreadFully(byte[] b. int len) int readInt() String readLine() long readLong() short readShort() int readUnsignedByte() in treadUnsignedShort() String readUTF() int skipBytes(int n) len byte Ghi m t byte ra lu ng Ghi m t giá tr logic ra lu ng Ghi ra lu ng ph n th p c a v Ghi m t xâu ra lu ng Ghi m t kí t ra lu ng Ghi m t xâu kí t ra lu ng Ghi m t s double ra lu ng Ghi m t s th c ra lu ng Ghi m t s nguyên ra lu ng Ghi m t s long ra lu ng Ghi m t s short ra lu ng Chi m t xâu kí t Unicode ra lu ng nh ngh a trong giao di n DataInput: c m t giá tr logic t lu ng c m t byte t lu ng c m t kí t t lu ng c m t s double t lu ng c m t s float t lu ng c m t m ng byte t lu ng và ghi vào ng c len byte t lu ng và ghi vào m ng v trí off c m t s nguyên c m t xâu kí t cho n khi g p kí t xu ng dòng và b qua kí t xu ng dòng c m t s long c m t s short c m t s nguyên không d u trong kho ng 0. // ghi s nguyên out.writeInt(10). out. int off.. public class DataIODemo { public static void main(String[] args) throws IOException { // write the data out DataOutputStream out = new DataOutputStream(new FileOutputStream( c:/TestIO.

out.3. try { System.close(). // c l i s th c chính xác n System.println("Gia tri double " + in.out. u xu t ra d li u d ng asciii. L p PrintStream và PrintWriter s giúp ta làm vi c này.println("Gia tri nguyen " + in. // c l i s nguyên System.456789).} in. ho c các ch ng trình so n th o asciii xem c.readDouble()). trong java có th s d ng lu ng in n xu t d li u ra d i d ng asciii. Lu ng in n Vì các lu ng xu t ghi d li u ra d i d ng nh phân do v y b n không th dùng l nh type.writeBoolean(true).writeDouble(123.out. } } 1. Hai l p này th c hi n ch c n ng nh nhau.readFloat()). // ghi m t xâu out.readInt()). // ghi s th c chính xác n out.out. // ghi s th c chính xác kép out.readUTF()).readLong()).readBoolean()).close(). // c l i giá tr logic System.txt")). // read it in again DataInputStream in = new DataInputStream(new FileInputStream("c:/TestIO.out.writeUTF("Day la mot xau ki tu").writeFloat(123.println("Gia tri boolean " + in. // ghi giá tr logic out.out.println("Gia tri xau " + in.println("loi").out. // c l i m t xâu unicode } catch (EOFException e) { System.println("Gia tri long " + in.456789f). // c l i s nguyên dài System.println("Gia tri float " + in.out. t s ph ng th c c a l p PrintStream: boolean checkError() n h t d li u ra và ki m tra l i lu ng void close() void flush() void print(boolean b) void print(char c) void print(char[] s) void print(double d) void print(float f) void print(int i) void print(long l) void print(Object obj) void print(String s) void println() void println(boolean x) void println(char x) óng lu ng n d li u trong vùng ghi giá tr logic ra lu ng ghi kí t ghi m t mange kí t ghi m t s th c ghi m t s th c ghi m t s nguyên ghi m t s nguyên dài ghi m t it ng ghi m t xâu o ra m t dòng tr ng ghi giá tr logic ra lu ng và xu ng dòng ghi kí t và xu ng dòng Trang 109 chính xác kép m ra .// c l i s th c chính xác kép System.

int off.void println(char[] x) void println(double x) void println(float x) void println(int x) void println(long x) void println(Object x) void println(String x) protected void setError() void write(byte[] buf. int len) ghi m t mange kí t và xu ng dòng ghi m t s th c chính xác kép và xu ng dòng ghi m t s th c và xu ng dòng ghi m t s nguyên và xu ng dòng ghi m t s nguyên dài và xu ng dòng ghi m t it ng và xu ng dòng ghi m t xâu và xu ng dòng t tr ng thái l i c a lu ng là true ghi m ng byte t v trí off len kí byte ra lu ng void write(int b) ghi m t byte ra lu ng Hàm t o c a l p PrintStream: PrintStream(OutputStream out) t o ra m t lu ng m i PrintStream(OutputStream out. boolean autoFlush) t o ra m t lu ng m i v i ch c n ng AutoFlush ( t d n) t s ph ng th c c a l p PrintWriter boolean checkError() void close() void flush() void print(boolean b) void print(char c) void print(char[] s) void print(double d) void print(float f) void print(int i) void print(long l) void print(Object obj) void print(String s) void println() void println(boolean x) void println(char x) void println(char[] x) void println(double x) void println(float x) void println(int x) n h t d li u ra và ki m tra l i lu ng óng lu ng n d li u trong vùng ghi giá tr logic ra lu ng ghi kí t ghi m t mange kí t ghi m t s th c ghi m t s th c ghi m t s nguyên ghi m t s nguyên dài ghi m t it ng ghi m t xâu o ra m t dòng tr ng ghi giá tr logic ra lu ng và xu ng dòng ghi kí t và xu ng dòng ghi m t mange kí t và xu ng dòng ghi m t s th c chính xác kép và xu ng dòng ghi m t s th c và xu ng dòng ghi m t s nguyên và xu ng dòng Trang 110 chính xác kép m ra .

do v y chúng ta c n ph i có m t k thu t nào ó t ng t c c/ghi. v i vùng m ta s gi m c s l n c ghi lu ng. out.txt")). public class DataIODemo1 { public static void main(String[] args) throws IOException { // write the data out PrintWriter out = new PrintWriter(new FileOutputStream("c:/a.io. thông th ng b n s i các lu ng c a b n vào lu ng m. } } 1. int off.*. boolean autoFlush) t o ra m t PrintWriter v i ch c n ng t d n t t i t ng Writer Sau ây là m t ví d v lu ng in n. Trang 111 . trong java ta có th o ra vùng m v i các l p BufferInputStream. out. int off.PrintWriter(Writer out. boolean autoFlush) t o ra m t PrintWriter v i ch c n ng d n t m t i t ng OutputStrea.PrintWriter(OutputStream out. out. out.PrintWriter(Writer out) t o ra m t PrintWriter không có ch c n ng t d n t m t i ng Writer .print("xau ki tu"). k thu t ó chính là vùng m.PrintWriter(OutputStream out) t o ra m t PrintWriter không có ch c n ng t d n t m t i t ng OutputStream.close(). int len) Ghi m t xâu len kí t tính t v trí off Các hàm t o c a l p PrintWriter . ví d này in ra m t t p m t s nguyên. BufferOutputStream.println(10). m t s th c và m t xâu kí t .void println(long x) void println(Object x) void println(String x) protected void setError() void write(byte[] buf.2345).println(1. . . BufferWriter.4. m ng th ng lâu h n r t nhi u so các thao tác v i b nh trong. BufferReader. Lu ng m Vì các thao tác v i c ng. int len) void write(int b) void write(int c) void write(String s) ghi m t s nguyên dài và xu ng dòng ghi m t it ng và xu ng dòng ghi m t xâu và xu ng dòng t tr ng thái l i c a lu ng là true ghi m ng byte t v trí off len kí byte ra lu ng ghi m t byte ra lu ng Ghi m t kí t Ghi m t xâu n void write(String s. sau khi ch y ch ng trình b n có th s d ng l nh type c a DOS xem import java.

rf. “rw”) Ch ng trình d i ây minh ho cách dùng l p RandomAccessFile.readInt()). ho c ghi. rf.writeDouble(678. Nó s d ng ph ng pháp seek( ) tìm v trí nh v bên trong t p tin (b t u t 1).68). rw ). import java.public long getFilePointer() tr v v trí con tr t p tính b ng byte. rf. ví d nh b n mu n m t p a. ký t và double t t p tin và hi n th chúng ra màn hình.txt . rf = new RandomAccessFile( abc. int bufferSize) public BufferReader ( Reader in) public BufferReader ( Reader in.Các ph ng th c t o d ng lu ng m: public BufferInputStream( InputStream ) public BufferInputStream (InputStream in.println(rf. import java.io.public final void writeChars(String s) ghi m t xâu kí t ra t p ng t gi ng C/C++ khi b n m m t t p truy c p ng u nhiên b n ph i ch rõ ch làm vi c là c ‘r’.out. System.public void seek(long pos) chuy n con tr n v trí pos tính t v trí u tiên.readChar()).lang. ó là l p RandomAccessFile.System. ch duy nh t có m t l p cho phép ta c ghi ng th i. p này tri n khai giao di n InputData và OutputData. int bufferSize) public BufferWriter ( Writer out) public BufferWriter ( Writer out. chúng không th c ghi ng th i. Nó ghi m t giá tr boolean. System. m t char. m t double t i m t file có tên ‘abc. n byte th hai Trang 112 . int bufferSize) p tin truy c p ng u nhiên t c các lu ng xét trên ch có th c. nên chúng có t t c các ph ng th c a c 2 l p này.io.writeBoolean(true). public class rndexam{ public static void main (String args[ ]) throws IOException { RandomAccessFile rf.public void writeChar(int v) ghi kí t unicode ra t p v i byte cao c ghi tr c . ngoài ra chúng còn có các ph ng th c sau: . hay ghi ‘w’ hay c ghi ng th i ‘rw’.IOException. import java. //S d ng ph ng th c seek() di chuy n con tr rf.println(rf.readDouble()). int bufferSize) public BufferOutputStream ( OutputStream out) public BufferOutputStream ( OutputStream out.out.writeInt(67868).out. k ta u t p . Sau ó nó c giá tr s nguyên. chú ý v trí u tiên tính t 0 .writeChars( ). System.seek(1). rf.RandomAccessFile.txt”.public long length() tr v dài c a t p .txt theo ch c ghi ng th i thì b n dùng cú pháp RandomAccessFile =new RandomAccessFile(“C:/ a.txt’. m t int.println(rf.

out.separator + “book” + File. x lý các n i dung c a các t p thì s d ng các l p FileInputStream. public static final char pathSeparatorChar public static final String pathSeparator nh ngh a các ký hi u ho c các xâu s d ng ng n cách các t p ho c tên th m c trong danh sách c a các ng d n. File(String pathName) Gán ng d n có tên pathName cho i t ng c a l p File. pathName có th là ng d n tuy t i (có c tên a. M t ng d ng có th s d ng các ch c n ng chính c a File x lý t p ho c các th m c (directory) trong h th ng t p. ‘. ‘\’ c s d ng ng n cách các cc a ng d n trong Window. Ví d : C:\book. Ký hi u ‘/’ ng n cách cho Unix. rf. } } t qu xu t ra c a ch ng trình: II. D:\Anh\ABC. Ví d : C:\book\Java là tên ng d n trong Window.separator + “chuong1”). File(File direct. p File nh ngh a các thu c tính ph thu c vào môi tr ng (platform) c s d ng x lý p và tên g i các ng d n trong các th m c m t cách c l p v i môi tr ng.rf. String filename) Trang 113 . Ký hi u ng n cách ‘:’ cho Unix. System.println(rf.close(). L p File p File cung c p giao di n chung x lý h th ng t p c l p v i môi tr ng c a các máy tính. C:\Java.readBoolean)).’ c s d ng phân cách các ng d n trong Window.seek(0). public static final char separatorChar public static final String separator nh ngh a các ký hi u ho c các xâu s d ng ng n cách các thành ph n trong tên a ng d n. FileOutputStream và RandomAccessFile. A:\Docs là danh sách các ng d n trong Window. Ví d : File ch1 = new File(File. tên c a t t c các m c l n l t theo cây th c) ho c ng d n t ng i (b t u t th m c hi n th i).

cho k t qu true chúng ng nh t v i nhau. Ví d : File mucNhap = new File(“book” + File. ng c l i tên ng d n s là i ng direct ghép v i separator và filename. “chuong1”). boolean delete() Hàm này xoá t p hi n th i. p File cung c p các hàm nh n c các bi u di n ph thu c vào môi tr ng c a ng d n và các thành ph n c a ng d n. if (args. File ch2 = new File(mucNhap.1 Vi t ch ng trình c và hi n th các t p trong m t th m c.length==0){ u Trang 114 . N u direct là null thì filename c x lý th m c hi n th i. long length() Hàm này cho l i kích th c c a t p tính theo byte. String getPath() Hàm getPath() cho l i tên c a ng d n (tuy t i ho c t ng i) ch a t p ch nh.Gán t p có tên filename th m c direct cho i t ng c a l p File. boolean exists() boolean isFile() Hai hàm này cho k t qu true n u t p ó t n t i trên ng d n hi n th i. public class DirectoryLister{ public static void main(String args[]){ File entry. boolean mkdir() boolean mkdirs() T o ra các ng d n c xác nh trong i t ng c a File. boolean isDirectory() Hàm này cho k t qu true n u th m c ó t n t i trên a hi n th i.separator + “duThao”). Ví d 8. boolean createNewFile() throws IOException M t t p m i là r ng c t o ra th m c hi n th i ch khi t p này ch a có. import java. String getAbsolutePath() Hàm getAbsolutePath() cho l i tên c a ng d n tuy t i ch a t p ch nh. Ví d . boolean renameTo(File dest) Hàm này i tên t p hi n th i thành dest. String[] list() Hàm này hi n th danh sách các t p th m c hi n th i. tên c a “C:\java\bin\javac” là “javac”.*. p File có th s d ng truy v n vào các h th ng t p bi t c các thông tin v t p và các th m c. boolean equals(Object obj) Hàm này so sánh tên các ng d n c a các i t ng t p.io. long lastModified() Hàm này cho l i th i gian d ng s long c a l n s a i t p l n cu i cùng. String getName() Hàm getName() cho l i tên c a t p trong th m c ch nh.

getName() +"not found. public class InputOutput { public static void main(String srgs[]) throws IOException { BufferedReader kInput=new BufferedReader(new InputStreamReader(System. String ten. } } } ch xong có th ch y trong môi tr ng DOS: java DirectoryLister c:\users\lan t c các t p trong danh m c c:\users\lan s t s ví d ng d ng c hi n lên. System."). // G i qui hàm listDirectory() hi n th t ng t p. Trang 115 . fileName[i]).println(entry.getCanonicalPath()). } if (entry.*.*. if (fileName ==null)return. return.exists()) { System. listDirectory(item).nam=kInput.println("Error:" +e).util.out.System. import java.readLine(). do { System.ten=kInput.isFile()){ // N u i s c a ch ng trình là m t t p thì hi n th t p ó System. import java.getPath().println(entry.err.list().length. // T o ra i t ng c a File l y tên t agrs[0] // Hi n th các m c trong danh m c ch nh } public static void listDirectory(File entry) { try { if(!entry.in)).print("Nhap nam sinh:"). } } }catch(IOException e){System.lang. } else if(entry.out.readLine().io.out. listDirectory(entry). i<fileName. Ví d 1:Ví d minh h a vi c nh p d li u t bàn phím package app001. return.out.*.println("Hay cho biet ten duong dan?"). import java.print("Nhap ho va ten:"). } entry = new File(args[0]). for (int i = 0.out. i++){ // T o ra i t ng c a File x lý t ng m c File item = new File(entry.isDirectory()){ // N u i s c a ch ng trình là m t danh m c thì c ra (list()) String[] fileName = entry.nam.

System.*.util. } public static String readString(){ String S=" ". } } Trang 116 .*. } return i.}while ((ten==null)||(nam==null)).out.out.out. } catch (IOException ex){ System. i = new Integer(stok. static private BufferedReader br = new BufferedReader(new InputStreamReader(System. stok = new StringTokenizer(str).parseInt(nam). System.readLine().println("Nam sinh ban vua nhap ="+ns). try{ String str = br. } return d. import java.close().readLine(). d = new Double(stok.println(ex).out.} catch (IOException ex){ System. } } Ví d 2 Xây d ng gói nh p d li u cho riêng mình package app002.in)). try{ S = br.io. try{ String str = br. int ns=Integer.nextToken()). import java.nextToken()).doubleValue().println(ex).readLine().out.intValue(). } catch (IOException ex){ System. } return S. stok = new StringTokenizer(str). public static int readInt(){ int i = 0. kInput.println("Ho ten ban vua nhap ="+ten). } public static double readDouble(){ double d = 0. public class MyInput{ static private StringTokenizer stok.println(ex).

out.Ví d 3 S d ng gói nh p d li u trong ch ng trình Java import app002.readLine(). int i = MyInput. System.close().HienThiNgay().out. while (FileInput.readInt(). System. FileOut. import java. System. public class IOFile { public static void main(String args[]) throws IOException { BufferedReader FileInput=new BufferedReader(new FileReader("C:\\filein.nam="345". double d = MyInput.print("Enter a double: "). } } Ví d 4.parseInt(nam).out. nam = FileInput.println("nam sinh=" + nam). } FileInput.txt"))).*. System.out.println(ten). FileOut. } } Ví d 5: Minh h a s d ng lu ng Trang 117 . Man ng1=new Man(ten.out.lang.ready()==true) //==While (not eof()) { ten = FileInput.close().print("Enter an integer: "). FileOut.print("Enter a String: ").println("\nYou entered d = " + d). import java.MyInput.hienthi(). String SS=MyInput.*.util. System.io.out.*. ng1.*. public class TestInput{ public static void main(String[] args){ System.readLine().out.txt")).out.println("Ho ten=" + ten).ns).readDouble(). String ten=" ". PrintWriter FileOut=new PrintWriter(new BufferedWriter(new FileWriter("C:\\fileout. ng1. Minh h a vi c c. ghi file Text package app001.println(nam). System.readString(). import app001.println("\nYou entered i = " + i). int ns = Integer.println("\nYou entered S = " + SS). import java. long n=0. System.

txt".i++) os.FileInputStream. import java.writeChars("A").length().A[1]=1.i<10. rf.90}. rf.println(rf.readInt()).io. rf.IOException. rf.txt de doc FileInputStream is=new FileInputStream("C:\\abc.io.78).A[3]=7.delete(). public class RandomAaccessFile0 { public static void main(String args[]) throws IOException { RandomAccessFile rf=new RandomAccessFile("c:\\abcd.txt de doc FileOutputStream os=new FileOutputStream("C:\\abc. import java. import java.0.writeInt(A[i]).println(rf.txt").FileOutputStream.txt").A[9]=21.txt //Mo file abc.A[2]=9.".9. //Dong file abc. int A[]=new int[10] .io. A[0]=2. import java.ibyts).//Du lieu trong file System.0.out.8.seek(0).5. Trang 118 .A[4]=8.println("Number of Bytes read are:"+byrd). System. import java. //Lay so byte cua file abc.close().writeBoolean(true).txt byte ibuf[]=new byte[ibyts]. for(int i=0. } } Ví d 6: S d ng file ng u nhiên package welcome.available().out. rf.txt // File f1=new File("c:\\abc.io.i<s.4. // f1.out.6. System.close().i++) rf.A[8]=12. //Khai bao dung bo dem du lieu int byrd=is. import java. is.io.A[7]=5. //Mo file abc.readBoolean()).A[6]=4.read(ibuf.12. int ibyts=is.System."rw"). //Ghi tung byte os. // int a[10]={2.io.lang.out.println("They are:"+new String(ibuf)).write(s.RandomAccessFile.A[5]=3. import java. System. public class FileIOExam0 { public static void main(String args[]) throws IOException {String s="Welcome to File Input Output Stream.println("Input Stream has:" + ibyts+" available bytes").File. for(int i=0.out.IOException.1.package app002.. //Doc ibyts du lieu ra luong System.writeDouble(456. //Xoa file abc.writeInt(2345).txt")..charAt(i)).

println(rf.println(rf.println(rf.out.out.System. System.out. rf. } } Trang 119 .readChar()).readDouble()).i<10. for(int i=0.i++) System.readInt()).close().

các thành ph n giao di n c thay b ng t p h p các thành ph n linh ho t. ng tròn. Khi Java c phát hành. l p qu n lý hi n th có trách nhi m b trí cách th c hi n th các thành ph n bên trong. tuy nhiên các thành ph n trong th vi n Swing không th thay t t c các thành ph n trong th vi n awt. b ng cách s ng tr c ti p mã native c a h n n. Window c s d ng t o ra m t c a s . h p ki m. Container Là m t v t ch a dùng ghép nhóm các thành ph n giao di n khác. ngo i tr các thành ph n là l p con c a l p java. menu. M c dù các thành ph n awt n c h tr trong Java 2 nh ng. các thành ph n ho c t p trung vào th vi n mang tên Abstract Window Toolkit (AWT). hành vi c b n nh t c a t t c các thành ph n giao di n. Font.v. API cho l p trình ho bao g m m t t p r t nhi u l p nh m tr giúp xây d ng các thành ph n giao di n khác nhau nh : c a s . Gi i thi u chung Thi t k API cho l p trình ho c a Java là m t ví d hoàn h o v cách dùng l p. L p này cung c p các thu c tính.v. Thành ph n Swing ít ph thu c vào h n n h n do v y ít g p l i h n và c bi t nó s d ng ít tài nguyên c a h th ng h n các thành ph n trong th vi n awt. v. V i b n phát hành Java 2. JDialog là m t c a s c hi n th d i d ng modal. c l p v i h n n thu c th vi n Swing. Thông th ng ta hay s d ng hai l p con c a nó là JFrame và JDialog.Ch ng 6: L P TRÌNH HO AWT M t kh n ng c a Java là cho phép ta xây d ng các ng d ng có giao di n ho hay còn g i là GUI (Grapthical User Interface).Window ho c Java.v. chính vì v y nó ph thu c r t nhi u vào h n n và nó còn gây l i trên m t s h n n. Color. ô v n b n. Graphics là l p tr u t ng cung c p ng c nh ho v các i t ng ho nh : ng th ng. s th a và giao di n. FontMetrics. M i quan h k th a gi a các thành ph n này c mô t trong hình sau: Componient ây là l p (tr u t ng) cha c a m i l p giao di n ng i dùng. v. Bên c nh ó các thành ph n Swing còn d ng mô hình s lý s ki n c a awt. m nh m . v n không thay i. iv i i h n n. c v tr c ti p lên canvas b ng mã l nh Java. Còn các l p tr giúp khác trong awt nh : Graphics.awt. JPanel là m t v t ch a.nút n. I. Hai v t ch a hay c s d ng nh t la JFrame và JPanel. hình nh… Trang 120 . M i t ch a có m t l p qu n lý hi n th . JAplet là l p cha c a m i l p ng d ng aplet. thành ph n AWT s c ánh x sang m t thành ph n n n c th .Panel v n ph i c v b ng GUI trên n n c th . v. Ph n l n các thành ph n trong th vi n Swing u c tô v tr c ti p trên canvas b ng mã l nh c a Java. TextFeild. Panel. a n ng. JFrame là c a s không l ng bên trong c a s khác. tuy nhiên Sun khuyên b n nên s d ng các thành ph n Swing thay cho các thành ph n awt. Jcomponient Là l p cha c a m i thành ph n Swing ligth weight.awt. l u gi các thành ph n giao di n ng i dùng. Gi i thi u v h th ng ho c a Java 1. Chúng ch thay th m t ph n c a awt nh : Button.

Color l p này bi u di n m t m u s c. Font l p này bi u th cho m t font ho . FontMetrics là m t l p tr u t ng dùng xác nh các thu c tính c a Font. T t c nh ng l p khác c li t kê trong hình d i ây Chú ý: ng pha tr n các thành ph n giao di n swing và awt trong cùng m t ng d ng. Componient Container Panel Applet JApplet Object AWTEvent Font Window Frame JFrame Dialog JDialog FontMetric Color JComponent Các thành ph n khác trong gói javax. a các thành ph n trong th vi n Swing u có ti p u ng là ‘J’.swing ck th a t JComponent Grapthics BorderLayout LayoutManage r FlowLayout GridLayout CardLayout GridBagLayout Ch ng h n nh ng nên t m t JButton vào m t Panel và JPanel. Vi c làm này có th gây l i. m t memu có tên là JMenu.swing. t c các thành ph n ho trong th vi n Swing c nhóm trong gói javax. Ví d m t nút l nh trong th vi n Swing có tên là JButton. Trang 121 ng nên t Button vào .

ph ng th c chung cho các l p con c a nó. height (chi u cao) xác nh kích th c c a m t thành ph n tính theo pixel.tl p c k th a t l p JComponent c th hi n trong hình sau: AbstracButton JComponent JMenuItem JButton JtoggleButton JCheckBoxMen JMenu JRadioMenu JCheckBox JRadioButto JTextComponent JEditorPane JTextField JTextArea JTextPane JPasswordField JLabel JList JTable JOptionPane JCompoBox JScrollBar JSlider JMenuBar JCcollPane JprogressBar JFileChooser JTabbedPane JSplitBar JRootPane JPopupMenu JPane JToolTip JTree JSeparator JToolBar JInternalFrame JColorChooser JtableHeader JLayeredPane 2. int height) và void setSize(Dimension d) t l i kích th c c a thành ph n. Sau ây là m t s ph ng th c c a l p Component : .Point getLocation(): cho l i t a ph n ang xét. .void setSize(int width. (ki u Point) trên cùng bên trái (t a g c) c a thành Trang 122 . . M t s ph ng th c c a l p Component p Component cung c p các thu c tính.Dimension getSize(): cho l i i t ng thu c l p Dimension g m width (chi u r ng).

4.Cho hi n frame: myWindow. chi u r ng c a hình ch nh t. ngh a là có kh n ng kích ho t (enable).setSize(200. . ngh a là không th tr l i c các yêu u c a ng i s d ng. Trang 123 . int y) và void setBounds(Rectangle r): t l i ng biên cho m t thành ph n. 3. trong ó có ph ng th c add() c n p ch ng dùng b sung m t thành ph n vào v t ch a và ph ng th c remove() c ng c n p ch ng g b m t thành ph n ra kh i v t ch a. . Các l p ch a (l p con c a Container) cung c p t t c các ch c n ng xây d ng các giao di n h a ng d ng. ví d “My Frame” : JFrame myWindow= new JFrame(“My Frame”). . . L p Container p Container là l p con c a l p tr u t ng Component.Xây d ng m t c u trúc phân c p các thành ph n b ng cách s d ng hàm myWindow. T o ra Frame p JFrame là l p con c a l p Frame (Frame là l p con c a l p Window) cs ng t o ra nh ng c a s cho các giao di n ng d ng GUI.// a vào m t nút (JButton) có tên “OK” vào frame t l i kích th c cho frame s d ng hàm setSize(): myWindow. 300). int y) và void setLocation(Point p): t l i các t a c ch nh cho m t thành ph n.void setFont(Font f): t l i font ch cho m t thành ph n.void setBounds(int x. Ng c l i.pack().add() b sung thêm JPanel ho c nh ng thành ph n giao di n khác vào Frame: Ví d : myWindow. ch b n chung t o ra m t c a s là: o ra m t frame có tiêu gì ó.void setLocation(int x.. có th tr l i các yêu c u c a ng i s d ng và sinh ra các s ki n nh mong mu n.setVisible(true). n u là false thì thành ph n t ng ng s không kích ho t c.getContentPane(). . .Gói khung frame ó l i b ng hàm pack(): myWindow. .void setBackground(Color c): t màu n n cho thành ph n h a. . . Các tham s c a hai hàm này là i t ng c a l p Color s c gi i thi u ph n sau.void setForeground(Color c): c s d ng t màu v cho thành ph n h a .Rectangle getBounds(): cho l i ng biên là hình ch nh t Rectangle bao g m t a c và chi u dài.add(new JButton(“OK”)).getContentPane().Font getFont(): c s d ng bi t c font c a các ch ang x lý trong thành ph n h a.void setEnabled(boolean b): u i s b c a hàm getEnabled() là true thì thành ph n ang xét ho t ng bình th ng.void setVisible(boolean b): t thành ph n h a có th c hi n th lên màn hình (nhìn th y c) ho c b che gi u tùy thu c vào i s c a hàm setVisible() là true hay false.// t l i khung frame là 200 ( 300 .L u ý: T t c các thành ph n giao di n khi kh i t o u c kích ho t .

south (nam).II. Object constraints) Cmponent add(Component comp. JCheckbox. Các thành ph n giao di n sau khi ã c t o ra thì ph i c a vào m t ph n t ch a nào ó. ng sau cung c p b n l p qu n lý layout (cách b trí và s p x p) các thành ph n GUI. null Các thành ph n bên trong v t ch a không th c c a v t ch a thay i. Java có các l p m nhi m nh ng công vi c trên và qu n lý các thành ph n giao di n GUI bên trong các v t ch a. M i thành ph n giao di n ch a trong t ô. Cách s p x p này là m c nh i v i l p Window. Object constraints. Jframe. Các thành ph n giao di n (ít h n 5) c t vào các v trí theo các ng: north (b c). Cách s p x p này là m c nh i v i Panel. Dialog và JDialog. sao cho ti n l i nh t i v i ng i s d ng. v. c s p l i khi kích Các ph ng pháp thi t t layout l y v layout hay t l i layout cho v t ch a. Các thành ph n giao di n c s p x p trong các ô l i hình ch nh t l n l t theo hàng t trái qua ph i và theo c t t trên xu ng i trong m t ph n t ch a.v.Applet và JApplet. sau ó theo c t t trên xu ng d i. chúng ta có th s d ng hai ph ng th c c a l p Container: LayoutManager getLayout(). east ( ông) và center (trung tâm)). Ng c l i. khi c n lo i ra kh i ph n t ch a m t thành ph n giao di n thì s d ng các hàm sau: void remove(int index) Trang 124 . JPanel . void setLayout(LayoutManager mgr). GridLayout BorderLayout GridBagLayout Cho phép t các thành ph n giao di n vào l i hình ch nh t. i s constraints xác nh các h ng a comp vào ph n t ch a. int index) Cmponent add(Component comp. i s index c s d ng ch ra v trí c a ô c n t thành ph n giao di n comp vào. Tên l p FlowLayout Mô t X p các thành ph n giao di n tr c tiên theo hàng t trái qua ph i. Frame. Trình qu n lý hi n th trong Java Khi thi t k giao di n h a cho m t ng d ng. chúng ta ph i quan tâm n kích th c và cách b trí (layout) các thành ph n giao di n nh : JButton. nh ng m t thành ph n có th chi m nhi u nhi u h n m t ô. Component add(Component comp) Component add(Component comp. JTextField. Hàm add() c a l p Container c n p ch ng th c hi n nhi m v a các thành ph n vào ph n t ch a. int index) Trong ó. west (tây).

M t trong hai i s rows ho c columns có th là 0.void remove(Component comp) void removeAll() 1.util. Tr ng h p m c nh thì kho ng cách gi a các hàng.0) là t o ra l i có m t hàng. Trang 125 n n n p . GridLayout(1. l p cha c a t t c các l p con c a các s ki n là l java. c t là 5 pixel. int horizongap. int columns. L p GridLayout p GridLayout cung c p các hàm t o l p s p hàng các thành ph n giao di n: GridLayout() GridLayout(int rows. int hoiongap. Vi c nh t nút. có th ch nh h ng t các thành ph n comp vào ph n t ch a theo constraint là m t trong các h ng trên. X lý s ki n trong Java Các ng d ng v i GUI th ng c h ng d n b i các s ki n (event). u t o ra các s ki (event) và c g i t i cho ch ng trình ng d ng. int verticalgap) T o ra m t l i hình ch nh t có rows ( columns ô có kho ng cách gi a các hàng các c t là horizongap. m . Trong Java các s ki n c th hi ng các i t ng. ph i hay trung tâm. Component add(Component comp) void add(Component comp. BorderLayout() BorderLayout(int horizongap. verticalgap.v. int verticalgap) T o ra m t layout m c nh ho c có kho ng cách gi a các thành ph n (tính b ng pixel) là horizongap theo hàng và verticalgap theo c t. horizongap và verticalgap là kho ng cách tính theo pixel gi a các hàng các c t.L p BorderLayout p BorderLayout cho phép t m t thành ph n giao di n vào m t trong b n h ng: c (NORTH). tây (WEST) và gi a (CENTER). int verticalgap) public static final int LEFT public static final int CENTER public static final int RIGHT i s aligment xác nh cách s p theo hàng: t trái. ng c l i. III. L p c s nh t. nam (SOUTH). nh ng không th c hai. v. óng các Window hay gõ các ký t t bàn phím. Object constraint) public static final String NORTH public static final String SOUTH public static final String EAST public static final String WEST public static final String CENTER Tr ng h p m c nh là CENTER. int columns) GridLayout(int rows. 2. L p FlowLayout L p FlowLayout cung c p các hàm t o l p s p hàng các thành ph n giao di n: FlowLayout() FlowLayout(int aligment) FlowLayout(int aligment.EventObject. 3. ông (EAST).

khi th c hi n m t l n c n ch nh trong thanh tr t Scrollbar. JcheckBoxMenu. .java.awt.khi gõ phím ENTER trong tr ng v n b n (text). Ý ngh a c a các l p a.khi m t m c trong th c n c ch n. .event ActionEvent AdjustmentEvent ComponentEven t ItemEvent TextEvent ContainerEvent FocusEvent InputEvent PaintEvent WindowEvent KeyEvent MouseEven t Hình H7-20 Các l p x lý các s ki n Các l p con c a AWTEvent c chia thành hai nhóm: Các l p mô t v ng ngh a c a các s ki n.JList . JradioMenu .lang. Các thành ph n gây ra các s ki n hành ng bao g m: .AWTEvent java. ActionEvent ki n này c phát sinh b i nh ng ho t th c hi n trên các thành ph n c a GUI.khi m t nút button c khích ho t.EventObject java. 1. AdjustmentEvent ki n này x y ra khi ta u ch nh (adjustment) giá tr thanh cu n (JScollBar) Scrollbar . b.JTextField .JButton . p này có ph ng th c int getValue(): cho l i giá tr hi n th i c xác nh b i l n c n ch nh sau cùng.util.khi m t m c trong danh sách c kích ho t úp. . c.Object java.awt. Các l p s ki n m c th p. ItemEvent Các thành ph n c a GUI gây ra các s ki n v các m c g m có: Trang 126 .JmenuItem.

int getClickCount() Trang 127 - . ContainerEvent ki n này xu t hi n khi m t thành ph n c b sung hay b lo i b kh i v t ch a (Container). y c a v trí liên quan n s ki n do chu t gây ra. CheckboxMenuItem .khi m t m c trong danh sách c ch n ho c b lo i b ch n. TextEvent Các thành ph n c a GUI gây ra các s ki n v text g m có: TextArea . mã Unicode t ng ng v i ký t c a bàn phím.khi tr ng thái c a h p ki m tra Checkbox ng v i m c c a th c n thay i.khi tr ng thái c a h p ch n (Option) thay i. .khi k t thúc b ng nh n nút ENTER. . L p này có các ph ng th c: int getX() int getY() Point getPoint() Các hàm này c s d ng nh n l i t a x. TextField . dy). p ComponentEvent có ph ng th c: Component getComponent() Cho l i i t ng tham chi u ki u Component. char getKeyChar() i v i các s ki n KEY_PRESSED. f. e. p ItemEvent có ph ng th c Object getItem(): Cho l i i t ng c ch n hay v a b ch n. i. h. hàm này c s d ng nh n l i giá tr nguyên. void translatePoint(int dx. ComponentEvent ki n này xu t hi n khi m t thành ph n b n i/hi n ra ho c thay thay i l i kích th c.khi tr ng thái c a h p ki m tra Checkbox thay i.khi m t m c trong danh sách c ch n ho c b lo i b ch n. hàm này c s d ng nh n l i giá tr nguyên t ng ng v i mã c a phím trên bàn phím. L p này có các ph ng th c: int getKeyCode() i v i các s ki n KEY_PRESSED ho c KEY_RELEASED.JRadioButton. FocusEvent ki n lo i này xu t hi n khi m t thành ph n nh n ho c m t focus. . MouseEvent p MouseEvent là l p con c a l p tr u t ng InputEvent c s d ng x lý các tín hi u c a chu t. g. int dy) Hàm translate() c s d ng chuy n t a c a s ki n do chu t gây ra n (dx.JCheckbox .JList . KeyEvent L p KeyEvent là l p con c a l p tr u t ng InputEvent c s d ng x lý các ki n liên quan n các phím c a bàn phím. d.khi k t thúc b ng nh n nút ENTER.JCompoBox .

PaintEvent S ki n này xu t hi n khi m t thành ph n c v l i. WindowEvent S ki n lo i này xu t hi n khi thao tác v i các Window. th c t s ki n này x y ra khi ph ng th c paint()/ update() c g i n. L p này có ph ng th c: Window getWindow() Hàm này cho l i i t ng c a l p Window ng v i s ki n liên quan n Window ã x y ra. thu nh .. phóng to. m t c a s . gõ b i t ng l ng nghe addComponentlistener removeActiontListener addAdjustmentListener removeAdjustmentListener addItemListener removeItemListener AdjustmentListe ner ItemListener Giao di n Listener l ng nghe t ng ng AcitionListener AcitionEvent JButton JList TexField AdjustmentEvent JScrollbar ItemEvent JCheckbox JCheckboxMenuItem JRadioButton JList JCompoBox JTextArea JTexField JTextPane JEditorPane TextEvent addTexListener removeTextListener TextListener ComponentEvent Component ContainerEvent Container addComponentListener removeComponentListener addContainerListener removeContainerListener addFocusListener removeFocusListener addkeyListener removeKeyListener addMouseListener Trang 128 ComponentListe ner ContainerListen er FocusListener KeyListener MouseMotionLi FocusEvent KeyEvent MouseEvent Component Component Component . j. k. ch ng h n nh : óng. Ki u s ki n Ngu n gây ra s ki n Ph ng th c ang ký.Hàm getClickCount() m s l n kích chu t.

fr. import javax. 200).Applet. import java. import javax. fr.*.applet. and the loan amount. Clicking the compute button displays the monthly payment and the total payment. private JTextField tLoan = new JTextField(10).awt.border.the number of years. private JTextField tYear = new JTextField(10).setSize(400. fr. public class StudentApp extends JFrame implements ActionListener{ private JTextField tRate = new JTextField(10). M t s l p Window uh p p uh pt ng ng uh pt uh pt uh pt ng ng ng ng ng ng addWindowListener removeWindowListener stener WindowListener Giao di n Listener l ng nghe AcitionListener AdjustmentListener ItemListener TextListener ComponentListener ContainerListener FocusListener KeyListener MouseMotionListener WindowListener t s ví d minh h a Không có l p Không có l p Không có l p AdjustmentAdapter ComponentAdapter ContainerAdapter FocusAdapter KeyAdapter MouseMotionAdapter WindowAdapter /* The applet enables the user to enter the interest rate.awt.*.*.remoMouseListener addMouseMotionListener remoMouseMotionListener WindowEvent 3. //fr. private JTextField tTotal = new JTextField(10). import java. } Trang 129 .swing.setTitle("Mortgage Application").setVisible(true). public static void main(String[] args){ StudentApp fr = new StudentApp(). private JButton compute = new JButton("Compute mortgage").event. */ import java.center().TitledBorder.swing.

int year = (Integer. p1.RIGHT)). p1.awt. import java.valueOf(tRate. p1. p1.add(new Label("Loan Amount")). p1.SOUTH). // Register listener compute. p1. p2. public ChoiceList(String title){ super(title).awt. p1. p1. // Compute the total and displays it double m = loan * interest * year. p1. class ChoiceList extends Frame implements ActionListener{ Label l1 = new Label("What is your favorite color").add(new Label("Interest Rate")).setLayout(new FlowLayout(FlowLayout.intValue().doubleValue(). add(bt). add(l1).add(tRate).add(p2. Trang 130 .setEditable(false).add(new Label("Years")). } // Handler for the compute button public void actionPerformed(ActionEvent e){ if(e.BorderLayout.2)).*. Button bt = new Button("Exit").add(tLoan).BorderLayout. double loan = (Double.add(tYear).setLayout(new GridLayout(5.getText())). p2.setBorder(new TitledBorder("Enter interest rate.CENTER).addActionListener(this). tTotal.valueOf(tYear. p1. JPanel p2 = new JPanel().doubleValue().setText(String. JPanel p1 = new JPanel(). // Add the components to the applet getContentPane(). } } } S d ng ListBox và nút l nh import java. getContentPane().add(compute).add(p1. setLayout(new FlowLayout()). year and loan amount")).getSource() == compute){ // Get values from text fields double interest = (Double.add(tTotal).getText())).valueOf(tLoan.event.public StudentApp(){ tTotal.getText())).add(new Label("Total Payment")).valueOf(m)). Choice colors = new Choice().*.

Timer.*.event.*. import javax.getSource() == bt){ System. fr.setSize(300.awt.awt. colors. t. 350).text. btSus.addItem("White").add(clockP1 = new ClockPanel()).CENTER). clockP2.*. import java. 200).addItem("Yellow").3)).setTitle("Berlin").swing. } } // public void mouseExited(MouseEvent m){} public static void main(String args[]){ ChoiceList t = new ChoiceList("Choice List"). private JButton btResum. } public void actionPerformed(ActionEvent ev){ if(ev.addItem("Red"). BorderLayout. import java. clockP3.addActionListener(this).swing.setLayout(new GridLayout(1.util. app. import javax.addItem("Blue"). } public void init(){ // Panel p1 for holding 3 clocks JPanel p1 = new JPanel(). ClockGroup app = new ClockGroup(). Trang 131 . p1.addItem("Orange"). fr. colors. fr.exit(0). bt.getContentPane().colors.*. colors.init(). colors.java * display a group of international clocks */ import java.setSize(600. } } /* ClockGroup. public static void main(String[] arg){ JFrame fr = new JFrame("Clock Group Demo").setVisible(true).*. app. t. import java. add(colors). public class ClockGroup extends JApplet implements ActionListener{ private ClockPanel clockP1. colors.start().add(app. clockP1. // Create a clock for Berlin p1.addItem("Green").show().

BorderLayout.setLocale(Locale.setTimeZoneID("CTT"). p2.setLayout(new FlowLayout()). public ClockPanel(){ JPanel bt = new JPanel(). clockP3.setLayout(new BorderLayout()). // Add p1.clockP1. getContentPane().BorderLayout. clockP3.add(clockP3 = new ClockPanel()).add(btSus = new JButton("Suspend")). // Set BorderLayout for the ClockPanel Trang 132 .setTitle("Taipei").add(btResum = new JButton("Resum")).add(p2. clockP2. clockP2. clockP2. // Create a clock for SanFrancisco p1. p2. p2.add(btResum = new JButton("Resume All")).suspend().add(p1. protected Clock clock = null.setLocale(Locale. clockP2. clockP1. } } } class ClockPanel extends JPanel implements ActionListener{ private JLabel labelT. btSus. clockP2.addActionListener(this).suspend().setTimeZoneID("PST").resume(). } public void actionPerformed(ActionEvent e){ if(e.US).addActionListener(this).suspend().setTitle("San Francisco").setLocale(Locale.getSource() == btSus){ // Start all clock clockP1. clockP3.clock. clockP3.resume().clock.clock. clockP3.setTimeZoneID("ECT"). } else if (e. getContentPane(). private JButton btResum. // Create a clock for Taipei p1.clock. btSus.GERMAN).clock. p2 into the applet getContentPane(). bt.add(clockP2 = new ClockPanel()). bt.clock.resume(). // Panel p2 for holding 2 group buttons JPanel p2 = new JPanel().SOUTH).getSource() == btResum){ // Start all clock clockP1. // Register listener btResum.CENTER).add(btSus = new JButton("Suspend All")).CHINESE).

this).setLayout(new BorderLayout()).resume(). } } public void resume(){ if(clock != null) clock.SOUTH). } public void resume(){ timer. timer = new Timer(1000.CENTER).setText(title). } public void setTitle(String title){ labelT. labelT.NORTH).setHorizontalAlignment(JLabel. // Add title label to the north of the panel add(labelT = new JLabel(). } public void suspend(){ timer.addActionListener(this). t).getSource() == btResum){ clock.BorderLayout. BorderLayout.start(). timer. TimeZone t){ super(l.CENTER). // Register btResum.getDefault()). } public void actionPerformed(ActionEvent e){ repaint(). } } class Clock extends StillClock implements ActionListener{ protected Timer timer.suspend().addActionListener(this). } } Trang 133 . } public void actionPerformed(ActionEvent e){ if(e.stop(). add(bt. } public Clock(Locale l. } public void suspend(){ if(clock != null) clock.BorderLayout. } else if (e.getSource() == btSus){ clock. // Add the clock to the center of the panel add(clock = new Clock(). btSus.start().resume().getDefault().suspend(). public Clock(){ this(Locale. TimeZone.

7*0. // Draw circle g. xC = (getSize(). g.get(GregorianCalendar.drawString("12".get(GregorianCalendar.height)/2. g.6). g. yC + 3).drawLine(xC. g. g. int hLen = (int)(clockR *0.2*clockR).getTimeZone(newT).5). xC .drawString("6". yS).red). g. g.black).drawLine(xC. } // Override the paintComponent to display a clock public void paintComponent(Graphics g){ super. Trang 134 . } public StillClock(Locale l. yM).sin(second*(2*Math.PI/60))). yC + 3).drawOval(xC-clockR.75).getSize(). public StillClock(){ this(Locale.drawString("9". yC.min(getSize(). xS.PI/60))). g.clockR-10.timeZ = t.// Display a clock in JPanel class StillClock extends JPanel{ protected TimeZone timeZ.width.sin(minute*(2*Math. protected int xC. protected DateFormat form. g.getDefault()).clockR). clockR = (int)(Math.clockR.MINUTE). xC + clockR.setColor(Color.getDefault(). int xS = (int)(xC+sLen*Math. } public void setTimeZoneID(String newT){ timeZ = TimeZone. // Draw hour hand int hour = (int) cal. yC + clockR + 10).5.9). this. int mLen = (int)(clockR *0.blue). TimeZone. int xM = (int)(xC+mLen*Math.setColor(Color. protected int clockR. yC.PI/12))).paintComponent(g).drawString("3". // Draw minut hand int minute = (int) cal.setColor(Color. 2*clockR. int yM = (int)(yC-mLen*Math. int sLen = (int)(clockR *0. int yS = (int)(yC-sLen*Math.cos(minute*(2*Math.sin((hour+minute/60. xC .PI/60))). // Get current time using GregorianCalendar GregorianCalendar cal = new GregorianCalendar(timeZ).cos(second*(2*Math.get(GregorianCalendar.height)*0.0)*(2*Math. xM.width)/2. yC . xC + 3.HOUR_OF_DAY). int xH = (int)(xC+hLen*Math. yC . TimeZone t){ setLocale(l). // Draw second hand int second = (int) cal.SECOND).PI/60))). yC. yC = (getSize().

public ComponentTest(String title) { super(title).drawString(today.event. colors.awt.addItem("Oranges"). // Display current date String today = form. TextArea ta = new TextArea(3.setTimeZone(timeZ). CheckboxGroup cb = new CheckboxGroup(). true).PI/12))). true). import java. add(tf2). setLayout(new FlowLayout()). Checkbox b1 = new Checkbox("Red".width-fm.0)*(2*Math. colors.drawLine(xC.DateFormat. yC+clockR+30).MouseListener { TextField tf1=new TextField(30). FontMetrics fm = g. add(bg2).. add(label1).. cb. add(ta). g.green).getTime()). form. Checkbox b2 = new Checkbox("Blue".cos((hour+minute/60. g.addItem("Red"). getLocale()). PopupMenu optionsMenu = new PopupMenu("Options").LONG.awt. Trang 135 . TextField tf2 = new TextField(40). xH. public class ComponentTest extends Frame implements ActionListener. colors.int yH = (int)(yC-hLen*Math. g. Checkbox bg1 = new Checkbox("Small".getFontMetrics(). yH). add(bg1). import java.MEDIUM. // Set display form in specified style. Choice colors = new Choice(). and timzone form = DateFormat. add(b1). Label label1 = new Label("This is a way to use component.*. true). Checkbox bg2 = new Checkbox("Large".addItem("While"). 25).stringWidth(today))/2. Button btnResult = new Button("Double is").getDateTimeInstance( DateFormat.format(cal. (getSize().*."). add(tf1). Button btnExt = new Button("Exit"). true). locale. } } d ng các u khi n package welcome.setColor(Color. add(b2). yC. cb.

editMenu. MenuItem newItem = new MenuItem("New").add(paseItem).add(newItem). MenuItem openItem = new MenuItem("Open").addActionListener(this). mbar. //PopupMenu optionsMenu=new PopupMenu("Options").add(openItem). add(btnResult). CheckboxMenuItem overtypeItem = new CheckboxMenuItem("Over type". optionsMenu. colors.addActionListener(this).addSeparator().add(fileMenu). optionsMenu. true). setMenuBar(mbar). fileMenu. Menu editMenu = new Menu("Edit"). formatMenu.add(saveItem). optionsMenu. fileMenu. MenuItem paseItem = new MenuItem("Pase").addItem("Black"). btnExt. fileMenu. MenuItem readItem = new MenuItem("Read Only").add(formatMenu).addSeparator().addSeparator(). MenuItem cutItem = new MenuItem("Cut"). fileMenu. editMenu. exitItem. colors. formatMenu. editMenu.add(copyItem). fileMenu.colors.addItem("Blue").add(readItem).add(exitItem). fileMenu. false). MenuItem exitItem = new MenuItem("Exit"). editMenu. mbar.addItem("Green"). btnResult. MenuItem copyItem = new MenuItem("Copy"). MenuBar mbar = new MenuBar().add(optionsMenu).addSeparator(). fileMenu. optionsMenu. Menu formatMenu = new Menu("Format text"). Menu fileMenu = new Menu("File"). colors.addSeparator(). Trang 136 .addActionListener(this). optionsMenu. fileMenu.addActionListener(this). CheckboxMenuItem insertItem = new CheckboxMenuItem("Insert". editMenu.addActionListener(this). MenuItem saveItem = new MenuItem("Save").addSeparator().addItem("Yellow"). add(btnExt).add(insertItem). add(colors).add(editMenu).add(cutItem).addActionListener(this).

} } public void mouseEntered(MouseEvent m) { } public void mouseExited(MouseEvent m) { } public void mouseClicked(MouseEvent m) { optionsMenu. Trang 137 . The following contains a sample run of the program. label1. fr.setText("Open"). mClose.*").out. c. import javax. } public void actionPerformed(ActionEvent ae) { if (ae.*. private JButton btAdd.getX(). btSub. } } /* The program has 4 buttons labeled Add. 300).exit(0).add(overtypeItem).awt. btMul.equals("Open")) { System.parseInt(tf1. The user will also create to perform the same operation. import java. } if (ae. } public void mouseReleased(MouseEvent m) { } public void mousePressed(MouseEvent m) { } public static void main(String args[]) { ComponentTest c = new ComponentTest("Vi du dung thu vien java. m.getText()) * 2.getSource() == btnResult) { int num = Integer. public class MenuDemo1 extends JFrame implements ActionListener{ private JTextField num1. formatMenu.awt. num2.setSize(500.exit(0). Mul.btDiv..show().awt. m.valueOf(num)). mSub. public static void main(String[] arg){ MenuDemo1 fr = new MenuDemo1(). } if (ae. mDiv.*. Div and also create a menu to perform the same operation.getActionCommand(). private JMenuItem mAdd. } if (ae. The user can choose the operation either from buttons or from menu selections.formatMenu.swing.getActionCommand().event.mMul.addSeparator(). res.pack(). Sub.show(this.println("You pressed the menuItem Open.setText(String. tf2.getSource() == btnExt) { System.*. Fig.")..equals("Exit")) { System. */ import java. c.getY()).

add(num2 = new JTextField(4)). res. } public MenuDemo1(){ setTitle("Menu Demo").addActionListener(this). BorderLayout. p1. p1. setJMenuBar(mb).VK_A.getKeyStroke(KeyEvent. ActionEvent. mAdd. mb. JMenu opMenu = new JMenu("Operation"). p1.add(p1.addActionListener(this).VK_D. JPanel p2 = new JPanel().fr. 'M')).setVisible(true). p1.setMnemonic('O'). getContentPane().add(new JLabel("Result")).add(new JLabel("Number 1")). 'S')).add(num1 = new JTextField(4)). 'C')). exitMenu. opMenu. p2.getKeyStroke(KeyEvent.add(btAdd = new JButton("Add")).add(p2.CTRL_MASK)). JPanel p1 = new JPanel(). opMenu.setAccelerator(KeyStroke.VK_M. 'D')). p2. getContentPane(). Trang 138 . p2.setLayout(new FlowLayout()).add(mClose = new JMenuItem("Close". mSub.add(exitMenu).add(btMul = new JButton("Mul")). mDiv. ActionEvent. 'A')). p2.CENTER).CTRL_MASK)).setAccelerator(KeyStroke.setLayout(new BorderLayout()). mMul. opMenu. btAdd. ActionEvent. p1.add(btSub = new JButton("Sub")).VK_S.CTRL_MASK)).add(mMul = new JMenuItem("Mul".getKeyStroke(KeyEvent.SOUTH). btSub. opMenu.setEditable(false). BorderLayout. mb.add(mSub = new JMenuItem("Sub". JMenu exitMenu = new JMenu("Exit"). p2.CTRL_MASK)).add(new JLabel("Number 2")).setMnemonic('E').getKeyStroke(KeyEvent.add(btDiv = new JButton("Div")).add(opMenu).setAccelerator(KeyStroke. p1. opMenu. JMenuBar mb = new JMenuBar().add(mAdd = new JMenuItem("Add". p1. getContentPane().setLayout(new FlowLayout()).setAccelerator(KeyStroke.add(mDiv = new JMenuItem("Div". exitMenu. ActionEvent.add(res = new JTextField(4)).

getSource() instanceof JMenuItem){ if("Add". case '/': r = n1 / n2.exit(0).equals(comm)) System.trim())).equals(comm)) calculate('/').n2.getSource() instanceof JButton){ if("Add".parseInt(num1.parseInt(num2. break. } res. if(e.addActionListener(this). else if ("Div". case '-': r = n1 . mSub.equals(comm)) calculate('*'). switch( op){ case '+': r = n1 + n2.equals(comm)) calculate('/'). mClose. int n2 = (Integer. break. break.addActionListener(this). } } p trình menu Trang 139 .setText(String.equals(comm)) calculate('-'). int r = 0. } } private void calculate(char op){ int n1 = (Integer.valueOf(r)). else if ("Div".equals(comm)) calculate('-').addActionListener(this). mAdd.equals(comm)) calculate('+'). } public void actionPerformed(ActionEvent e){ String comm = e.equals(comm)) calculate('*').addActionListener(this).addActionListener(this).getActionCommand(). else if ("Sub". else if ("Close".getText().addActionListener(this). else if ("Mul".addActionListener(this).btMul.trim())). mDiv. else if ("Sub". break. } else if (e.equals(comm)) calculate('+'). btDiv. mMul.getText(). else if ("Mul". case '*': r = n1 * n2.

setJMenuBar(mb).getKeyStroke(KeyEvent.awt. Div and also create a menu to perform the same operation. opMenu.add(mMul = new JMenuItem("Mul". public static void main(String[] arg){ MenuDemo1 fr = new MenuDemo1().add(mClose = new JMenuItem("Close". JMenu opMenu = new JMenu("Operation"). 'C')).setMnemonic('E')./* The program has 4 buttons labeled Add. The user will also create to perform the same operation. 'S')). ActionEvent. 'D')). JMenuBar mb = new JMenuBar().*. btSub. Mul. num2.*. private JMenuItem mAdd.btDiv.CTRL_MASK)).add(opMenu).setAccelerator(KeyStroke. mMul.VK_M. */ import java. fr. 'A')).setVisible(true).add(mSub = new JMenuItem("Sub". mb. ActionEvent.CTRL_MASK)). Fig. The following contains a sample run of the program.pack().CTRL_MASK)). opMenu. import java. mb.getKeyStroke(KeyEvent. opMenu. opMenu. } public MenuDemo1(){ setTitle("Menu Demo"). btMul. mAdd.getKeyStroke(KeyEvent.awt. exitMenu.setAccelerator(KeyStroke.mMul.event. exitMenu.add(mAdd = new JMenuItem("Add". Sub. mDiv.setMnemonic('O').VK_S. mClose. opMenu. mSub. res. fr.swing.setAccelerator(KeyStroke. public class MenuDemo1 extends JFrame implements ActionListener{ private JTextField num1. mSub.add(mDiv = new JMenuItem("Div". The user can choose the operation either from buttons or from menu selections.*. 'M')). JMenu exitMenu = new JMenu("Exit").VK_A. ActionEvent. import javax. private JButton btAdd.add(exitMenu). Trang 140 .

getContentPane().getActionCommand().mDiv.add(btSub = new JButton("Sub")). getContentPane().setAccelerator(KeyStroke.setEditable(false).getSource() instanceof JButton){ if("Add".addActionListener(this). p2.getKeyStroke(KeyEvent. p1. p2.equals(comm)) calculate('*'). BorderLayout. btMul. btAdd.add(new JLabel("Result")). mDiv.addActionListener(this). } public void actionPerformed(ActionEvent e){ String comm = e. else if ("Mul".addActionListener(this). p1.addActionListener(this). if(e.VK_D.addActionListener(this).equals(comm)) calculate('+'). p1.CENTER). getContentPane().SOUTH).add(num1 = new JTextField(4)).CTRL_MASK)).addActionListener(this). p1. p1. BorderLayout.equals(comm)) calculate('-').add(new JLabel("Number 1")). btSub. p1.addActionListener(this).addActionListener(this). mClose.add(num2 = new JTextField(4)). mSub.add(res = new JTextField(4)).setLayout(new FlowLayout()). else if ("Sub". p2.addActionListener(this).add(btDiv = new JButton("Div")).add(btMul = new JButton("Mul")). btDiv. ActionEvent.add(p1. Trang 141 . JPanel p1 = new JPanel(). mMul. JPanel p2 = new JPanel(). p2. p2.add(btAdd = new JButton("Add")). mAdd.setLayout(new BorderLayout()).add(p2.setLayout(new FlowLayout()). res. p1.add(new JLabel("Number 2")).

trim())). } else if (e. int r = 0.parseInt(num1.valueOf(r)).equals(comm)) calculate('+').equals(comm)) calculate('/').else if ("Div". else if ("Mul".getSource() instanceof JMenuItem){ if("Add". int n2 = (Integer.getText().equals(comm)) calculate('-'). case '-': r = n1 . case '/': r = n1 / n2.n2.setText(String. break.equals(comm)) System. } } Trang 142 . else if ("Div". break.parseInt(num2.trim())).equals(comm)) calculate('/').exit(0). } res. else if ("Sub".getText(). break. case '*': r = n1 * n2. } } private void calculate(char op){ int n1 = (Integer.equals(comm)) calculate('*'). else if ("Close". switch( op){ case '+': r = n1 + n2. break.

u n i JDBC – ODBC là m t trình u khi n s d ng mã java g i l i các hàm trong JDBC API.C u n i JDBC-ODBC. Ki u 1 : JDBC s d ng c u n i ODBC (JDBC-ODBC Bridge ) ODBC là m t công ngh c a Microsoft dùng k t n i n các h c s d li u thông qua trình u khi n Driver c a h c s d li u ó. JDBC c thi t k t ng i n gi n. có th k t n i vào m t h CSDL c th nào ó (ch ng h n nh : Access. ây là trình u khi n c cung c p mi n phí b i hãng Sun và nó c cài t t ng khi b n cài t JDK. Mô hình JDBC a ra m t t p các l p và các ph ng th c giao ti p v i ng n d li u.Ch ng 7 L P TRÌNH C S D LI U I. Trình u khi n này s c ng ký v i b qu n lý ODBC . JDBC API c tích h p vào ngay n n java nên b n không c n ph i cài t gì thêm khi truy c p CSDL. cách k t n i v i CSDL. c p nh t. ng i l p trình s s d ng các hàm API trong giao di n này truy c p vào CSDL. Trang 143 . Các k u trình u khi n JDBC Các trình u khi n JDBC có th phân thành 4 ki u sau ph thu c vào cách th c ho t ng.. T ng quan t h a h n l n c a java là kh n ng xây d ng các ng d ng CSDL c l p v i h n. . II. SQL Server. ODBC API là m t t p các hàm API truy c p vào CSDL thông qua các trình u khi n. Thông th ng trình u khi n này c cung c p b i chính các hãng s n xu t h CSDL và nó th ng c cài t vào trong máy khi b n cài t h qu n tr CSDL. M i h c s d li u cung p m t trình u khi n (Driver) có kh n ng làm vi c ( c. MySQL…) s d ng c u n i JDBC-ODBC b n c n ph i có: . B ng cách này b n có th k t n i c v i nhi u h qu n tr c s li u khác nhau.Trình u khi n (Driver) c a dùng truy c p vào h CSDL ó.) cc s li u c a chúng . công ngh này c bi t n v i cái tên JDBC (Java Database Connectivity)..

Servlet JDBC Driver ODBC Mã Native Database driver Database Mô hình truy c p CSDL qua c u n i JDBC Vì r ng trình u khi n ODBC ph i c cài t vào trong máy tr c khi b n có th d ng nên nó ch thích h p cho các ng d ng máy n. không thích h p cho các ng d ng ch y trên máy khách nh : Aplet. Fat Client. ho c c ch y trên máy ch trong mô hình nhi u t ng (Multi . nh ng ph i có trình u khi n c s c thù do nhà phát tri n cung c p ho c c a m t hãng th ba nào ó. Applet . Ki u k t n i này s d ng mã java tr c ti p g i các hàm trong trình u khi n c thù c a m i h c s d li u mà không ph i qua trung gian ODBC .tier).Mã JAVA { { { Java Application . Ki u 2 : JDBC k t n i tr c ti p v i các trình u khi n c s d li u . Trang 144 . Do v y ki u k t i này nhanh và hi u qu h n c u n i JDBC – ODBC.

Applet . Mã JAVA { { Java Application . máy ch s ch u trách nhi m k t n i v i c s d li u . Applet . Servlet JDBC Driver M¹ng Java Middle Ware Mã JAVA Java Native driver Database Ki u 4 : JDBC k t n i thông qua các trình u khi n hoàn toàn mã java Trang 145 . Máy khách ch s d ng nh ng trình u khi n g n nh (thin) có kh n ng giao ti p i ng d ng trung gian thông qua m ng truy v n d li u .Mã JAVA { { Java Application . Servlet JDBC Driver Database driver Mã Native Database Mô hình k t n i tr c ti p Ki u 3 : JDBC k t n i thông qua các ng d ng m ng trung gian i ki u k t n i này.

gói javax. Mã JAVA { { Java Application . 1.Ki u này cho phép máy khách s d ng trình u khi n c s d li u c thù trên máy ch u khi n g n nh n i k t tr c ti p vào trình xa thông qua m ng Internet . Gói java.sql ch a các giao di n và gói cho phép ta th c hi n các thao tác c b n i v i CSDL.sql ch a các l p và giao di n giúp ta th c hi n các tính n ng cao p. M t s giao di n và l p trong gói java.sql và javax.sql. Applet . Servlet Internet JDBC Driver Mã JAVA Java Native driver CSDL III.sql a) M t s giao di n Tên giao di n CallableStatement DatabaseMetaData PreparedStatement ResultSetMetaData Connection Driver ResultSet Statement Mô t ý ngh a Giao di n ch a các ph ng th c cho phép ta làm vi c v i th c l u tr n i Cho phép ta xem các thông tin v CSDL Giao di n này cho phép ta th c thi các câu l nh SQL ch a tham s Th hi n m t k t n i n CSDL Giao di n mà m i trình u khi n ph i cài t Th hi n m t t p các b n ghi l y v t CSDL Giao di n cho phép ta th c hi n các phát bi u SQL Trang 146 . Các l p trong JDBC API dùng truy c p CSDL JDBC API bao g m các l p và các giao di n c ch a trong hai gói: java.

Các b c xây d ng m t ng d ng CSDL v i JDBC: ng trình vi t 1. c p nh t… óng k t n i. 2. Sau khi b n l a ch n c h qu n tr CSDL phù h p b n ti n hành cài t CSDL: o b ng.sun. view.sql Tham kh o tài li u v JDBC IV.b) Mét s l p Tên l p Date DriverPropertyInfo Timestamp DriverManager Time Types Ý ngh a p bi u di n ki u DATE Ch a các thu c tính c a trình u khi n ã n p L p bi u di n cho SQL TimeTemp L p qu n lý các trình u kh ên p bi u di n ki u DATE p nh ngh a các h ng t ng ng v i các ki u d li u SQL.com/jdbc b) Cài t CSDL B n c n l a ch n và cài t m t h qu n tr CSDL. Tr c khi truy c p vào h CSDL nào b n ph i có trong tay trình u khi n t ng ng v i h CSDL ó. Th c hi n các l nh làm vi c v i CSDL nh : truy v n. K t n i CSDL v i JDBC có th làm vi c v i CSDL. Thi t l p k t n i ây là b c quan tr ng nh t bao g m hai b Trang 147 c: .. th t c l u tr . B n có th download các trình u khi n cho m t s h CSDL quen thu c t a ch java. ây là l a ch n c a b n tu theo tính ch t c a d li u trong ch ng trình ng nh m c ti n b n có có th mua c h qu n tr ó. Chú ý: có th truy c p vào CSDL c a h qu n tr CSDL nào thì b n ph i có trong tay trình u kh ên t ng ng. qu n tr ph n d li u c a ch ng trình. M t s l p và giao di n trong gói javax. gi i phóng tài nguyên. m t ch ng trình java (hay b t c ch ng ngôn ng nào khác) ph i tuân theo các b c sau: k t n i n CSDL. Chu n b a) Cài t JDBC và trình u khi n: M t ng java ch có th k t n i và làm vi c c v i d li u trong CSDL thông qua các trình u khi n và các th vi n JDBC API. hay còn g i là ki u d li u JDBC 2.

JdbcOdbcDriver"). m t kh u truy c p là theht thì câu l nh k t n i n CSDL là Connection con = DriverManager.url là chu i ch a thông tin k t n i n CSDL. dùng n p trình u khi n JDBC-ODBC u khi n khác nhau thì URL c a ph ng th c Class.myPassword là m t kh u truy c p. n u m t không có m t kh u b n có th truy n cho nó t xâu r ng Chú ý: Thông th ng chu i URL có nh d ng nh sau: jdbc:subprotocol:subname Trong ó: subprotocol là giao th c con t ng ng v i lo i CSDL subname là tên c a ngu n d li u (Thông th ng nó là tên c a CSDL) t vài ví du: Ví d 1: N p trình u kh ên và k t n i n CSDL c a MySQL Trang 148 .a) N p trình u khi n JDBC s d ng m t b trình qu n lý u ki n (DiverManager). ."theht". Trong ó : . "myPassword"). u khi n dùng k t u khi n b n s d ng l nh Class.myLogin là tên truy c p. bi t c URL t ng ng. getConnection(“jdbc:odbc:TestDB”. ch ng h n tôi ã t o m t DNS tên là TestDB v i tên truy c p là theht. ch ng h n l nh Class. m i trình u khi n (Driver) cho phép ta làm vi c v i m t CSDL c th .getConnection(url.forName(URL) khác nhau.forName("sun. n u m t không có m t kh u b n có th truy n cho nó m t xâu ng . Nên có th n p úng trình u khi n b n nên thao kh o tài li u i kèm a các trình u khi n. b) T o m t k t n i c ti p theo b n t o m t k t n i a n p b c trên. cho nên n u b n có 3 CSDL do 3 nhà cung c p khác nhau cung c p thì b n c n ph i có 3 trình n p và ng ký trình Trong ó URL là m t chu i mô t các thông tin v tên c a trình i v i c s d li u.odbc. n mã dùng n CSDL thông qua trình u khi n mà b n t o m t k t n i thông th ng nh sau: Connection con = DriverManager.forName() Chú ý: V i m i trình u khi n khác nhau. "theht"). n u b n s d ng c u n i JDBC-ODBC thì url là “jdbc:odbc:DataSourceName”.jdbc. "myLogin".

.mysql. có m t trình u khi n mà ta nên s d ng ó là trình u khi n do chính hãng Microsoft cung c p.forName("com. Trang 149 . Class.com ."Password").jdbc.getConnection( " jdbc:microsoft:sqlserver://ServerName:ServerPort.N p tình n t p tin này u khi n c a MySQL c nén theo chu n jar.a ch download www. "UserName".jdbc.Pass: là m t kh u truy c p Ví d 2: N p trình u kh ên và k t n i n CSDL c a SQL Server 7.jar install_dir: là th m c cài t .microsoft.com.microsoft.getConnection( "jdbc:mysql://ServrName/DBName?user=UserName&password=Pass"). a ph n các trình u khi n u là các n ph m th ng m i. -K tn i n CSDL Connection conn = DriverManager.Password=Pass word. . 2000 Có r t nhi u trình u khi n cho MS SQL Server.Trình u kh ên tury c p vào CSDL c a MySQL.forName("com.UserName: là tên truy c p CSDL .SQLServerDriver").User=UserName.ServerName: là tên c a máy ch CSDL .DatabaseName=DBName").Sau khi download và ti n hành cài t b n s có 3 t p tin trong th m c cài t: install_dir/lib/msbase.t classpath tr n 3 t p tin trên . sau khi download b n có m t t p tin duy nh t ã classpath tr .sqlserver.Driver"). -K tn i n CSDL Connection conn = DriverManager.jar install_dir/lib/mssqlserver.getConnection "jdbc:microsoft:sqlserver://ServerName:ServerPort. b n có th download t i a ch t MySQL. trình u khi n này hoàn toàn Free và h tr y các tính n ng c a Sql Server.jar install_dir/lib/msutil.0.DatabaseName=DBName". ho c Connection conn = DriverManager.N p trình u khi n Class.DBName: là tên c a CSDL .

out.createStatement().DBQ=C:/Path/DatabaseName.password=").getConnection( "jdbc:microsoft:sqlserver://theht:1433.sql. class Test{ public static void main(String[] args) { try { Class.next()) System.N p trình .getString("b")).SQLServerDriver"). Statement st=conn.println(rs. while(rs. } catch (SQLException ex) {} } catch (ClassNotFoundException ex) { } } Ví d 3: N p trình u kh ên và k t n i n CSDL c a Access v i c u n i JDBC-ODBC a Sun System truy c p vào CSDL c a Access ta không c n ph i t i xu ng và cài t vào máy driver nào c vì nó c tích h p vào Java. JdbcOdbcDriver ").getConnection(" jdbc:odbc:MyDB"). ResultSet rs=st.odbc.M k t n i b ng cách s d ng DataSource Name + Vào control panel ch y ch ng trình ODBC DataSource 32 bit + T o m t DataSource Name có tên là MyDB Connection conn = DriverManager.mdb)}.Chuy n CSDL làm vi c conn.*.executeQuery("Select * from t").mdb". trình u khi n này do sun cung c p nó có tên là c u i JDBC-ODBC u khi n Class.user=sa.microsoft.jdbc.sqlserver.getString("a")+ rs.”) MyDB: tên c a DataSource Name mà b n ã t o Path: ng d n n CSDL Trang 150 .+ ServerName: Là tên c a máy ch SQL + ServerPort: hi u c ng c a SQL. + DBName: là tên CSDL Ví d hoàn ch nh import java.M k t n i b ng cách s d ng File DataSource Connection conn = DriverManager.forName("com.getConnection(“jdbc:odbc:Driver={Microsoft Access Driver (*. .jdbc. Connection conn = DriverManager.forName("sun.DatabaseName=AA. .setCatalog("DBName"). n u trong quá trình cài ng nh p vào SQL ng ng v i tài kho n ng nh p t mà b n không t i thì giá tr này là 1433 + UserName: Tài kho n + Password: t kh u t .

JdbcOdbcDriver").mdb)}. .forName("sun.getConnection(url. Statement stmt = con.OracleDriver ").theht là tên truy c p CSDL .getConnection("jdbc:oracle:oci8:@theht". //Charset làm vi c v i Unicode props."abc").mdb". "guest").jdbc.*. ResultSet.next()) { System.sql. } } } Ví d 4: p trình u kh ên và k t n i n CSDL c a Oracle 8i.DBQ=C:/MyDB.forName("oracle. ResultSet rs = stmt. "theht". //Chèn 1 b n ghi vào CSDL stmt. 9i Trình u kh ên tury c p vào CSDL c a Oracle. "guest"). String url = "jdbc:odbc:Driver={Microsoft Access Driver (*. } } catch (Exception ex) { ex. Connection con = DriverManager.printStackTrace().createStatement(ResultSet. if (rs.*.'Toi là Access')").jdbc. b n có th tìm th y nó trong th m c %ORACLE_HOME%/JDBC/lib Class. b text(50))"). props.odbc. import java.@theht là tên c a máy ch CSDL .execute("Insert Into tbl values('Xin chào '. //T o b ng stmt. "UTF8"). props. class Test { public static void main(String a[]) { try { Class.DatabaseName: tên CSDL Ví d hoàn ch nh import java. Properties props = new Properties().TYPE_SCROLL_SENSITIVE.getString("b")).getString("a") + "\t" + rs.put("password".put("user". props).println(rs.out.put("charSet". // L y v k t n i n CSDL Connection conn = DriverManager.executeUpdate("Create Table tbl(a text(50).abc là m t kh u truy c p Trang 151 .CONCUR_UPDATABLE).util.executeQuery("Select * from tbl").

SUP_ID INTEGER.executeUpdate("CREATE TABLE COFFEES"+"(COF_NAME VARCHAR(32). Sau ây là b ng các giá tr mà tham s ResultSetType có th nh n ng connection mà b n v a t o ra Trang 152 . PRICE FLOAT. Th c ra vi c có c p nh t c hay không còn ph thu c vào trình u kh ên và h qu n tr có h tr c p nh t hay không.createStatement(ResultSetType. Trong java 2 b n có th t o ra các t p k t qu có th c p nh t và có th cu n con tr theo c hai chi u. Trong ó : Tham s ResultSetType cho bi t t p k t qu (ResultSet) nh n c khi th c thi câu l nh executeQuery() có cu n c hay không. bây gi chúng ta s s d ng ph ng th c execute c a i t ng này th c thi m t l nh SQL. " + "SALES INTEGER. Tham s ConcurencyType tính ch t c a t p k t qu (ResultSet) nh n c khi th c thi câu l nh executeQuery() có cho phép c p nh t hay không. T ng tác v i CSDL T t c các l nh mà ta dùng t trong ba i t ng sau: it ng Dùng Dùng Dùng tác ng lên CSDL Mô t u có th th c hi n thông qua Satement PreparedStatement CallableStatement th c thi các l nh SQL không có tham s th c thi các l nh SQL có ch a tham s làm vi c v i th t c l u tr n i 1. Statement stmt = con. i th i m này b n ch a có phát bi u SQL nào truy n n CSDL.createStatement(). T o ra m t JDBC Statements t i t ng Statements s giúp b n g i m t l nh SQL n h qu n tr CSDL. ConcurencyType).V. ch ng h n nh n l nh sau s d ng ph ng th c executeUpdate th c thi t câu l nh truy v n c p nh t stmt. TOTAL INTEGER)"). i t t o it ng Statements b n s ng ph ng th c createStatement c a trong b c II. sau khi t o i t ng Statements b n có th th c hi n các l nh SQL nh SELECT l y d li u hay UPDATE c p nh t d li u. t o ra t p k t qu có th c p nh t c và cho phép cu n c hai chi u n s d ng m u sau: Statement stmt = con.

executeUpdate(“INSERT INTO sinhvien(masv. \”Nguy n n An”). hay ch c a) Th c hi n các l nh DDL (Data Difinetion Language) th c thi các l nh DDL b n s d ng ph ng th c executeUpdate c a Statement theo m u: stmt. it ng Trong ó: stmt là m t i t ng thu c l p Statement DDL_SQL_STRING là m t câu l nh DDL Chú ý: Ph ng th c executeUpdate tr v giá tr 0 n u câu l nh mà nó th c thi là m t câu nh DDL b) Th c thi các l nh c p nh t CSDL th c thi các l nh c p nh t nh : INSERT. Trang 153 .executeUpdate(“DELETE sinhvien WHERE masv=01”).executeUpdate(DML_SQL_STRING). UPDATE. Ví d 1: Thêm m t b n ghi vào b ng sinhvien stmt. Trong ó: stmt: là m t i t ng thu c l p Statement DML_SQL_STRING là m t câu l nh c p nh t Chú ý: Ph ng th c executeUpdate tr v m t s nguyên th hi n s b n ghi c nh ng sau l nh này.executeUpdate(DDL_SQL_STRING).Ki u ResultSet TYPE_FORWARD_ONLY Cho bi t ResultSet nh n chi u t BOF n EOF c s thay c ch có th duy t theo m t TYPE_SCROLL_INSENSITIVE Cho phép duy t theo c hai chi u nh ng không th y i d li u c a ng i dùng khác cs TYPE_SCROLL_SENSITIVE Cho phép duy t theo c hai chi u nh ng th y thay i d li u c a ng i dùng khác Sau ây là b ng các giá tr mà tham s ConcurencyType có th nh n Ki u ConcurencyType CONCUR_READ_ONLY CONCUR_UPDATEABLE Cho bi t ResultSet không th c p nh t Cho bi t ResultSet có th c p nh t c c. DELETE b n s d ng ph ng th c executeUpdate() c a i t ng Statement theo m u: stmt. Ví d 2: Xoá các b n ghi c a b ng sinhvien có masv=01 stmt. tensv) values (\“01\”.executeUpdate(DML_SQL_STRING). bi t c s b n ghi c nh h ng b n có th th c hi n theo m u sau: [int recordEffect=] stmt.

0)"). Xoá b n ghi trong CSDL xoá d li u t b ng CSDL b n s d ng ph ng th c executeUpdate c a i ng Statement.executeUpdate( "UPDATE COFFEES " + "SET CP=PC+10 WHERE td=’dh’”). 0. stmt.executeUpdate( "DELETE FROM COFFEES"). 101. Trang 154 . 7. stmt.executeUpdate("INSERT INTO COFFEES VALUES ('Colombian'. ví d b n mu n chèn thêm m t b n ghi vào b ng COFFEES b n làm sau: Statement stmt = con.executeUpdate(“UPDATE sinhvien SET tensv=\”Nguy n V n B\” WHERE masv=01”). nên thông th ng b n s l y v tham chi u n k t t p qu b ng cách: ResultSet rs=stmt. p nh t l i d li u c p nh t l i d li u b n s d ng m nh qua ph n làm stmt. c) Th c thi câu l nh truy v n (Query Language) th c thi câu l nh truy v n b n s d ng ph ng Statement theo m u sau: ng th c executeQuery() c a i ng th c executeUpdate i có trình i h c lên 10 ng UPDATE SQL.99.Ví d 3: a l i tên c a sinh viên có masv=01 thành Nguy n V n B stmt.executeQuery(QUERY_SQL_STRING). Trong ó: stmt: là m t i t ng thu c l p Statement QUERY_SQL_STRING là m t câu l nh truy v n d li u rs là m t i t ng c a l p ResultSet Chú ý: Ph ng th c executeQuery tr v m t t p k t qu t CSDL c ch a trong i ng ResultSet. Ví d b n mu n t t c các b n ghi c a b ng COFFEES b n làm sau: Statement stmt = con. Thêm b n ghi vào b ng CSDL chèn d li u vào b ng b n s d ng ph ng th c executeUpdate c a i t ng Statement. th c thi chúng thông Ví d 4: b n mu n c ng thêm ph c p cho t t c các ng ResultSet rs=stmt.createStatement().createStatement().executeQuery(QUERY_SQL_STRING).

executeQuery(query). tu theo ki u d li u c a c t mà b n s d ng ph ng th c getXXX t ng ng. PRICE FROM COFFEES".next()) { // s d ng ph ng th c getString vì c t //COF_NAME có ki u VARCHAR String s = rs. while (rs.Ví d sau l y v t t c các b n ghi c a b ng SinhVien và hi n th ra màn hình ResultSet rs=stmt. ph ng th c tr true n u vi c di chuy n là thành công ng c l i cho false Di chuy n con tr v b n ghi tr c b n ghi hi n t i.executeQuery(“SELECT * FROM SinhVien”)..getString("COF_NAME"). ho c di chuy n v phía sau pos b n ghi so v i b n ghi hi n t i n u pos là s d ng relative(int pos) d ng các ph ng th c getXXX Ta s d ng ph ng th c getXXX nh n v giá tr hi n t i c a m t c t t ng ng.getFloat("PRICE"). ph ng th c tr v true n u vi c di chuy n là thành công ng c l i cho false Di chuy n con tr v b n ghi u tiên trong t p b n ghi. ResultSet rs = stmt. ví d n u t có ki u là VARCHAR thì b n s d ng ph ng th getString Ví d : li t kê t t c các b n ghi c a b ng COFFEES String query = "SELECT COF_NAME. float n = rs. ho c di chuy n v b n ghi th pos tính t b n ghi cu i cùng n u pos là s â Di chuy n con tr v tr c b n ghi hi n t i pos b n ghi n u pos là s âm. // S d ng ph ng th c getFloat vì c t PRICE có ki u float Trang 155 . While(rs. ph c l i cho false ng th c tr v true n u vi c di chuy n là thành công ng Di chuy n con tr v b n ghi cu i cùng trong t p b n ghi. ph ng th c tr v true n u vi c di chuy n là thành công ng c l i cho false Di chuy n con tr v tr c b n ghi u tiên trong t p b¶n ghi Di chuy n con tr v sau b n ghi cu i cùng trong t p b n ghi Di chuy n con tr v b n ghi th pos tính t b n ghi u tiên n u pos là s d ng.next()) { //. X lý t p k t qu } d) X lý t p k t qu ResultSet Các ph ng th c dùng di chuy n con tr Các ph ng th c sau dùng di chuy n con tr : Ph next previous last first afterLast beforeFirst absolute(int pos) ng th c Ý ngh a Di chuy n con tr sang b n ghi k trong t p b n ghi.

b i float n = rs.out.getFloat(2) Sau dây là b ng các ph ng th c t ng ng v i ki u d li u SQL T S I B R F D D N B C V L B V L D T T I MN I E L O E U I H A O I A O A I I N A T G A O U C MT A R N N R N T MM Y L E I L A B I E I L GN N I E T T N R T T L MR E A I L C R C GA B GE E E HV R I V A A Y N A R R C H A R A R R B Y I N A R Y getByte getShort getInt getLong getFloat getDouble getBigDecimal getBoolean getString getBytes getDate Trang 156 x x x X x x x x x x x x x x x x x X x x x x x x x x x x x x x X x x x x x x x x x x x x x X x x x x x x x x x x x x x X x x x x x x x x x x x x x X X x x x x x x x x x x x x x X X x x x x x x x x x x x x x X x x x x x x x x x x x x x X X x x x x x x x X X x X x S T A M P .getString(1). b i String s = rs.getFloat("PRICE"). } Chú ý: B n có th s d ng th t c t khi l y v d li u thay cho tên c t Ch ng h n trong ví d trên b n có th thay String s = rs.System.getString("COF_NAME"). Và float n = rs.println(s + " " + n).

updateString(“tensv”. th nên các ResultSet này c n ph i là các ResultSet c p nh t c. u b n c n ph i chú ý là ta c p nh t d li u c a b ng thông qua các ResultSet.0 th c hi n c ng công vi c ó.updateRow(). T ng t nh ph ng th c getXXX() khi ta nh n thông tin t b ng. // gán gía tr m i cho c t tensv rs.updateString(“tensv”.updateString(). ph ng th c updateRow() có nhi m v ghi l i s thay i i v i v i hàng hi n t i ( ang s a) vào trong b ng CSDL trên a.first(). c ch c p nh t này ch có tác d ng i v i n ghi hi n hành. Ta có các ph ng th c updateXXX() khác nhau ng v i các ki u d li u mà JDBC tr . Nh updateFloat(). // gán gía tr m i cho c t tensv rs. Trong ph n này ta s d ng các ph ng th c trong JDBC 2. Nh v y khác v i các l nh SQL-DML.cancelRowUpdate(). Khi g i ph ng th c này các thay i do g i ph ng th c updateXXX() k t sau câu l nh updateXXX() l n tr c s b vô hi u hoá. thì ta có ng ng. Ví d : p nh t ResultSet rs. Ta c ng có m t ph ng th c t ng t nh ph ng th c rollback() là ph ng th c cancelRowUpdate(). // Nh y n b n ghi cu i cùng rs.DML c p nh t tr c ti p vào b ng c a CSDL. // Hu b vi c c p nh t trên Thêm b n ghi m i Trang 157 . n xác nh n vi c c p nh t b ng ph ng th c updateRow(). … Sau khi gán gía tr cho các tr ng b ng các ph ng th c updateXXX() t ng ng. “Nguy n Van H ng”).last(). // Nh y n b n ghi u tiên rs. // Xác nh n s thay i rs. Ph ng th c này ho t ng ng t nh ph ng th c commit(). “Nguy n Van t”).getTime getTimestamp getAsciiStream getUnicodeStream getBinaryStream getObject th s d ng ph Trong b ng trên v trí trí ánh “X” thì ph x x x x x x x x X x x x x x X x x x x x X X x x x X x x x x x x x x x x x x x x x x x x x c ánh “x” trên hàng c a ph ng th c getXXX.updateInt(). Th nên s a l i b n ghi nào b n ph i di chuy n con tr b n ghi vào n ghi c n s a b ng m t trong các ph ng th c ã li t trong ph n tr c. v ng th c này nh n v giá tr c a c t có ki u d li u t ng th c s d ng thích h p nh t ng th c ó là ph p nh t t p ResultSet Trong ph n tr c ta dùng các l nh SQL.

5.updateDate("namsinh". // N p trình ng th c insertRow() u kh ên Connection cn=DriverManager. // c 2: Gán gía tr cho các c t b ng ph ng //updateXXX() t ng ng rs. // c 1: Di chuy n con tr n b n ghi t m thêm m i rs.TYPE_SCROLL_SENSITIVE."005").forName("sun.CONCUR_UPDATABLE)."Nguy n T Hào").moveToCurrentRow(). Khi ó n u c t ó có thu c tính không cho phép nh n gía tr NULL thì b n s nh n c m t ngo i l SQLException. Ví d : Thêm b n ghi vào ResultSet Class. //L y v t p ResultSet rs. M t ResultSet c p nh t Th c ch t nó ch là m t vùng m thêm các b n ghi trong b ng.jdbc. Xoá b n ghi xoá m t b n ghi b n có th s d ng các l nh SQL-DML. b n có th th c hi n vi c này b ng các ph ng th c c a i t ng ResultSet.new Date(2004. Tuy nhiên hu b vi c thêm m i b n ch c n di chuy n con tr b n ghi ra kh i b n ghi t m b ng m t trong các ph ng th c di chuy n chu ên con tr .odbc. c bi t g i là insertrow dùng cho vi c thêm m t b n ghi m i. Sau khi ch c ch n r ng các giá tr thêm vào là úng. + Không có ph ng th c ta hu b vi c thêm m i b n ghi.30)).Ngoài vi c s d ng các l nh SQL-DML th thêm chúng b ng cách thông qua các ph c.JdbcOdbcDriver").updateString("tensv".createStatement(ResultSet. Các b c xoá m t b n ghi kh i ResultSet Trang 158 .updateString("masv".executeQuery("SELECT * FROM sinhvien"). ta còn có ng th c c a it ng ResultSet c p nh t c luôn t n t i m t b n ghi thêm m t b n ghi m i. // L y v k t n i Statement st=cn.getConnection("jdbc:odbc:t"). Các b c thêm m t b n ghi m i vào t p ResultSet Di chuy n con tr n b n ghi t m insertrow b ng ph ng th c moveToInsertRow().insertRow(). B n ghi này không là m t thành ph n c a ResultSet. rs. ResultSet. // c 3: Xác nh n s thêm m i Chú ý: + u khi gán giá tr cho các c t mà ta b sót m t s c t không gán giá tr khi ó các t ó s nh n các giá tr NULL. Th c hi n vi c n các giá tr vào các c t t ng ng b ng các ph ng th c updateXXX(). //T p ResultSet có th c p nh t c ResultSet rs=st. rs. Ta g i ph xác nh n vi c thêm m i b n ghi vào b ng và ResultSet.

trong tr ng h p này b t bu c b n ph i s d ng truy v n tham s hoá. công vi c này m t r t nhi u th i gian. rs. n u b n c n chèn 100 dòng vào CSDL.executeUpdate(). int [] salesForWeek = {175. n b n ghi c n xoá u kh ên mà vi c xoá c th c hi n ngay hay ch là ánh d u ng th c deleteRow(). 60. String [] coffees = {"Colombian". updateSales.last().setInt(1. rs. S d ng i t ng Prepared Statements Khi nào s d ng i t ng Prepared Statements?. tuy nhiên i t ng Statement l i không h tr truy v n tham s hoá Ví d : Sau c p nh t m t s dòng c a b ng COFFEES s d ng i t ng Prepared Statements PreparedStatement updateSales. 155.ôi khi b n mu n th c hi n m t l nh SQL mà các thông s c th l i ch a bi t.deleteRow(). do v y ph i t 100 l n phân tích l nh. String updateString = "update COFFEES set SALES = ? where COF_NAME like ?". "French_Roast".length. câu tr l i c phân tích sau: . b n s t câu h i có các nào mà ch n phân tích l nh. Chú ý: Tu vào trình Ví d : Xoá b n ghi rs. salesForWeek[i]). for(int i = 0. int len = coffees. rs. t i u l nh ch m t l n mà thôi. coffees[i]). th thì b n ph i s d ng 100 l nh executeUpdate chèn 100 dòng. Trang 159 .first().setString(2. bi t ch c ch n b n nên tham kh o tài li u i kèm v i Driver b n s d ng.deleteRow(). "Colombian_Decaf".absolute(3). i++) { updateSales.prepareStatement(updateString). i < len. updateSales = con. vâng cách ó chính là i t ng Prepared Statements. 90}. "French_Roast_Decaf"}. rs. // Xóa b n ghi u tiên // Xoá b n ghi th 3 // Xoá b n ghi cu i cùng 2. "Espresso". . rs.Di chuy n con tr i ph xoá.deleteRow(). sau ó i u l nh SQL. updateSales. 150.M i khi th c thi m t l nh SQL thì DBMS l i ph i phân tích l i cú pháp c a l nh. 100 l n t i u hoá l nh.

Nh n mã sau: con.setAutoCommit(false). updateTotal.commit. Qu n lý giao d ch Khi m t k t n i c t o. 50).executeUpdate(). Ví d : // T t ch auto-commit con.setInt(1. CallableStatement cs = con. G i th t c executeXXX() t ng ng th c thi th t c l u tr . có th g i m t th t c l u tr tr c tiên b n t o ra m t i t ng CallableStatement c l u tr n i Các b c: 1. updateTotal. PreparedStatement updateTotal = con. t c là nó t ng commit sau khi th c thi thành công m t l nh n. it ng này có ph ng th c prepareCall giúp b n có th g i th VI.setInt(1.commit b n có th quy t nh commit hay rollback l i m t nhóm nh. Ví d : L p truy c p AccessDriver Trang 160 . // t l i ch auto-commit con. value) + Th c thi truy v n v i các tham s v a cung c p b n g i ph ng th c executeUpdate() a i t ng prepareStatement. 50). updateTotal.setString(2.prepareCall("{call tên_th _t c_l u_tr }"). "Colombian"). tuy nhiên b n có th tl i ch auto. updateSales. "Colombian").} Nh b n th y qua ví d trên : + L yv i t ng PreparedStatement b n s d ng ph ng th c prepareStatement a i t ng Connection và truy n vào m t câu l nh SQL ch a tham s + Gán giá tr cho các tham s b n s d ng ph ng th c setXXX(index.prepareStatement( "UPDATE COFFEES SET SALES = ? WHERE COF_NAME LIKE ?"). // tác ng lên CSDL PreparedStatement updateSales = con. updateSales.commit().setAutoCommit(false). nó c t trong tr ng thái auto.prepareStatement( "UPDATE COFFEES SET TOTAL = TOTAL + ? WHERE COF_NAME LIKE ?").setString(2. G i th t c l u tr b ng JDBC JDBC cho phép b n g i m t th t c l u tr trong CSDL. updateSales. 3. 2.setAutoCommit(true). // Xác nh n commit con. t trong ng d ng vi t ng java.executeUpdate().

PreparedStatement pst = conn.execute(). rs.prepareStatement("Insert into test(a. } try { Properties pro = new Properties().forName("sun.util. if (rs. "Cap nhat du lieu bang 455454ResultSet").getColumnCount().updateRow().b) values (?. //Updatable test ResultSetMetaData rd = rs.absolute(3). for (int i = 1.println("Start----->rd.print("Error: " + ex. //st.deleteRow(). "rs.import java.executeQuery(sql).println("Rs.out. //PreparedStatement interface thuc thi sql co tham so dau vao System.put("charSet".getConcurrency() == ResultSet. st.jdbc. rs.moveToInsertRow().getMessage()).JdbcOdbcDriver"). pro).print(rd.updateString("b". //Nap trinh dieu khien Access } catch (ClassNotFoundException ex) { System.getMetaData(). import java. pst.println("Rs is Updatable"). //rs. ResultSet rs = st.*. // st.println("Rs is ReadOnly").CONCUR_UPDATABLE) System.setString(1. st.insertRow().?)"). "UTF8").mdb".sql.odbc.executeUpdate("Delete from test where a='12'"). i++) //return feildName System.out.*.ResultSet.out. "0021"). pst. Statement st = conn.*. //ma unicode String urldb ="jdbc:odbc:Driver={Microsoft Access Driver (*.moveToCurrentRow().mdb)}. rs.'Nguyen Xuan Truong')"). "Tran Thi Hong Ha").IOException{ try { Class.CONCUR_UPDATABLE).executeUpdate("update test set b='dhrhrtr' where a='0021'").b text(255))").updateString("a".out.out.out. rs.getColumnLabel(i) + ( (i == cols) ? "\n" : "\t")). //Xoa du lieu bang ResultSet rs.update").TYPE_SCROLL_SENSITIVE.setString(2. Connection conn = DriverManager.println(yes). System. //System.absolute(1) " + rs. i <= cols.io.getColumnLabel"). import java.executeUpdate( "Insert Into Test(a.createStatement(ResultSet. boolean yes = pst.executeUpdate("Create Table Test (a text(10).out. public class AccessDriver { public static void main(String[] args) throws SQLException.getString(1)). else System.b) values ('1234'. String sql = "Select * from test". //lay ve tap ban ghi //cap nhat du lieu bang ResultSet // rs. rs. pro. Trang 161 .DBQ=c:/data. int cols = rd.getConnection(urldb.

getString(2)).sqlserver. } rs.next()) { //hien thi thong tin.out. } } } Ví d : L p truy c p SQLDriver import java. } rs.*.out. } System.println("--------------------------------").password=secret String url="jdbc:microsoft:sqlserver://xuantruong:1433. Statement st=conn.getMessage()).println("End----->rd.close(). //in nguoc lai while (rs.close().println(rs.SQLServerDriver").getString(1)+"\t\t"+rs. } catch(SQLException ex){ System.out.println("OK").close().exit(0).System.out. in xuoi System.createStatement(). } } Ví d :L p truy c p JdbcOdbcDriver Trang 162 .out. conn.getMessage()).last().out.getString("b")).out.getString("a") + " " + rs.out.microsoft. while(rs.next()){ System.executeQuery("Select * from tblSach").out.DatabaseName=BOOK.passwor d=".getColumnLabel"). } //jdbc:microsoft:sqlserver://server1:1433. System.getConnection(url).sql.println(rs.close(). while (rs.exit(0). } System. } catch (SQLException ex) { System.user=sa. ResultSet rs=st.user=test. rs. System.getString("a") + " " + rs.forName("com.println("Can not load driver " +ex.getMessage()).jdbc. conn.println("Can not connection to database " + ex.print("Error: maxlenght 10 " + ex. try{ Connection conn=DriverManager.getString("b")). } catch(ClassNotFoundException ex){ System.println(rs.previous()) { System. public class SQLDriver { public static void main(String []a){ try{ //Nap trinh dieu khien SQLServer Class.

//Cap nhat du lieu (Tang luong cho cac cong nhan) String sql2="UPDATE Khachhang SET Luong=Luong+luong*0.out. import javax. stmt. ResultSet rs=stmt.welcome.println("Ket noi CSDL").getString("DiaChi").SQLException { System.*."password").JdbcOdbcDriver").out.getInt("Id").} } } Trang 163 .executeQuery(sql).getDouble("Luong"). String s=rs.executeUpdate(sql2).println("Co "+ n +" ban ghi nao duong cap nhat").*. System.DiaChi.out.TenKH.Luong FROM KhachHang".package com. Statement stmt=conn. else System. while (rs. int n=stmt.'HP'. String d=rs.'900')". //Them record vao bang String sql0="INSERT INTO KhachHang(Id.DiaChi.sql.'Hoang Anh'. try{ Class. } } catch(SQLException e) {System.println("ID=" +id +" " + s+ " " + d + " Luong=" + l) .borland. import java.getConnection(url.1". Connection conn=DriverManager.odbc. public class Connect { public static void main(String args[]) throws ClassNotFoundException."login".createStatement(). double l=rs. if (n < 1) System.jdbc.out.next()) { int id=rs.out.TenKH. String url="jdbc:odbc:myDatabase". //Doc Record ra mh String sql="SELECT Id.getString("TenKH").sql.Luong) VALUES('8'.println("Khong co ban ghi nao duong cap nhat").samples.forName("sun.executeUpdate(sql0).println("Loi thao tac CSDL").

Gi i thi u Socket Socket là m t giao di n l p trình ng (API . multicash… . chúng ta g i/ nh n d li u gi a 2 máy. có th t ng t ng.net II. nh danh này ph i là duy nh t. Trong mô hình này server s d ng l i g i listen và accept l ng nghe và ch p nh n m t yêu c u k t n i 2. TPC. nh danh này c th hi n b ng a ch IP ho c a ch d i d ng Trang 164 . Socket là m t s tr u t ng hoá m c cao.Giao th c. có th s d ng Socket liên l c theo mô hình Client/Server. UDP…. a ch d ng tên mi n.Cách ánh a ch IP. t ng t nh vi c c/ ghi trên t p tin.Application Program Interface) d ng ng. có 2 ki u liên l c tu thu c vào ch k t n i: a) Liên l c trong ch không k t n i: Hai ti n trình liên l c v i nhau không k t n i tr c ti p i thông p g i i ph i kèm theo a ch c a ng i nh n Hình th c liên l c này có c m: ng i g i không ch c ch n thông p c a h có n tay ng i nh n không t thông p có th g i nhi u l n thông p g i sau có th n ích tr c thông p g i tr c ó b) Liên l c trong ch k t n i: Có m t ng k t n i “ o” c thành l p gi a 2 ti n trình. thông qua giao di n này ta có th l p trình u khi n vi c truy n thông gi a 2 máy d ng các giao th c m c th p nh TCP. Kh o sát m t s l p trong gói java. L p InetAddress i m t máy khi tham gia truy n thông c n ph i có m t nh danh. c th l p Socket cung c p cho ta c ch liên l c trong ch k t n i (s ng giao th c TCP) và l p DatagramSocket cho phép các ng d ng m ng liên l c v i nhau trong ch không k t n i (s d ng giao th c UDP).Phân bi t c s khác nhau.net 1. ta c n ti n hành các thao tác: . và ng c l i -M ts a ch c bi t: a ch l p.C ng giao th c . L p trình Socket trong java Java cung c p m t s l p cho phép các ng d ng m ng có th trao i v i nhau qua ch Socket. a ch này chính là a ch c a máy mà nó c n liên l c + Th c hi n vi c liên l c. giao th c chuy n i a ch IP thành a ch tên mi n. UDP . yêu c u t i thi u các b n ph i n m c 3 giao th c : IP. nó nh là m t thi t b truy n thông 2 chi u t ng t nh t p tin. liên l c thông qua Socket. tr c khi m t k t n i c thành l p thì m t trong 2 ti n trình ph i i ti n trình kia yêu c u k t n i.T o l p hay m m t Socket + G n m t Socket v i m t a ch . gi ng nhau gi a 2 giao th c TCP và UDP 1. t t c các l p liên quan n vi c p trình Socket c java nhóm l i và trong gói java. a ch broadcash.Ch ng 8: L P TRÌNH SOCKET I. Các ki n th c liên quan Tr c khi b t u h c bài này các b n c n c l i các ki n th c liên quan sau: .

tên này là m t xâu kí t d i d ng tên mi n ho c a ch IP Tr v a ch IP c a máy ch ng InetAddress k t h p v i chính Tr v tên c a máy ch Tr v it máy ó Ki m tra xem a ch này có ph i là Multicast không a ch Chú ý: Trong gói java. Có m t s ph ng th c sau mà b n c n i d ng m ng byte Tr v m ng i t ng InetAddress. V y th thì làm th nào a ch máy ó d ng t xa ho c nhà cung c p d ch v Internet. p InetAddress cung c p m t s ph ng th c t nh (static) dùng i d ng tên mi n thành quan tâm: Ph ng pháp So sánh 2 yv it ng a ch IP d Mô t Public void equals( Object obj) Public byte[] getAddress() public static InetAddress[] getAllByName(String host) throws UnknownHostException public static InetAddress getByName(String host) throws UnknownHostException public String getHostAddress() public String getHostName() public static InetAddress getLocalHost() throws UnknownHostException public boolean isMulticastAddress() a ch IP và ng c l i. L p InetAddress bi u th cho m t liên l c v i m t máy xa. câu tr l i là l p InetAddress ã làm u ó cho ta. ôi khi ta không th bi t chính xác vì nhi u nguyên nhân khác nhau nh : máy ó kh i ta l i có 1 a ch IP khác nhau. nên ph ng th c này tr v m t m ng ch a t t c các a ch t ng ng v i tên mi n. do v y m i l n k t n i vào nhà cung c p d ch v ISP ta có th liên l c v i máy a ch d ng tên mi n chuy n i d a ch xa khi ta ch bi t i d ng tên mi n?. vì m t máy có th có nhi u a ch IP (do có nhi u card ng). Tr l i i t ng InetAddress có tên c ch ra. Trang 165 . khi ta mu n a ch IP c a máy xa. tuy nhiên a a ch IP c a máy ó.net. ta ph i bi t c a ch c a m t máy nào ó. nó g m t t c các thành ph n c a l p InetAddress Ta c n thêm m nh import p java. l p này t ng chuy n thành a ch IP và ng c l i.net còn l p Inet4Address và l p Inet6Address hai l p này th hi n cho các a ch IP version 4 và IP version 6. b i c n i vào ch IP thì r t khó nh .tên mi n.InetAddress tr c khi có th s d ng nó.

getByName("www.101.0. } } } ng ng v i máy c c b : t qu ch y ch ng trình nh sau: Trang 166 .getByName("192.vn/127.*.println(address). t o ra m t InetAddress u v n không tìm th y nó s c g ng k t n i tên này thành ngo i l UnknownHostException. n u không tìm th y nó tìm ti p trong t p host. System. th nên b n c n Ví d 1: Minh ho cách s d ng các ph import java.net. } } } t qu ch y ch ng trình nh sau: www.*.theht. Ví d 2: T o ra m t InetAddress t import java.out.168. } catch (UnknownHostException ex) { System.1Ngoài cách truy n vào ph ng th c getByName m t xâu ký t th hi n tên máy b n ta th truy n vào m t xâu th hi n a ch IP c a máy nh sau: InetAddress address = InetAddress.out..edu. class InetAddress1 { public static void main(String[] args) { try { ng th c getByName InetAddress address = InetAddress. n máy ch DNS yêu c u phân gi i a ch IP.1").println(address).theht.").theht. n u không th phân gi i c tên này thì nó s sinh ra m t t chúng vào m t kh i try .0.vn").println("Could not find this computer's address. System.getLocalHost(). class MyAddress { public static void main(String[] args) { try { InetAddress address = InetAddress.println("Could not find www.catch.edu. } catch (UnknownHostException ex) { System.edu.net.out.out.vn").Ph ng th c getByName s có g ng phân gi i tên mi n thành a ch IP t ng ng b ng cách: Tr c tiên nó i tìm trong cache.

} } catch (UnknownHostException ex) { System.getAllByName("www. Ví d 4: y v tên máy khi bi t a ch IP c a nó. } catch (Exception ex) { System.vn /162.vn /3.theht.edu.vn").edu.0.println("Could not find www.theht.vn /10.101.*.152.err.theht. b i InetAddress. l y v tên c a máy ta s d ng ph ng th c getHostName nh sau: import java. t ng ng v i m i card m ng tôi t m t d a ch IP cho nó.net. u máy c a b n có n i m ng Internet b n có th ki m tra xem máy ch www.out.101. System.getAllByName("www.theht.edu.25s d cho k t qu nh trên là do máy c a tôi có cài 4 card m ng.5www. class AllAddressesOfTheht { public static void main(String[] args) { try { InetAddress[] addresses = InetAddress.println(ex).168.edu.10.163.theht1/192.net. } } } Trang 167 .vn /192.microsoft.theht.2www.out.println(ia.vn").theht.getByName("162.5").1www.theht.com c a Microsoft c cài bao nhiêu b giao ti p m ng b ng cách thayInetAddress.getAllByName("www. for (int i = 0.0.168.163.edu.println(addresses[i]).10.com").vn"). } } } ng ng v i a ch IP cho t ng card m ng ó: t qu ch y ch ng trình nh sau: www.1Ví d 3: N u máy b n có cài nhi u card m ng b n có th l y v m t ng các InetAddess t import java.out. class ReverseTest { public static void main(String[] args) { try { InetAddress ia = InetAddress.microsoft. i < addresses.edu.90.getHostName()).*.edu.length. i++) { System.

println("My address is " + dottedQuad). } catch (UnknownHostException ex) { System. String dottedQuad = me. I don't know my own address."). } } } t qu in ra nh sau: Address is 192.101.theht.println("I'm sorry. System. l yv a ch IP c a máy ta s ng th c getHostAddress nh sau: t qu in ra nh sau: My address is 192.theht.out.microsoft.101.out. String dottedQuad = me."). } } } ch IP c a máy khi bi t tên c a máy.*.edu.println("Address is " + dottedQuad). System.1Ta có th l y v a ch IP t ng ng v i m t tên mi n b t k không nh t thi t là máy c c b nh trên.net. class GetHostAddress { public static void main(String[] args) { try { InetAddress me = InetAddress. I don't know my own address.168.getHostAddress(). } catch (UnknownHostException ex) { System.com nh sau: import java.out.getLocalHost().vn ho c www.1 Trang 168 .*. ch ng h n b n có th l y v ch IP c a máy www.vn").168.net.out. class GetHostAddress1 { public static void main(String[] args) { try { InetAddress me = InetAddress.edu.println("I'm sorry.getByName("www.t qu ra nh sau: theht Ví d 5: L y v ng ph import java.getHostAddress().

theht. } else { System.*. public class HostLookup { public static void main(String[] args) { if (args.*. if (add1. i++) { System. ch ng trình này có nhi m v khi b n gõ vào a ch IP thì nó s tr v a ch tên mi n và ng c lai: import java.println("Hai dia chi nay khac IP"). ki m tra n th c equals nh sau: class Equal { public static void main(String args[]) { try { InetAddress add1 = InetAddress. InetAddress add2 = InetAddress.out.equals(add2)) { System. } } else { BufferedReader in = new BufferedReader(new InputStreamReader(System.theht.com. } } } t qu cho nh sau: Hai dia chi nay khac nhau Ví d 7: Xây d ng ch ng trìn HostLookup t ng t nh ch ng trình NSLookup c a Windows.length. Trang 169 .getByName("www."). } } catch (UnknownHostException ex) { System.net.length > 0) { // Su dung tham so dong lenh for (int i = 0.*.getByName("www. import java.io.println(lookup(args[i])).out.net.println("Khong the tim thay host.out.edu.println("Hai dia chi nay co cung IP").vn"). a ch tên mi n có cùng m t a ch IP hay không.Ví d 6: Ki m tra xem hai u này ta s d ng ph import java.vn").in)).out. i < args.

equalsIgnoreCase("exit") || host.println( "Enter names and IP addresses. } catch (UnknownHostException ex) { return "Cannot find host " + host. i < ca.println(ex).System.getHostName(). i++) { a ch IP Trang 170 . try { while (true) { String host = in. for (int i = 0. try { node = InetAddress.out.out.getHostAddress().readLine().length. } System.Enter \"exit\" or \"quit\" to quit. } else { // Dia chi nay duoi dang IP return node.println(lookup(host)). } if (isHostname(host)) { //Dia chi nay duoi dang ten mien return node.getByName(host). } } catch (IOException ex) { System. } } } private static String lookup(String host) { InetAddress node. } } //Hàm ki m tra xem a ch host d i d ng tên mi n hay private static boolean isHostname(String host) { char[] ca = host.err. if (host.equalsIgnoreCase("quit")) { break.toCharArray().").

// secure http // file transfer protocol testProtocol("ftp://metalab. } } return false.if (!Character. // telnet testProtocol("file:///etc/passwd").org.')return true. } } 2.err. nh d ng c a d li u ho c không c n quan tâm n cách giao ti p v i máy ch .unc.edu/").za/"). Có sáu hàm t o khác nhau c a l p URL cho phép b n t o ra các URL v i các yêu c u khác nhau.vn/").org").utehy. // Simple Mail Transfer Protocol testProtocol("telnet://dibner. T t c các hàm t o này u ném ra ngo i l MalformedURLException n u b n t o ra m t URL t m t giao th c không c h tr ho c các thông tin cung c p trong URL không chính xác thì b n s nh n c m t ngo i l MalformedURLException a) T o ra m t URL t m t xâu public URL(String url) throws MalformedURLException Gi ng nh các hàm t o khác b n ch c n dùng toán t new và c ng gi ng các hàm t o khác a l p nó ném ra ngo i l MalformedURLException.com/exec/obidos/order2/"). } Ví d 2: Ví d này t o ra m t s URL và ki m tra xem giao th c t ng ng v i các URL có c h tr trong virtual machine c a b n hay không /* Which protocols does a virtual machine support? */ import java.poly.edu"). // hypertext transfer protocol testProtocol("https://www.net.println(ex). testProtocol("mailto:elharo@metalab. o ra m t URL Không gi ng nh i t ng InetAddress b n có th s d ng hàm t o c a l p URL t o ra t i t ng URL m i.adc. } catch (MalformedURLException ex) { System.isDigit(ca[i])) { if (ca[i] != '. mà b n không c n ph i quan tâm n giao th c c s d ng.edu.unc. // local file access testProtocol("gopher://gopher.*. class ProtocolTester { public static void main(String[] args) { testProtocol("http://www.anc.amazon.edu/pub/languages/java/javafaq/"). Ví d 1: T o ra m t URL t m t xâu và b t ngo i l sinh ra try { URL u = new URL("http://www. L p URL và URI L p URL là m t l p r t n gi n giúp b n trong vi c nh v và l y v d li u t ng. // gopher testProtocol( // Lightweight Directory Access Protocol Trang 171 .

html").println(u.unc. System. tên máy ch .microsoft. public URL(String protocol.com/index.html").edu:3306/NEWS").com".unc. tu theo giao th c mà b n ch nh nó s s d ng mà giá tr m c nh này là khác nhau: Ví d nh : http thì port=80. ng m c nh là 80 Trang 172 .adc. testProtocol("verbatim:http://www.adc.indexOf(':')). } private static void testProtocol(String url) { try { URL u = new URL(url). String file) throws MalformedURLException Hàm t o này s t ng t port là giá tr m c nh.umich..poly. // custom protocols for HotJava testProtocol("netdoc:/UsersGuide/release.jar!" + "/com/macfaq/io/StreamCopier. p tin mà URL này s d ng."ldap://ldap.class"). a custom protocol for remote method invocation testProtocol("rmi://metalab. testProtocol( // JAR "jar:http://cafeaulait.org/+/index.metalab.substring(0.getProtocol() + " is supported"). } catch (MalformedURLException ex) { // All VMs should recognize http } n ch ng trình trên t o ra m t URL ch n http://www. chúng cho bi t: Giao th c. System.out.edu/RenderEngine"). } } } t qu ch y trên máy c a tôi nh sau: http is supported https is supported ftp is supported mailto is supported b) T o ra m t URL t các ph n riêng l Hàm t o này cho g m ba ph n riêng bi t.c=US?postalAddress").edu/o=University%20of%20Michigan. "/index.microsoft.html").println(protocol + " is not supported").itd. testProtocol("nfs://utopia. Ví d : try { URL u = new URL("http". // NFS.out.. testProtocol("doc:/UsersGuide/release.edu/usr/tmp/"). ftp=23.org/").html"). url.org/books/javaio/ioexamples/javaio. } catch (MalformedURLException ex) { String protocol = url. testProtocol("systemresource://www. String hostname. "www. // a custom protocol for JDBC // rmi. Network File System testProtocol("jdbc:mysql://luna.html.

Ví d nh : http=80. .public String getRef( )..public String getFile( ) tr v tên t p tin .ibiblio.public String getUserInfo( ) // Java 1.org/javafaq/ mailinglists.err. String file) throws MalformedURLException Ví d : T o ra m t URL gán v i máy localhost trên c ng 8080 try { URL u = new URL("http".ibiblio. .html.ibiblio. } catch (MalformedURLException ex) { System.html"). "/index.getQuery( )). "localhost". ng d n này th ng là t query string.println(ex). 8080. } Trong ví d này thì u1 ang tr n http://www. String relative) throws MalformedURLException Ví d : try { URL u1 = new URL("http://www.getRef( )). int port.html").phtml?category=Piano").3 tr v m t query string trong URL Ví d : Trong ví d này thì getQuery s tr v category=Piano URL u = new URL( "http://www.org/javafaq/javafaq. t vài ph ng th c c a l p URL . URL u2 = new URL (u1. } catch (MalformedURLException ex) { System.3 Trang 173 .public String getPath( ) // Java 1.org/javafaq/index.ibiblio.public int getPort( ) tr v c ng c s d ng . String host.org/javafaq/index.org/nywc/compositions.html#xtocid1902914").3 tr v ng d n n file. . ftp=23.t o ra m t URL v i m t c ng ch nh b n s d ng hàm t o sau: public URL(String protocol.3 tr v user name .public String getAuthority( ) // Java 1. .out.public int getDefaultPort( ) tr v c ng m c nh c a giao th c c s d ng.out. System. } Ví d này t o ra m t URL tr n http://localhost: 8080/index.html c) T o ra m t URL t m t URL khác Hàm t o này cho phép b n t o ra m t URL t m t URL khác.html").println("The query string of " + u + " is " + u.public String getQuery( ) // Java 1.public String getHost( ) tr v tên c a máy ch .println(ex). "mailinglists. System. email=25.html còn u2 thì ang tr n http://www.. cú pháp nh sau: public URL(URL base.err.ibiblio.println("The fragment ID of " + u + " is " + u. trong ví d sau thì getRef s tr v xtocid1902914 URL u = new URL( "http://www.

sun.println("The host is " + host).3 public final InputStream openStream( ) throws IOException Ph ng th c này s k t n i n máy ch và yêu c u l y v m t InputStream g n v i tài nguyên c ch nh trong URL.getRef()).out. } else { System.getPort()).out.getPath()). } System.println("The scheme is " + u.out.*.5 public Object getContent( ) throws IOException public Object getContent(Class[] classes) throws IOException // 1. System.getProtocol()).getUserInfo()).net.com").println("The host is null.Ví d sau minh ho các ph ng th c trên import java.indexOf('@').println("The user info is " + u."). class URLSplitter { public static void main(String args[]) { try { URL u = new URL("http://java. System.println("The ref is " + u. System.substring(atSign + 1).println().out."). } // end try catch (MalformedURLException ex) { System. String host = u.getQuery()). System.println("The port is " + u.out. System.sun.out.println("The path is " + u.out.comThe port is -1The path is The ref is nullThe query string is nullc) Nh n v d li u t URL n có th nh n v d li u c ch nh trong URL b ng cách s d ng cách ph n th c sau: public InputStream openStream( ) throws IOException public URLConnection openConnection( ) throws IOException public URLConnection openConnection(Proxy proxy) throws IOException // 1.out.sun.getHost(). Trang 174 . System. System.comThe scheme is httpThe user info is nullThe host is java. if (host != null) { int atSign = host.out. if (atSign != -1) host = host.println("The URL is " + u).out.println("The query string is " + u. } // end main } // end URLSplitter t qu ch y ch ng trình nh sau: The URL is http://java. } System.err.println("is not a URL I understand.

// chain the InputStream to a Reader Reader r = new InputStreamReader(in). } catch (IOException ex) { System.println(ex). class SourceViewer { public static void main(String[] args) { try { //Open the URL for reading URL u = new URL("http://localhost:80/index.out.err.read()) != -1) { System.VnTime">Xin chào các b n</font></p></body></html> ng th c public URLConnection openConnection( ) throws IOException Ph ng th c này m m t socket k t n i n máy ch . } } catch (MalformedURLException ex) { System..Ph . charset=iso-88591"><title> Web Posting Information </title></head><body><p><font face="..print( (char) c). int c. } // end try catch (IOException ex) { System. } Trang 175 .Ví d sau l y v n i dung c a trang web c ch nh và in ra màn hình import java. import java. try { URLConnection uc = u. // read from the connection. while ( (c = r.println(ex).jennicam.*. InputStream in = u. } } // end main } // end SourceViewer t qu ch y nh sau: <html><head><meta http-equiv="Content-Type"content="text/html.err.*.err.println( is not a parseable URL"). N u ph ng th c này th t b i nó ném ra ngo i l IOException.err.net.println(ex). Ví d : try { URL u = new URL("http://www.getInputStream( ). InputStream in = uc.openConnection( ).html").io. } } // end try catch (MalformedURLException ex) { System.org/").openStream(). // buffer the input to increase performance in = new BufferedInputStream(in).

getName()). N u Socket không th m vì b t c lý do nào thì nó ném ra ngo i l IOException.1 M t s hàm t o c a l p Socket a) public Socket(String host. System.println("is not a parseable URL").out.html").io. k t qu thu c nh sau: I got a sun.Trong java 1.5 còn m t ph ng th c c n p ch ng nh sau: public URLConnection openConnection(Proxy proxy) throws IOException Ph ng th c này r t h u d ng khi trong m ng c a b n có s d ng proxy .http.*. L p Socket L p này c dùng cho c máy ch và máy khách.net. tên c a máy ch có th là tên mìên ho c a ch IP. class ContentGetter { public static void main(String[] args) { //Open the URL for reading try { URL u = new URL("http://localhost:80/index.awt.getContent().URLImageSource URL 3.html").protocol. i v i máy khách nó th ng dùng t n i n máy ch . } } // end try catch (MalformedURLException ex) { System.getClass(). N u nh không n t i máy này thì nó s ném ra m t ngo i l UnknownHostException.www. b i URL u = new URL("http://localhost:80/print.gif"). 3.HttpURLConnection$HttpInputStreamN u thay u = new URL("http://localhost:80/index. } } // end main } // end ContentGetter t qu ch y nh sau: I got a sun.net.*.image. int port) throws UnknownHostException. còn i v i máy ch nó th ng dùng áp l i k t n i t máy khách. Sau ây là t s hàm t o c a l p Socket. Trang 176 .err. Thông th ng ta t o ra m t Socket b ng cách s d ng hàm t o c a l p Socket.println(ex).println("I got a " + o.Ph ng th c public final Object getContent( ) throws IOException Ví d : import java. Trong hàm t o này tên c a máy là m t xâu ký t . import java. IOException Ta th ng s d ng hàm t o này k t n i n máy ch . } // end try catch (IOException ex) { System. try { Object o = u.err.

135.theht. } catch (IOException ex) { System. 80).Ví d : K t n i n web server www. Ví d : try { InetAddress inward = InetAddress.err. 80. } catch (IOException ex) { System. InetAddress interface. // work with the sockets.. int port.10. // send and receive data.err. int localPort) throws IOException..err...edu. } . //~ InetAddress theht = InetAddress.vn trên c ng 80 try { InetAddress theht = InetAddress. } catch (UnknownHostException ex) { System. u tham s port nh n giá tr 0 thi java runtime s ch n ng u nhiên m t c ng nào ó ch a c s d ng trong kho ng 1024 à65535. inward. //~ Socket toTheht= new Socket("162.163.edu. Ví d sau k t c ng k t n i n máy ch www.theht.println(ex).println(ex). Socket thehtSocket = new Socket(theht . } Trang 177 .println(ex).public Socket(InetAddress host.getByName("theht"). } catch (UnknownHostException ex) { System.err..println(ex).edu. 80).public Socket(String host.err.10.getByName("162.vn".5".5"). int port) throws IOException Ta th ng s d ng hàm t o này k t n i n máy ch khi bi t m t InetAddress g n v i nó.err. // send and receive data. } .edu.. 0). } catch (IOException ex) { System.println(ex).theht.vn"). 80).getByName("www.theht. UnknownHostException N u máy c a b n có nhi u b giao ti p m ng thì khi k t n i n máy ch ta c n ch ra k t n i c thi t l p thông qua giao di n m ng nào.vn try { Socket toTheht= new Socket("www. Socket socket = new Socket("www.theht.edu.println(ex). } catch (UnknownHostException ex) { System.vn".

Socket socket = new Socket(http. 80).err.getPort( ). } catch (IOException ex) { System. try { Socket theSocket = new Socket("java.com".println(ex). } // end try catch (UnknownHostException ex) { System.err. // work with the sockets.getInetAddress( ).err.println(ex). System. System. } .println("Connected on remote port " + port).println(ex).theht. } catch (UnknownHostException ex) { System.public Socket(InetAddress host. int port = theSocket. } catch (IOException ex) { System..edu.sun.err.getByName("www. InetAddress http= InetAddress.println(ex).println(ex).vn").. } // end try catch (UnknownHostException ex) { System. inward. 0). InetAddress host = theSocket. L y v thông tin g n v i Socket .err. 80.sun.err. } Trang 178 . int port. 80).getByName("theht").println(ex). Ví d : try { InetAddress inward = InetAddress.println("Connected to remote host " + host).2.out. } 3. InetAddress interface.Ph ng th c public int getPort( ) dùng l y v c ng c a máy remote.out.com". int localPort) throws IOException Hàm t o này c ng t ng t nh hàm t o trên.Ph ng th c public InetAddress getInetAddress( ) dùng l y v i t ng InetAddress ng ng v i máy remote. } catch (IOException ex) { System. Ví d : try { Socket theSocket = new Socket("java..

out. } .println("Connecting from local address " + localAddress). Ví d : try { Socket theSocket = new Socket("java.getLocalPort( ).getPort() + " from port " + theSocket. } // end try catch (UnknownHostException ex) { System.err.*.getLocalAddress()). public class SocketInfo { public static void main(String[] args) { try { Socket theSocket = new Socket("www.getInetAddress() + " on port " + theSocket. } Ví d sau in ra màn hình m t s thông tin g n v i Socket import java.println("Connected to " + theSocket.getLocalAddress( ).err.println("Connecting from local port " + localPort).err.println(ex).io.*.Ph ng th c public InetAddress getLocalAddress( ) dùng l y v InetAddress gán v i card m ng dùng giao ti p.edu. } // end try catch (UnknownHostException ex) { System. InetAddress localAddress = theSocket. } // end try catch (UnknownHostException ex) { System.Ph ng th c public int getLocalPort( ) dùng l y v c ng c a máy c c b dùng giao ti p v i máy xa.println(ex).vn". 80). System.theht.out.getLocalPort() + " of " + theSocket.net. Ví d : try { Socket theSocket = new Socket(hostname. 80). } it ng Trang 179 . System. import java.com". } catch (IOException ex) { System.out..println(ex).err. int localPort = theSocket.println(ex).sun. 80).println("I can't find host"). System. } catch (IOException ex) { System.err.

Khi g i n ph ng th c close java s t ng óng hai lu n nh p xu t g n v i nó.println(ex).C hai lu ng nh p xu t g n v i Socket u c óng l i. public void close( ) throws IOException M t Socket s t ng óng l i n u x y ra m t trong các tính hu ng sau: . } catch (IOException ex) { System. .Ph ng th c public OutputStream getOutputStream( ) throws IOException dùng l y m t OutputStream.close( ). 3. 80). thì ch p lý nh t óng Socket l i là trong kh i finally.vn". .err. // interact with the socket. Vi c óng Socket l i s gi i phóng m t s tài nguyên c a h th ng. óng Socket Khi k t n i không còn c s d ng n a b n c n g i ph ng th c close() m t cách ng minh óng Socket l i. nh ng m t thói quen th c hành t là nên g i n ph ng th c close() khi không còn dùng n nó n a. Vi c nh n d li u t máy remote c th c hi n thông qua InputStream này.. Vi c g i d li u n máy remote c thông qua OutputStream này. Ví d sau th hi n u ó: ocket connection = null. Tuy các Socket c ng t ng óng l i khi c n thi t.err.3.Ph ng th c public InputStream getInputStream( ) throws IOException ph ng th c này dùng nh n v m t InputStream. } } // end main } // end SocketInfo .println(ex). } // end try catch (UnknownHostException ex) { System.. .edu.Khi ch ng trình k t thúc.err.theht. } finally { // óng Socket l i if (connection != null) connection.println("Could not connect to host").println(ex). } Trang 180 . m b o Socket luôn c óng l i cho dù có ngo i l x y ra hay không.catch (SocketException ex) { System. } catch (IOException ex) { System.err.Ho c khi b thu rác c a java c ti n hành. try { connection = new Socket("www.

isConnected( ) && ! socket. Th nên ki m tra xem Socket có ang m hay không b n c n s d ng n ch ng trình sau: boolean connected = socket.Ph ng th c public boolean isClosed( ) (ch có trong java 1. Truy n trong ch haft duplex K t phiên b n java 1.4 tr lên) ph ng th c này tr v true n u b n ã t ng t n i n máy xa hay ch a và nh n v false trong tr ng h p ng c l i.isClosed( ).4 tr lên) ph ng th c này tr v true n u nh Socket c liên k t v i m t c ng c c b nào ó.isClosed( )) { // do something.write("GET / HTTP 1..flush( ).. 3. 80).vn". } Tuy nhiên n u Socket ch a bao gi c m thì ph ng th c này tr v false. Sau khi óng lu ng xu t b n v n có th s d ng lu ng nh p m t cách bình th ng */ connection. try { connection = new Socket("www. Th nên m b o các thao tác nh p xu t không x y ra l i b n nên s d ng m u ch ng trình sau: if (socket.4..shutdownOutput( ).3 có thêm hai ph ng th c: public void shutdownInput( ) throws IOException public void shutdownOutput( ) throws IOException Hai ph ng th c này cho phép b n óng lu ng nh p ho c xu t g n v i Socket l i.edu.theht. .. out. Writer out = new OutputStreamWriter(connection. // read the response.Ph ng th c public boolean isConnected( ) (Ch có trong java 1..Ph ng th c public boolean isBound( ) (ch có trong java 1. do v y ta nên óng l i gi i phóng tài nguyên. . Socket connection = null. Ví d nh khi b n k t n i n web server yêu c u m t trang b t k sau khi yêu c u xong thì lu ng xu t là không còn c n thi t n a. } else { // do something else.0\r\n\r\n"). khi này b n ch có th truy n ho c nh n m t chi u (haft duplex). } catch (IOException ex) { } finally { try { Trang 181 . out. /* óng lu ng xu t l i..getOutputStream( )).4 tr lên) ph ng th c này tr v tru n u nh Socket ã c óng l i.. nh n v false trong tr ng h p ng c l i.

1. L p ServerSocket p này ch dùng cho phía máy ch . Tuy nhiên trong tr ng h p này máy khách khó có th k t n i n nó vì không bi t rõ c ng. int queueLength) throws BindException.if (connection != null) connection. 4. M t s hàm t o c a l p ServerSocket: public ServerSocket(int port) throws BindException. InetAddress bindAddress) throws IOException public ServerSocket( ) throws IOException // Java 1.4 Các hàm t o này xác nh c ng. import java. dài c a hàng i l u tr các yêu c u k t n i n và giao di n m ng c s d ng. Nó th ng c s d ng l ng nghe m t k t n i n. } catch (IOException ex) {} } 4. try { ServerSocket httpd = new ServerSocket(80). class LocalPortScanner { public static void main(String[] args) { for (int port = 1.N u không th t o ra m t ServerSocket thì nó s ném ra ngo i l IOException .println(ex). Bây gi ta xét c th t ng hàm t o: .N u port ã c s d ng cho m t ch ng trình khác r i thì ngo i l BindException s c ném ra.err. Trang 182 . Ví d : T o m t ServerSocket l ng nghe trên c ng 80. port++) { try { // the next line will fail and drop into the catch block if // there is already a server running on the port ServerSocket server = new ServerSocket(port). port <= 65535.io. IOException public ServerSocket(int port. int queueLength. IOException public ServerSocket(int port.close( ).*. Ví d tìm xem các c ng trên máy c a b n ã c s d ng hay ch a package inetaddress. } catch (IOException ex) { System. import java.Hàm t o public ServerSocket(int port) throws BindException. N u nh port =0 thì h th ng s ch n m t giá tr c ng còn r i ti p theo.net. IOException Hàm t o này s t o ra m t ServerSocket l ng nghe trên c ng port. Tuy nhiên trong m t s tr ng h p nó r t h u d ng.*. } Chú ý: .

Hàm t o public ServerSocket(int port. 100).").out.4 public void bind(SocketAddress endpoint. Ví d : T o ra m t ServerSocket l ng nghe trên c ng 3456 và cho phép t i a 100 yêu c u k t n i ng th i.5")). try { ServerSocket httpd = new ServerSocket(3456. } .101.10.Hàm t o public ServerSocket(int port. b giao ti p m ng 162. N u máy c a b n có nhi u b giao ti p m ng thì b n c n ph i ch ra ServerSocket này s l ng nghe trên b giao ti p nào.1) và cho phép 100 yêu c u k t n i. Ví d : Gi s r ng máy c a b n có hai b giao ti p m ng. Tuy nhiên ServerSocket ch ng nghe trên b giao ti p m ng c ch ra trong tham s th 3.163.println(ex). } catch (IOException ex) { System.163.4 Hàm t o này t o ra m t ServerSocket. InetAddress. 100. Th nên b n c ng ch a th g i ph ng th c accept ch p nh n các k t n i. } // end catch } // end for } } . ây là ph ng th c ch có trong java 1. th s liên k t v i m t c ng nào ó b n c n g i ph ng th c bind().163. IOException Hàm t o này có nhi m v t ng t hàm t o tr c ó. try { ServerSocket httpd = new ServerSocket(3456.10. int queueLength.println("There is a server on port " + port + ". int queueLength) throws IOException.4 tr lên. } .err.5 (ch không ph i là 192.10. tuy nhiên nó ch a th c s l ng nghe trên c ng nào c . t o ra t ServerSocket l ng nghe trên c ng 3456.101. m t b giao ti p m ng có a ch 162. BindException Hàm t o này s t o ra m t ServerSocket l ng nghe trên c ng port và t o ra m t hàng i cho phép queueLength k t n i n m trong hàng ch .err.168.4 throws IOException Trang 183 . public void bind(SocketAddress endpoint) throws IOException // Java 1.5 và m t b giao ti p m ng khác có a ch 192.168. InetAddress bindAddress) throws BindException.println(ex).Hàm t o public ServerSocket( ) throws IOException // Java 1. int queueLength) // Java 1.} catch (IOException ex) { System.getByName("162. } catch (IOException ex) { System.1.

connection.*. class Client { public static void main(String[] args) throws IOException { Socket sk = new Socket(). Vi c giao ti p v i máy khách c ti n hành thông qua Socket này.Hàm t o này c ng r t h u d ng khi b n c n t m t s thu c tính cho ServerSocket tr c khi nó th c s ch p nh n các k t n i. Ch p nh n và óng k t n i a) Ch p nh n k t n i Vi c t o ra m t ServerSocket ch a th c s ch p nh n các k t n i n.java import java.. do v y có th ch p nh n nhi u k t n i n b n c n ph i l p l i vi c g i n ph ng th c accept() b ng cách a chúng vào m t vòng l p nh sau: Ví du: Ch ng trình trên máy ch //Server.net.. //T o ra m t i t ng SocketAddress liên k t SocketAddress http = new InetSocketAddress(80).java import java.*.close().accept(). // Thi t t m t s thu c tính cho Socket. import java.*.\r\n"). out. ServerSocket ss = new ServerSocket( ). //Liên k t ServerSocket v i c ng 80 ss.write("You've connected to this server. ch p nh n t n i n ta c n g i n ph ng th c accept() ph ng th c này s t m ng ng tuy n thi hành hi n t i cho n khi có m t yêu c u k t n i n.io. Chú ý: Ph ng th c accept() ch ch p nh n m t k t n i n mà thôi. Bye-bye now.2. while (true) { Socket connection = server.net. Khi có yêu c u k t n i n thì tuy n c ti p t c và hàm này tr v cho ta m t i t ng Socket. out. import java. } } } Ch ng trình trên máy khách //Client. 4.bind(http).*.io. Thông th ng b n s d ng m u sau: //T o ra m t ServerSocket ch a th c s liên k t v i m t c ng nào ó. OutputStreamWriter out = new OutputStreamWriter(connection.flush(). class Server { public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(3456).getOutputStream()). Trang 184 .

//Làm m t s vi c server.4 b sung thêm hai ph ng th c: . } 5. Tuy nhiên m t phong cách l p trình t t là luôn óng i m t cách t ng minh khi không còn s d ng n nó n a.isClosed( ).print( (char) c). c g i i b ng giao th c UPD.SocketAddress sv = new InetSocketAddress("theht1". 3456)..public boolean isBound( ) // Tr v true n u nó ã t ng c liên k t v i t c ng nào ó.out. b) óng k t n i Khi k t n i không còn c s d ng n n a thì ta c n óng l i gi i phóng các tài nguyên. do { c = in. tr c khi m t k t n i c thành l p thì m t trong 2 ti n trình ph i i ti n trình kia yêu c u k t n i.isBound( ) && ! ss. L p DatagramPacket p này th hi n cho m t gói d li u i l p DatagramSocket. Nó c s d ng III. Trong mô hình này server ph i l ng nghe và ch p nh n m t yêu c u k t i n t Client Trang 185 .Liên l c trong ch k t n i s có m t ng k t n i “ o” c thành l p gi a 2 ti n trình.public boolean isClosed( ) //N u k t n i ang m thì tr v tru và ng c l i.connect(sv). sk. tuy nhiên n u k t n i ch a c m thì nó c ng tr v false . } while (true). Trong java 1.read(). Th nên ki m tra xem ServerSocket có ang m hay không ta ph i làm nh sau: public static boolean isOpen(ServerSocket ss) { return ss. int c. liên l c b ng giao th c UDP. b thu rác c ti n hành.. Ví d : ServerSocket server = new ServerSocket(port). K t n i c ng t ng c óng l i trong m t s tr ng h p nh : Ch ng trình t thúc..close( ). System. InputStream in = sk. if (c == -1)break. L p DatagramSocket p này dùng t o ra m t Socket 6. } } i ch ng trình trên b n ch y Server m t l n sau ó b n có th ch y nhi u ch ng trình máy khách. TCP Socket .getInputStream().

tuy n này s b phong to cho n khi có m t k t i n. Ho c ServerSocket s=new ServerSocket(). ta s s d ng i t ng này “giao ti p” v i máy khách Socket connectToClient=s. nh n tham chi u n i t ng outputStream v n liên k t v i i t ng này. nh n c các i ng này ta g i ph ng th c getOutputStream() trên i t ng Socket. sequelLength]). s. Hàm t o này có 2 i: i th nh t cho bi t tên c a máy ch ( tên này có th là tên mi n ho c a ch IP ho c có th là m t i t ng InetAddress k t h p v i máy ch ) còn i th 2 cho bi t s hi u c ng mà server ang l ng nghe c 2) Nh n v các i t ng inputStream và outputStream k t h p v i i t ng Socket connectToServer.vi t các ch ng trình liên l c v i nhau trong ch k t n i ta c n ph i vi t 2 ch ng trình: m t cho server. Chúng ta có th s d ng i t ng inputStream và outputStream nh n/g i d li u i d ng thô. c 2) ch p nh n k t n i b ng cách g i ph ng th c accept() c a i t ng ServerSocket. b c này t ng t nh b c 3 trong ph n vi t ch ng trình cho server c 3) lý d li u nh n v / g i i thông qua 2 i t ng outputStream và inputStream c 4) óng k t n i gi i phóng tài nguyên. còn ch ng trình phía client thì kh i x ng yêu c u k t n i . các i t ng này s giúp ta g i/nh n d li u t máy client. thông th ng vi c óng k t n i c kh i ng t phía máy khách Trang 186 .port).Liên l c trong ch k t n i s s d ng giao th c TCP. thông th ng ta s d ng hàm t o 2 i nh sau: Socket connectToServer=new Socket(serverName. i t ng outputStream cho phép ta g i d li u n client. ph ng th c này tr v m t i t ng Socket.accept(). port). m t cho client. c 4) X lý d li u g i n t client và g i g i tr d li u. sau khi goi ph ng th c. ho c ta có th n i nó v i m t lu ng nh p/xu t khác nh n v d li u mong mu n. c 3) nh n v các i t ng outputStream và inputStream t i t ng Socket nh n v ph ng th c accept b c 2.bind(InetAddress addr. ch ng trình server có nhi m v l ng nghe và ph n h i k t n i m i. Vi t ch ng trình phía máy khách Vi c vi t ch ng trình cho client g m m t s b c c b n sau: c 1) o ra m t Socket k t n i n máy ch . ta có th làm vi c này thông qua hàm t o ho c kh i gán tr c ti p cho các tr ng ví d : ServerSocket s=new ServerSocket(port [. và g i ph ng th c getInputStream() nh n m t tham chi u n i t ng inputStream v n liên k t v i i ng Socket này. g i và nh n d li u Vi t ch ng trình phía server thi t l p m t server ta theo các b c sau: c 1) o ra m t i t ng ServerSocket và liên k t nó v i m t c ng. n i k t n máy ch c th c hi n thông qua hàm t o c a l p Socket.

} while (true).printStackTrace().close(). System. InputStream in = http.*.0\r\n\r\n").print( (char) c).net.out.getLocalPort(). int localPort = server.theht.write("GET /index. if (c == -1)break.*. } catch (Exception ex) {} } } } Ví d 2: Xây d ng ch ng trình EchoClient và EchoServer. int destPort = client. import java. public class EchoServer { public static void main(String args[]){ try{ ServerSocket server = new ServerSocket(3456).edu. OutputStream buffered = new BufferedOutputStream(raw). OutputStream raw = http.getPort().getInetAddress().getOutputStream().edu. import java.out. out = new PrintWriter(buffered).println("Echo Server is listening on port"+localPort+". try { Socket http = new Socket("www. out.net. } finally { try { out.accept(). } catch (Exception ex) { ex.*.out. class SocketClient { public static void main(String[] args) { PrintWriter out = null.io.theht. int c.vn và in ra màn hình import java. System.html tr máy ch web www. Xây d ng ch ng trình phía máy ch import java.read(). Socket client = server."). do { c = in. out.Ví d 1: Nh n v trang index.println("Accepted connection to "+destName Trang 187 .io.getHostName().vn". String destName =client. 80).getInputStream(). System.*.html HTTP/1.flush().

boolean finished = false.write(13). client.reverse(). } Trang 188 . int port) { try { connection = new Socket(destination. System. DataOutputStream out. client.out.equalsIgnoreCase("quit")) finished=true. do { String inLine = inStream.println("Sent: "+outLine). System.*.trim()).getOutputStream()). outStream.requestServer().flush(). import java.toString().vn".out. }catch (IOException e){ System. String outLine=new StringBuffer(inLine.write(outLine. outStream.shutdown().out.out.close().close(). } while(!finished)."). if(inLine.+" on port "+destPort+". DataOutputStream outStream = new DataOutputStream(client.getInputStream())).println(e). } } } Xây d ng ch ng trình phía máy khách import java. server.getInputStream())). outStream.getOutputStream()). outStream. 3456).close(). BufferedReader in.println("Received: "+inLine). System. } catch (Exception e) { System. BufferedReader inStream = new BufferedReader( new InputStreamReader(client.close(). in = new BufferedReader(new InputStreamReader(connection. outStream.").net. public ClientConnect(String destination. public class EchoClient { public static void main(String args[]) { ClientConnect client = new ClientConnect("www.edu.println("Connected to server at port 3456.getBytes()).readLine().theht. out = new DataOutputStream(connection.println(e). } } class ClientConnect { Socket connection. inStream.*. client.io. port).write(10).out.

write(13). } } } Ví d : ta vi t m t ví d n gi n nh sau: Trang 189 .readLine(). switch (line.charAt(0)) { case 'S': String sendLine = keyboardInput. case 'R': int inByte.readLine().out.writeBytes(sendLine).close(). break. System. out.toUpperCase(). } public void shutdown() { try { connection.write(inByte). case 'Q': finished = true. do { try { System.out.flush(). default: break.out.print("Send. if (line. String line = keyboardInput.write(10). } catch (IOException ex) { System.} public void requestServer() { BufferedReader keyboardInput = new BufferedReader( new InputStreamReader(System. break.flush().println("IO error closing socket").out. out.print(">>>>"). } } } catch (Exception e) { System.out.in)).out. or quit (S/R/Q): "). boolean finished = false. System.out. out.println(e).println(). receive. break. } } while (!finished). out.length() > 0) { line = line.read()) != '\n') System. System. while ( (inByte = in.

try { ServerSocket s = new ServerSocket(2004).readDouble().theht.readDouble(). d li u g m có chi u dài và chi u r ng s c g i n máy ch .* ch ng trình phía client có giao di n sau: khi ta kích chu t vào nút k t n i ch ng trình c a ta s k t n i v i máy ch sau khi nh p chi u dài.flush(). b = 0.// tính k t qu out.getInputStream()). import java. l ng nghe k t n i và tính toán di n tích c a hình nh n c Mã ngu n phía máy ch : package net. getOutputStream()).net.writeDouble(kq). DataOutputStream out = new DataOutputStream(connectToClient.// dôn h t DL ra } } catch (IOException ex) { } } public static void main(String[] args) { Trang 190 . máy ch th c hi n vi c tính di n tích và g i k t qu tr l i cho máy khách.*.*. kq = 0. // ch p nh n k t n i // l y v i t ng nh p/xu t DataInputStream in = new DataInputStream(connectToClient. // nam Giap Than Socket connectToClient = s. public class Server { public Server() { double a = 0. //Vòng l p vô t n ph c v yêu c u while (true) { a = in.accept().// tr v k t qu cho máy khách out. chi u r ng và kích chu t vào nút tính. ch ng trình c a ta s óng k t n i và k t thúc ch ng trình * ch ng trình trên máy ch ch có nhi m v . d li u nh n v t máy ch c hi n th trong ô k t qu khi ta kích chu t nút óng.// l y chi u dài b = in.// l y chiêu r ng kq = a * b. import java.io.

JLabel jLabel2 = new JLabel(). jtfRong. JButton jtfConnect = new JButton(). public class Frame1 extends JFrame{ JLabel jLabel1 = new JLabel().VnCourier New". Trang 191 .printStackTrace(). } } Mã ngu n phía máy khách: package net.io. jtfKetQua. jLabel1. jLabel1. import java. Socket connectToServer.Server server1 = new Server(). import java. 21)). 25)). jtfKetQua. jLabel2.setFont(new java.setBounds(new Rectangle(14. 13)).*. 13)). jtfDai.awt. jtfKetQua. 46. 21)). 13)).setFont(new java. JButton jtfClose = new JButton().setEditable(false).red). 86.*. jtfKetQua.net.awt. 0.Font(". jLabel2.*. jLabel3. jLabel2.setText("K t qu "). jLabel3. JTextField jtfRong = new JTextField().setText("Chi u dài"). this.setToolTipText("").getContentPane(). 113.setText("Chi u r ng").setText(""). import java. import javax. } catch (Exception ex) { ex. JLabel jLabel3 = new JLabel(). 44.Font(".setBounds(new Rectangle(16. // lu ng nh p DataOutputStream out. //lu ng xu t boolean isConnect = false.VnCourier New". jtfKetQua. 78.setDisabledTextColor(Color. jtfRong. 25)). 21)).white).red).Font(". JTextField jtfDai = new JTextField().theht. 12. jLabel1.red). } } void jbInit() throws Exception { jLabel1. 57. jLabel3.setBounds(new Rectangle(101.swing.setBounds(new Rectangle(102. 0.red). DataInputStream in.setForeground(Color.*.event.*.awt.setFont(new java. 113. JTextField jtfKetQua = new JTextField().setLayout(null).setForeground(Color.setForeground(Color. //bi n ki m tra xem ã k t n i ch a public Frame1() { try { jbInit().VnCourier New". 77. 0. jtfDai.awt. JButton jtfCompute = new JButton().setBounds(new Rectangle(16.awt. 15.setBackground(Color. import java.

awt.getOutputStream()). this.setBounds(100.add(jtfRong.add(jLabel1.VnCourier New". 12)).SwingConstants. this. } public static void main(String[] args) { Frame1 frame1 = new Frame1(). null). jtfCompute.setHorizontalTextPosition(SwingConstants. null).add(jtfClose.SwingConstants. jtfClose. jtfCompute. null). jtfConnect. this. 113.setFont(new java.showMessageDialog(this.getContentPane(). jtfConnect.swing. 350.setHorizontalAlignment(SwingConstants.awt. this.Font(". this. jtfConnect. null). 44.add(jtfKetQua. "khong tim thay may chu".setText(" óng").getContentPane(). frame1. 30)). jtfCompute.CENTER). 130). 25)).setFont(new java.VnCourier New".addActionListener(new Frame1_jtfConnect_actionAdapter(this)).jtfKetQua.setBounds(new Rectangle(102.getContentPane(). 87.add(jtfCompute. 12)).getContentPane(). jtfConnect. jtfCompute.addActionListener(new Frame1_jtfCompute_actionAdapter(this)).getContentPane().CENTER).setVerticalTextPosition(javax.awt.setVerticalAlignment(javax. this. 10.setText("Tính").add(jtfConnect. this. null). in = new DataInputStream(connectToServer.setBounds(new Rectangle(229. 30)). JOptionPane. 2004).getContentPane().setFont(new java. jtfConnect.setDefaultCloseOperation(EXIT_ON_CLOSE). isConnect = true. jtfClose. } catch (UnknownHostException ex) { JOptionPane. 0. jtfClose.getContentPane().swing. this. null).Font(". 12)). this.CENTER). 85.VnCourier New".setTitle("Test Client/Server"). "loi". jtfConnect.CENTER). out = new DataOutputStream(connectToServer.add(jtfDai.add(jLabel3.add(jLabel2. 86.setBounds(new Rectangle(230. 30)).addActionListener(new Frame1_jtfClose_actionAdapter(this)). 78. null). null). jtfConnect. this.getContentPane().setBounds(new Rectangle(228. this. 0. } void jtfConnect_actionPerformed(ActionEvent e) { if (isConnect == false) // n u ch a k t n i thì k t n i { try { // l ng nghe k t n i n máy ch trên c ng 2004 connectToServer = new Socket("localhost". null). } Trang 192 .show(). jtfClose.getInputStream()).Font(". frame1. 0. 100. jtfConnect.getContentPane().setText("K t n i").ERROR_MESSAGE). 78.

//g i chi u r ng out. JOptionPane.event.exit(0). JOptionPane.adaptee = adaptee.ERROR_MESSAGE).parseDouble(jtfRong.ERROR_MESSAGE). // thoát kh i ch ng trình } } // t o ra l p u h p.close().catch (IOException ex) { JOptionPane.writeDouble(Double. "Ban nhap sai. "loi". JOptionPane.getText())).parseDouble(jtfDai. "loi".readDouble())).getText())).ERROR_MESSAGE).awt.showMessageDialog(this.ActionListener { Frame1 adaptee. "loi". try { out. áp ng s ki n kích chu t vào nút tính class Frame1_jtfCompute_actionAdapter implements java. Trang 193 . // óng k t n i } catch (IOException ex) { } System. // g i chu u dài out. "khong the guu/nhan du lieu\nCo the do ban chua ket noi".jtfConnect_actionPerformed(e). // y h t d li u ra jtfKetQua. } } } void jtfCompute_actionPerformed(ActionEvent e) { if ( (in == null) || (out == null)) // n u ch a k t n i thì báo l i JOptionPane. "Ban phai ket noi truoc khi tinh".awt. } } // t o ra l p u h p.showMessageDialog(this.setText(String.writeDouble(Double. Frame1_jtfConnect_actionAdapter(Frame1 adaptee) { this.event.showMessageDialog(this. // nh n v k t qu và // hi n th trong ô k t qu } catch (NumberFormatException ex) { // n u nh p sai thi báo l i JOptionPane. "loi". } public void actionPerformed(ActionEvent e) { adaptee.valueOf(in.ERROR_MESSAGE). áp ng s ki n kích chu t vào nút k t n i class Frame1_jtfConnect_actionAdapter implements java. } } // th t c áp ng bi n c khi kích chu t vào nút óng void jtfClose_actionPerformed(ActionEvent e) { try { connectToServer. JOptionPane. "co loi ve nhap xuat".ActionListener{ Frame1 adaptee.flush(). Ban phai nhap so". } catch (IOException ex) { JOptionPane.showMessageDialog(this.

theht. import java.awt.accept(). ch ng trình phía máy khách v n gi nguyên. import java. } } n m t ngu n nhi u khách Trong ví d trên ta nh n th y. ta có th làm c vi c này b ng k thu t a lu ng.adaptee = adaptee.*. // ch p nh n k t n i new HandleClient(connectToClient).*.Frame1_jtfCompute_actionAdapter(Frame1 adaptee) { this. b n ch c n t o ra m t lu ng ph c v cho m i khách. } public void actionPerformed(ActionEvent e) { adaptee.io. máy ch ch có th ph c v duy nh t m t khách.net. } public void actionPerformed(ActionEvent e) { adaptee.jtfCompute_actionPerformed(e).//ch y m t lu ng ph c v } } catch (IOException ex) { } } Trang 194 . Database server.ActionListener{ Frame1 adaptee. while (true) { Socket connectToClient = s. public class Server{ public static void main(String[] args) { try { //l ng nghe k t n i trên c ng 2004 ServerSocket s = new ServerSocket(2004).accept(). áp ng s ki n kích chu t vào nút óng class Frame1_jtfClose_actionAdapter implements java.event. } } // t o ra l p u h p. Trong th c i v i m t s bài toán yêu c u m t máy ch ph i ph c v nhi u máy khách t i m t th i m.jtfClose_actionPerformed(e). while (true) { Socket connectToClient = s. ví d nh Web server. new HandleClient(connectToClient). ta ch thay i ch ng trình trên máy ch nh sau: package net. Th t n gi n.adaptee = adaptee. } Ta s a l i ví d trên có th ph c v c nhi u máy khách.… các máy ch này cho phép nhi u máy nhi u máy khách k t n i ng th i. và a thêm vào n mã t a nh sau: ServerSocket s = new ServerSocket(port). Frame1_jtfClose_actionAdapter(Frame1 adaptee) { this.

public HandleClient(Socket s) { this. b n ph i gi i quy t u ó.getInputStream()). b i h không n ng l c Trang 195 . b n s thu c màn hình k t qu nh sau: Liên l c trong ch phi k t n i Vi c liên l c trong ch không k t n i. } public void run() { DataInputStream in = null.s = s. try { in = new DataInputStream(s. // dôn h t DL ra } catch (IOException ex1) { } } } } sau khi s a l i b n cho kh i ng server. khi liên l c trong ch không k t n i java s d ng giao th c UDP trong vi c u khi n truy n và nh n d li u.} class HandleClient extends Thread{ private Socket s. không th bi t c d li u nh n v có b trùng l p không… B n là ng i l p trình. kq.writeDouble(kq). ch không ph i l p giao th c m ng hay java. } catch (IOException ex) { } //Vòng l p vô t n ph c v yêu c u while (true) { try { a = in. // tr v k t qu cho máy khách out. private double a = 0. // tính k t qu out. // l y chi u dài b = in.flush().getOutputStream()). không th bi t c d li u g i i có n c ích không. DataOutputStream out = null. Do v y không có xác nh n v d li u g i.readDouble(). // l y chiêu r ng kq = a * b. Trong th c t h m c k cho l i s y ra. không yêu c u ph i có 1 server luôn l ng nghe k t n i. out = new DataOutputStream(s. sau ó cho ch y 2 ti n trình client. this.start().readDouble(). b = 0.

jbtExit.setText("").setBounds(new Rectangle(314. nên nh ng u lo l ng ó không bao gi s y ra.làm u ó.*. Trang 196 .*. jtaSend. jbtSend. 12)). ch ng trình g m có 2 ch ng trình.setEditable(false).io. jbtG id.setText(""). 24)).Font(".awt.VnCourier New". private JScrollPane jScrollPane1 = new JScrollPane(). jbtExit.addActionListener(new Frame2_jbtExit_actionAdapter(this)).swing. 205. jtaRev. private boolean isFirstLine=true. 174. 25)). th nên gi i pháp an toàn cho b n là Socket dòng. b i l Socket dòng s ng giao th c TCP.setLayout(null).*. private JButton jbtSend = new JButton().setDisabledTextColor(Color.gray).getContentPane(). jbtExit.printStackTrace(). // khai báo các bi n c n thi t private DatagramSocket s.*. import javax. hai ch ng trình này là ngang hàng không có ch ng trình nào là ch c .theht. jtaRev. jbtSend. import java. 71.net. jbtExit.rev. l p DatagramPacket cho cung c p cho ta công c óng gói d li u UDP.*. import java. private JTextArea jtaRev = new JTextArea(). liên l c trong ch không k t n i ta s d ng l p DatagramSocket và l p DatagramPacket. } catch (Exception ex) { ex.event. 69.setFont(new java.setBounds(new Rectangle(315. public class Frame2 extends JFrame{ private JTextArea jtaSend = new JTextArea(). Ta gi i thích thông qua ch ng trình chat. private JScrollPane jScrollPane2 = new JScrollPane().awt. import java.VnCourier New". private JButton jbtExit = new JButton().seG ixt(G iu").awt. jbtSend. public Frame2() { try { jbInit(). l p DatagramSocket cho phép ta g i/ nh n v các gói d li u t máy xa. 0. jtaRev.addActionListener(new Frame2_jbtSend_actionAdapter(this)). 12)).Font(". 0. private DatagramPacket sen. các l nh c n thi t liên l c c trong ch không k t n i c in m Mã ch ng trình th nh t: package net. } } void jbInit() throws Exception { this.setFont(new java. private JSplitPane jSplitPane1 = new JSplitPane().setText("Thoat"). i t ng DatagramSocket g i i ho c nh n v .awt. import java.

getViewport().getLength())). } catch (SocketException ex) { } } private void nhan() { while (true) { // vùng m nh n d li u byte[] dat = new byte[100].add(jbtExit. null). null). null). jSplitPane1.append(new String(rev.append("\n" + new String(rev. try { s. jSplitPane1. //user code try { // t o ra i t ng DatagramSocket i t ng này s nh n d //li u t c ng 2004 s = new DatagramSocket(2004). } catch (IOException ex) { } } } private void dong() { try { s. JSplitPane. Trang 197 . jScrollPane2.receive(rev).close(). this. 7. } public static void main(String[] args) { Frame2 frame2 = new Frame2(). 0.setDefaultCloseOperation(HIDE_ON_CLOSE).add(jbtSend.VERTICAL_SPLIT).BOTTOM).setOrientation(JSplitPane. 300.jSplitPane1. 224)). jSplitPane1. rev.TOP).length). // t o ra i t ng DatagramPacket nh n gói d li u rev = new DatagramPacket(dat.getContentPane().// nh n v d li u if (isFirstLine == true) { jtaRev.add(jtaRev. this. 0.add(jScrollPane2. dat. JSplitPane. jSplitPane1.setBounds(new Rectangle(6. this.getContentPane().setTitle("Chuong trinh chat su dung giao thuc UDP").exit(0). this.add(jSplitPane1.add(jtaSend.setDividerLocation(150). null). null).getViewport(). isFirstLine = false.addWindowListener(new Frame2_this_windowAdapter(this)).getData(). } else jtaRev. this. rev. this. jScrollPane1.getData().getLength())).// óng k t n i } catch (Exception ex) { } System.add(jScrollPane1.getContentPane().

100.ActionListener{ private Frame2 adaptee. 4002).jbtSend_actionPerformed(e).getLocalHost().awt.frame2. } } class Frame2_jbtExit_actionAdapter implements java.length.setBounds(100.getBytes().nhan(). 280). local. frame2.exit(0).adaptee = adaptee. System. InetAddress local = null.event. Frame2_jbtExit_actionAdapter(Frame2 adaptee) { this. // G i d li u i } catch (IOException ex1) { JOptionPane. } } class Frame2_jbtSend_actionAdapter implements java. dat. try { local = InetAddress. } } void jbtExit_actionPerformed(ActionEvent e) { dong(). } void jbtSend_actionPerformed(ActionEvent e) { byte dat[] = jtaSend. frame2.awt.jbtExit_actionPerformed(e). } public void actionPerformed(ActionEvent e) { adaptee. Frame2_jbtSend_actionAdapter(Frame2 adaptee) { this.show().showMessageDialog(this. "khong the gui duoc").adaptee = adaptee. } void this_windowClosing(WindowEvent e) { dong().send(sen).getText(). try { s. 400. } Trang 198 .ActionListener{ private Frame2 adaptee. } catch (UnknownHostException ex) { } // T o ra i t ng DatagramPacket g i gói d li u sen = new DatagramPacket(dat. } public void actionPerformed(ActionEvent e) { adaptee.event.

*.Font(". rev. jbtSend.event. jbtG id.awt. jbtExit. private JButton jbtSend = new JButton(). private DatagramSocket s.setFont(new java.theht. private JButton jbtExit = new JButton(). jbtSend.printStackTrace().WindowAdapter{ private Frame2 adaptee.addActionListener(new Frame3_jbtExit_actionAdapter(this)). import java. } } Ch ng trình th hai: package net.setBounds(new Rectangle(315. 12)).event. jbtSend. 183. 69.setText("Thoat"). this.this_windowClosing(e). jtaRev.swing. } public void windowClosing(WindowEvent e) { adaptee.*. } catch (Exception ex) { ex. import java.setEditable(false).adaptee = adaptee. public Frame3() { try { jbInit(). private JScrollPane jScrollPane1 = new JScrollPane().*.setText(""). import java. Trang 199 .setLayout(null). Frame2_this_windowAdapter(Frame2 adaptee) { this.*. public class Frame3 extends JFrame{ private JTextArea jtaRev = new JTextArea().*. private JTextArea jtaSend = new JTextArea(). 0. } } void jbInit() throws Exception { jtaRev. 24)). import javax. private JSplitPane jSplitPane1 = new JSplitPane(). import java.io. private DatagramPacket sen.net.awt. private boolean isFirstLine = true.VnCourier New".} class Frame2_this_windowAdapter extends java. jbtExit.awt.addActionListener(new Frame3_jbtSend_actionAdapter(this)). jbtSend.awt. private JScrollPane jScrollPane2 = new JScrollPane().getContentPane().addActionListener(new Frame3_jbtSend_actionAdapter(this)).seG ixt(G iu").

rev.getContentPane(). jSplitPane1. dat. jScrollPane1.setFont(new java.getContentPane().close().setDividerLocation(150).getLength())). null). 156.length). } private void nhan() { while (true) { byte[] dat = new byte[100].setBounds(new Rectangle(5. 0.add(jbtExit. 0.VERTICAL_SPLIT). } { } public static void main(String[] args) { Trang 200 . null). null).addWindowListener(new Frame3_this_windowAdapter(this)). jSplitPane1.jbtExit. null). this.getViewport().getLength())). 12)).add(jbtSend. if (isFirstLine == true) { jtaRev. } catch (Exception ex) System. 71. jSplitPane1. rev = new DatagramPacket(dat.getContentPane(). null). 24)).Font(". this. try { s.add(jScrollPane1.getData().setTitle("Chuong trinh chat su dung giao thuc UDP").add(jScrollPane2.receive(rev).setBounds(new Rectangle(314. jSplitPane1. this.getViewport(). JSplitPane. 219)).add(jSplitPane1. this. JSplitPane.TOP).add(jtaSend. } catch (SocketException ex) { } jScrollPane2. this. rev.setOrientation(JSplitPane.setDefaultCloseOperation(HIDE_ON_CLOSE).VnCourier New". jScrollPane1.exit(0). } catch (IOException ex) { } } } private void dong() { try { s.append(new String(rev. isFirstLine = false.getViewport().BOTTOM). 0.add(jtaRev. 7. } else jtaRev.add(jtaRev. jbtExit.awt. this. 296.getData().append("\n" + new String(rev. //user code try { s = new DatagramSocket(4002). jSplitPane1. null).

} } class Frame3_this_windowAdapter extends java.Frame3 frame3 = new Frame3(). InetAddress local = null. } public void actionPerformed(ActionEvent e) { adaptee. Frame3_jbtExit_actionAdapter(Frame3 adaptee) { this.showMessageDialog(this. } void jbtSend_actionPerformed(ActionEvent e) { byte dat[] = jtaSend. frame3.event.jbtExit_actionPerformed(e).WindowAdapter{ private Frame3 adaptee.awt. } void this_windowClosing(WindowEvent e) { dong().event.setBounds(100.ActionListener{ private Frame3 adaptee.send(sen). } public void actionPerformed(ActionEvent e) { adaptee.event. 400. } } class Frame3_jbtExit_actionAdapter implements java.jbtSend_actionPerformed(e). Frame3_jbtSend_actionAdapter(Frame3 adaptee) { this. dat. frame3. 100. } catch (UnknownHostException ex) { } sen = new DatagramPacket(dat. } } class Frame3_jbtSend_actionAdapter implements java. Frame3_this_windowAdapter(Frame3 adaptee) { Trang 201 .getBytes(). } catch (IOException ex1) { JOptionPane. frame3.awt.getLocalHost(). try { s.awt.adaptee = adaptee.length.ActionListener{ private Frame3 adaptee.show().getText().adaptee = adaptee. local.nhan(). "khong the guu duoc"). 2004). 280). } } void jbtExit_actionPerformed(ActionEvent e) { dong(). try { local = InetAddress.

java import java.setBounds(new Rectangle(17. InetAddress address. } } Tóm l i liên l c trong ch không k t n i ta c n vi t trên m i máy các l nh c n thi t sau: o ra i t ng DatagramSocket nh n và g i d li u. 214)). int length.DatagramPacket(byte[] buf. 208. int offset.sen(datagramSocket) .*. 187. int port) hàm t o này th ng dùng khi c d li u t máy tính và c ng c ch ra + DatagramPacket(byte[] buf. int offset. b t u t m offset + DatagramPacket(byte[] buf. o các i t ng DatagramPacket dùng làm gói d li u trong vi c g i/nh n d li u. 23)). ng cách s d ng ham t o c a l p DatagramPacket + DatagramPacket(byte[] buf. 274. import java.Nh n d li u b ng ph ng th c receive.setTitle("Java Chat"). public class ChatApp extends Frame { TextField msgText = new TextField(). 19)). } public void windowClosing(WindowEvent e) { adaptee. import java.awt. label1.*.this_windowClosing(e).event. 21)).io.*. b ng hàm t o c a nó nh sau: s = new DatagramSocket(port). public ChatApp(){ this. import java. c ng c ch ra. replyText. 93.setBounds(new Rectangle(15. 277.setSize(new Dimension(297. 55.setText("talking with"). int port) nh n v li u trên máy.net. 89)).receive(datagramSocket) Ví d ChatApp. addrText. Trang 202 .adaptee = adaptee. msgText. TextArea replyText = new TextArea(). c a l p DatagramSocket datagramSocket. this. Button sendButt = new Button(). 34. và c t vào trong vùng m buf -g i d li u b ng ph ng th c send.setBounds(new Rectangle(84. Sender sender=new Sender(). Hàm t o này s t o ra i t ng DatagramSocket ho t ng trên c ng c ch ra. InetAddress address. 183. label1.awt.*. int length) th ng dùng hàm t o này khi nh n d li u +length.setLayout(null). int length) hàm t o này th ng dùng trong vi c nh n d li u có dài length . c a l p DatagramSocket datagramSocket. TextField addrText = new TextField().this.setBounds(new Rectangle(16. int length. Label label1 = new Label(). this.

println(e). sendButt.ActionListener() { public void actionPerformed(ActionEvent e) { sendButt_actionPerformed(e).add(replyText.0. byte outBuffer[]. null).addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent event){ System. outBuffer = new byte[bufferLength]. byte inBuffer[] = new byte[bufferLength]. } } Trang 203 .0. ListenerThread listener=new ListenerThread(app.send(outDatagram). sendButt.serverAddress.exit(0). this. null).add(sendButt. null). 94.setText("127.getText()). } } class Sender{ DatagramSocket listenerSocket.outBuffer.setLabel("Send"). 61. InetAddress serverAddress.sendData(addrText.addActionListener(new java.getBytes(). DatagramPacket outDatagram. null). outBuffer = data. String data){ try{ serverAddress = InetAddress. this. 28)). DatagramPacket inDatagram. } public static void main(String args[]){ ChatApp app = new ChatApp().add(addrText. listener. listenerSocket.getText(). sendButt. } void sendButt_actionPerformed(ActionEvent e) { sender.addrText. app.event.length. public void sendData(String DestAddr. } catch (Exception e){ System.out.awt.getByName(DestAddr).add(msgText.replyText). app. null).setBounds(new Rectangle(15. int bufferLength = 256. } }).show().2345).start(). this. String localHost. outDatagram = new DatagramPacket(outBuffer.add(label1. } }).1"). this.msgText. this.

text=text. String destHost = destAddress.length).getAddress().inBuffer. String data = new String(inDatagram.public Sender(){ try{ listenerSocket = new DatagramSocket().getLocalPort().out.trim(). String localHost. DatagramSocket socket.").length).getData()). inDatagram = new DatagramPacket(inBuffer.getHostName(). int bufferLength = 256. byte outBuffer[].trim().println("connect error!").out. } catch (Exception e){ System. int localPort = socket.inBuffer. byte outBuffer[].trim(). byte inBuffer[] = new byte[bufferLength].inBuffer. InetAddress destAddress = inDatagram. DatagramPacket inDatagram = new DatagramPacket(inBuffer.println("IOException occurred. } } class ListenerThread extends Thread{ TextArea text. text. int destPort = inDatagram. } } public void run() { try{ DatagramSocket socket = new DatagramSocket(2345). InetAddress serverAddress.println("connect error!"). } catch (Exception e){ System. byte inBuffer[] = new byte[bufferLength]. DatagramPacket inDatagram.getLocalHost(). try{ socket = new DatagramSocket(). public ListenerThread(TextArea text){ this.getPort(). DatagramPacket outDatagram. } } } Trang 204 .receive(inDatagram).out. DatagramPacket outDatagram. } String localAddress = InetAddress. int bufferLength = 256. } }catch (IOException ex){ System. inDatagram = new DatagramPacket(inBuffer.append(destHost+" say: "+data+"\n"). while (true) { socket.getHostName().length).

Có 2 chu n v Mail th ng c các máy ch mail h tr là X. SMTP (ESMTP). sau ó nh p vào n i dung c n g i. Còn m c ích c a chu n SMTP miêu t cách u khi n các thông p trên ng Internet. E-mail cho phép g i thông p t n i này n n i khác t ng t nh cách g i th truy n th ng thông qua b u n. h u hành m ng. Các giao th c Mail thông ng : chu n X. B u n s chuy n th n h p th c a ng i nh n. Trong ch ng này ta s s ng hai giao th c :POP3 và SMTP g i nh n mail. chu n MAIP. ngày nay POP c c i ti n thành POP3 (Post Officce Protocol vertion 3). Trong cách thông th ng b n ph i cung p a ch ng i g i (sender). SMTP th ng i kèm v i chu n POP3 và do h n ch c a SMTP mà ngày nay ng i ta dùng chu n m r ng c a nó là ESMTP (Extended SMTP). u này giúp cho vi c g i nh n các thông p c m b o. u quan tr ng c a chu n SMTP là gi nh máy nh n ph i dùng giao th c SMTP g i Mail cho m t Server luôn luôn ho t ng. a ch ng i nh n (reciept) sau ó ng i g i mang th n u n nh b u n chuy n th i.400 là cho phép các mail có th c truy n nh n thông qua các lo i ng khác nhau b t ch p c u hình ph n c ng. Ng i nh n s ti n hành ng nh p (hay còng g i là login) vào h p th c a máy ch c n i dung e-mail g i cho mình. làm cho nh ng ng i các n i khác nhau có th trao i thông tin v i nhau. POP3. Mail server n i nh n s c t th vào m t n i thích h p (mail box hay còn g i là p th ) trên máy ch . Mail server s g i th c a b n n m t máy ch hay mail server c a a ch ng i nh n. th ng nh t gi a các máy ch mail trên toàn th gi i v cách th c g i nh n mail òi h i hình thành các chu n v mail. ng i nh n s n l y Mail a h t Server khi nào h mu n dùng giao th c POP (Post Office Protocol). Các khái ni m MAIL Ngày nay e-mail hay th n t ã tr nên ph bi n và h u nh không th thi u trong th gi i Internet.400.Ch ng 9: JAVA MAIL I. c ích chính c a X. i v i th n t e-mail g i qua h th ng Internet hay m ng thì c ch g i/nh n ng hoàn toàn t ng t . giao th c truy n d n c dùng. Sau ó. Các máy ch (mail server) cung c p cho b n ch mail (còn g i là e-mail address).400 và SMTP (Simple Mail Transfer Protocol). B n ghi a ch mail c a b n và c a ng i nh n. Mô hình g i nh n mail Mail Server ng i i Mail Server trung gian ng ng Mail Server ng nh n i Sende r Reveicer Tr c khi i vào ph n chính chúng ta cùng ôn l i m t s khái ni m c s sau: Trang 205 .

II. cho phép máy khách truy c p vào l y mail. G i mail v i th vi n có s n c a java Java cung c p cho b n m t th vi n nh g n giúp b n có th g u mail m t cách d dàng. a ch c a máy ch l u tr mail cho phép máy khách truy c p vào nh n mail v c g i là incoming mail address. s d ng các tính n ng cao c p b n x th vi n Mail API (gi i thi u trong ph n sau). Trình ch ti p nh n mail theo giao th c SMTP c g i là SMTP Server. Mail client. trình khách ph i s d ng m t giao th c trò chuy n v i mail server. a ch c a mail server (máy ch ti p nh n mail do b n g i lên) cùng v i n i dung mà b n mu n g i. Hi n nay POP3 (Post Office Protocol) và IMAP (Internal Message Access Protocol) là hai giao th c l u tr và l y mail t h p th (Inbox) c nhi u mail server s d ng. phân ph i mail n máy ch khác. C ch POP before SMTP yêu c u máy khách mu n s d ng d ch v mail c a máy ch ph i tr c h t ph i ng nh p (login) vào tài kho n (account) theo giao th c POP. a ch c a ng i nh n (to). Giao th c g i mail (Mail transport protocol): g i mail n máy ch . Các mail server a ph n h tr tính n ng Relay. Internet mail là m t h th ng chuy n mail liên t c gi a các máy ch mail v i nhau cho n khi nào mail n c máy ch ích. c ch g i mail b ng SMTP m i có th th c hi n c. Các máy khách mu n b t tay v i trình ch và g i mail lên máy ch s s d ng giao th c SMTP (Simple Mail Transport Protocol). Trình khách s d ng giao th c SMTP g i th i c g i là SMTP Client. a ch này th ng c g i là mail host.Mail server: là m t ch ng trình ch y d i d ng m t d ch v . Web mail: là ch ng trình dùng nh n mail v t trình ch và cho phép i mail lên trình ch . SMTP Relay: Các mail server n u nh n c mail không thu c a ch do mình qu n lý. Th vi n này có l p SmtpClient dùng g i mail. l u tr mail… Chính vì v y tr c khi b n g i nh n mail n ph i bi t a ch c a máy ch mail (máy ang ch y d ch v mail). Trong tr ng h p này mail server (n i chuy n ti p th i) óng vai trò nh m t trình khác (mail client) i v i máy ch n i nh n. tuy nhiên v i th vi n này b n không có c các tính n ng cao c p nh g i file ính kèm…. T ng t nh trình duy t s ng giao th c HTTP trò chuy n v i Web server. g i mail b n cung c p a ch c a ng i g i (from). D i ây là m t ch ng trình n gi n dùng g i mail n a Trang 206 . d ch v này có nhi m v nh n mail t máy khách g i n. khi ó nó có trách nhi m g i mail n máy ch khác v i cùng giao th c SMTP. Các ch ng trình mail Client th ng s d ng giao th c POP3 nh n mail t trình ch . a ch c a máy ch nh n mail g i i c g i là outgoing mail address. SMTP khá n i ti ng và c h u các máy ch mail trên th gi i h tr . Trình ch ti p nh n yêu c u c a trình khách theo giao th c POP3 c g i là POP Server. N u mail client c vi t d i giao di n Web thì nó c g i là Web mail. u quá trình ng nh p thành công. Giao th c l u tr và nh n mail (mail store protocol): Khi trình ch mail ti p nh n c mail. Nó ti n hành l u tr mail theo m t cách th c nào ó trình khác có th d dàng truy c p vào và nh n mail v . POP before SMTP (Ch ng th c quy n truy c p theo giao th c POP tr c khi s ng SMTP): tránh tình tr ng máy ch mail c l i d ng g i mail m t cách t. C th .

//SendMailApp. } } Chú ý: Hãy thay a ch From. System. To b ng a ch e-mail mà b n mu n g i. ps. a ch ng i g i có th t tu ý.out.smtp.com/javamail/index. public class SendMailApp { public static void main(String[] args) throws Exception { String host = "utehy. //L y v lu ng xu t g n v i mail PrintStream ps = mailer.vn". String body = "Hello this is test message for mail".from(from).io. // Thi t l p a ch c a ng i g i và ng i nh n mailer.*.*. III. //Di n các thông tin khác ps.html Trang 207 . n có th download t a ch http://java.println(body).edu. nó c óng gói trong t p mail. String subject = "Test Message".println("To:" + to).edu. Gi i thi u java mail API L p SmtpClient c a java mà chúng ta s d ng trên ây ch giúp b n g i mail m c n gi n nh t v i n i dung mail d ng thu n v n b n.sun.java import sun. mailer.vn (máy ch mail c a tr ng DHSP KT H ng Yên). Th vi n này g m ba ph n: Ph n th nh t là h t nhân c a các tác v x lý mail.to(to).com".println("Mail has been sent").closeServer().println("Subject:" + subject). ps.println("From:" + from). d li u c nhúng c hình nh. M t ng d ng mail phía máy khách th ng có các ch c n ng ph c t p h n nh : G i file ính kèm.ch thek44a2@yahoo. âm thanh… th c hi n nh ng ch c n ng này java a ra m t th vi n riêng chuyên lý các thao tác g i nh n mail.com nh vào máy ch mail utehy. 1. Cài t th vi n java mail M c nh các th vi n java mail API không c cài t khi b n cài JDK. c ph n n i dung //K t thúc quá trình g i mail mailer.// Thêm CRLF vào tr ps. String from = "theth@utehy.println(). String to = "thek44a2@yahoo.net.jar.vn".edu.startMessage(). import java. Nh ng th ng là a ch c a b n ng i nh n sau khi c th xong có th h i âm (Reply) l i cho n. ps. host là a ch c a máy ch nh n mail do ta SmtpClient mailer = new SmtpClient(host). /* T o i lên */ it ng g i mail theo giao th c SMTP.

ví d : //T o i t ng Properties ch a thông tin kh i t o n u có Properties props=new Properties().1. n i dung mail… i ph ng th c Transport.setProperty(PropertyName.jar. Trong java 1.mail. Các l p c b n x lý thao tác g i nh n mail Ta tìm hi u các gói trong th vi n java mail. C:\JBuilderX\lib\activation. t o i t ng Store b n yêu c u ng i dùng nh p vào tên và m t kh u ch ng th c quy n truy c p h p pháp.null). d ng i t ng Store l yv i t ng Folder.1. Tr c khi truy c p (g i/nh n) n c n ph i t o ra m t i t ng Session th hi n cho m t phiên làm vi c. 3. Ho c b n có th g i ph ng th c getInstance() c a l p Session thay cho getDefaultInstance() t o ra th hi n c a i t ng Session nh sau: //T o i t ng Properties ch a thông tin kh i t o n u có Properties props=new Properties(). Trang 208 .jar. i t ng này s ch a các thông tin v mail c n g i i nh a ch ng i g i. PropertyValue) */ //T o i t ng Session Session session =Session. Các b c g i mail Yêu c u ng i g i ch n giao th c g i (SMTP) và nh n (POP3 hay IMAP…).4 th vi n này có tên mail. o i t ng store chu n b l y mail v . javax.com/products/javabean/glasgow/jar.mail. Các l p liên quan n vi c g i mail 3. javax.Ph n th hai là JavaBean Activation FrameWork c n cho m i phiên b n c a java mail.send() ho c ph ng th c sendMessage c a i t ng Transport g i th i. M i Folder s ch a m t lo i mà n mu n l y.mail. o i t ng Message. Nh Folder Inbox ch a các th vi n g i n. H u h t các ng d ng mail client c n import các th vi n javax.sun. L p Session L p này th hi n m t phiên k t n i t i mail server.interner. b n có th tìm th y nó trong th m c Jbuilder_Home/lib 2. tiêu mail. a ch ng i nh n. C:\JBuilderX\lib\mail.getDefaultInstance(props. v i th vi n này b n có th t i xu ng t http://java. Chú ý: Khi b n cài JBuilder hai th vi n này c ng ct ng cài t vào máy. Th vi n này mang tên activation.activation.jar n t bi n môi tr ng classpath=%CLASSPATH%. Folder trash ch a các th a b xoá.jar. 3.1. Folder sent ch a các th v a g i i… Duy t i t ng Folder l y v danh sách các th .html Ph n th ba là các l p c hay nh n mail t trình ch . L u các thông tin này vào i t ng Session. Các b c g i nh n mail Các b c nh n mail: o i t ng mail Session. /*gán giá tr cho các thu c tính b ng ph ng th c props.

edu. n i nh n mail s c n c vào Mime hi n th úng n i dung c a thông p nh n c.vn . Ng i nh n c n c vào tiêu th bi t c n i dung v n t t mô t trong th .… ây th ng thì b n truy n null cho tham s th hai v i ý ngh a s d ng c ch ch ng th c (authentication) m c nh c a mail server.setProperty("mail.edu.3."theht@utehy.from".edu. PropertyValue)*/ //T o i t ng Session Session session =Session. Trang 209 .vn").vn ).setText(content). N u b n mu n a ch e-mail có thêm thông tin di n gi i b n thêm s d ng cú pháp nh sau: Address address =new InternetAddresss( theht@utehy.setProperty(PropertyName.edu. u n i dung không ph i thu n v n b n thì b n ph i ch nh Mime cho nó. Ph ng th c setSubject() s giúp ta làm vi c ó. Ho c InternetAddresss address =new InternetAddresss( theht@utehy. S khác nhau gi a hai ph ng th c này là getInstance() thì luôn t o ra m t Session i còn getDefaultInstance() thì không t o ra m t th hi n m i c a Session n u nh nó ã c t o ra trong cùng java virtual machine. b n s ng l p con c a nó là InternetAddresss. L p Message Sau khi có i t ng Session b n. Ví d : Session. Trong c hai ph ng th c kh i t o i t ng Session nêu trên. props. Tuy nhiên ít khi b n làm vi c tr c ti p v i i t ng này mà b n th ng làm vi c v i các p con c a nó. u b n ch nh Mime cho n i dung c n g i n u nó không ph i là thu n v n b n nh sau: message. b n có th thi t t n i dung th g i b ng nh: message. u n i dung c a thông p là thu n v n b n.getInstance(props.2. L p Address là l p tr u t ng. b n t o thông p mail chu n b g i i nh sau: MimeMessage message =new MimeMessage(mailsession).1. l p MimeMessage."text/html"). ti p n ta s d ng l p Address o ra ch c a ng i g u và ng i nh n.vn ). các thu c tính c u hình c t trong i t n Properties nên tr c khi b n b n g i nh n mail b n c n thi t t các thu c tính này. ví d ./*gán giá tr cho các thu c tính b ng ph ng th c props.setSubject( Xin chao ).edu.null). Hoang Trong The ). L p Address Sau khi b n t o ra i t ng Session và Message. g i mail b n b n c n t o ra i t ng Message. M t thói quen t t nên có là t cho mail m t tiêu (subject). 3. Ví d b n t o a ch mail t l p này nh sau: Address address =new InternetAddresss( theht@utehy.setProperty("mail. ví d : props.host". 3."utehy. Thông tin di n gi i này s c hi n th thay khi ng i nh n c th thay cho a ch mail from.vn").setContent(content.1.

4. Ta có th t a ch c a ng i g i là m t danh sách (m ng) ng i nh n có th ph n h i l i cho nhi u ng i cùng m t lúc. Chú ý: java mail không cung c p c ch ki m tra xem a ch c a ng i g i có h p l hay không. b n có th t cho nó m t a ch e-mail không có th c.Sau khi t o xong a ch c a ng i g i. ki m tra m t a ch mail có h p l hay không không ph i là d .addRecipient(Message. Java cung c p cho b n ba lo i a ch ph bi n: Ki u a ch Message. Ví d : Transport. Ví d : Address myAddress=new InternetAddresss(“theht@utehy. n gi n b n g i ph ng th c t nh send() c a l p Transport g i i t ng thông p i. a ch c a ng i nh n b n c n g n nó vào thông p c n g i i.com”).TO.addFrom(address).RecipientType. //Gán a ch cho ng i nh n message.RecipientType. n u b n t a ch c a ng i g i không có th c thì ng i nh n không th ph n h i (reply) l i cho b n.TO Message.CC Message. Trang 210 . // ho c b n có th g i ph ng th c transport. t o k t n i n trình ch mail và g i ph ng th c sendMessage() g i mail i: Transport transport. Address ccAddress=new InternetAddresss(“theht@walla.RecipientType.close().vn”).setFrom(myAddress).RecipientType.sendMessage(message. t a ch c a ng i g i b n g i ph ng th c setFrom(). message. transport. ng th c addRecipient() c a Ví d : //T o a ch Address toAddress=new InternetAddresss(“thek44a2@yahoo.1. password). transport =mailSession.addRecipient(Message. user. Ho c b n có th ch n giao th c g i mail t i t ng Session.com”).getAllRecipients()).connnect(host.edu.send(message).getStransport( smtp ).connnect(). ccAddress). transport. L p Transport L p Transport cung c p các ph ng th c g i mail n mail server. toAddress). thông th ng n gi n nh t b n ki m tra xem trong a ch ó có kí t @ hay không? 3. B n g i ph ng th c addFrom() nh sau: Address address[]=… Message. transport. a ch c a ng i g i không quan tr ng.BCC B n g i ph ý ngh a a ch n i n a ch ng i g i c n l u ý a ch ng i g i c n tham kh o it ng Message gán a ch c n g i. message.CC.RecipientType. message.

open(Folder. ng t nh l p Transport trong thao tác g i mail.sun.imap nh sau: import com. ph Trang 211 . Message message[]=folder.*.mail. Còn n u b n s d ng giao th c IMAP thì b n khai báo gói com. u k t n i thành công b n l y v i t ng Folder duy t mail.mail.lenth(). INBOX ám ch th m c ch a th g i n.READ_ONLY).i<message. Trong khi ph ng th c transport. user. folder.close().*. g i ph ng th c getStore() l yv i t ng Store ph c v cho m c ích k t n i v i mail server nh n mail.out.close(true). 3.Cách th hai này nhanh h n cách th nh t trong tr ng h p b n mu n g i m t s ng l n các mail.pop3. store.connect(host. t ã c xong th b n óng h p th và ng t k t n i: folder. i s true cho bi t có c p nh t các l nh xoá mail hay không (s c p trong ph n sau).println(((MimeMessage)message[i]). password).getConten()). Các thông p mail c l u tr trên mail theo m t c u trúc cây. SENT… Ph ng th c getMessages() tr v m t m ng các i t ng Message.getStore( pop3 ).send() ph i t n i.close().sun.mail. do v y m t th i gian.i++) System.getFolder(“INBOX”).mail.imap.pop3 nh sau: import com. Ví d n u s d ng giao th c POP3 thì b n khai báo gói com. t ng t nh c u trúc cây th m c c a h u hành. óng k t n i m i khi có m t thông p c g i i. Các l p liên quan n vi c nh n mail p Store và l p Folder: Là hai l p này ph c v ch y u cho vi c nh n và c mail ch a trong h p th c a mail server. Chú ý: V i giao th c POP3 b n ch có th l y mail t INBOX v i giao th c IMAP (m ng c a giao th c POP3) b n có th nh n mail trong các th m c TRASH.getMessages(). k t n i vào mail server b n g i ph ng th c connect() nh sau: store. B n g i ng th c getConten() l y v n i dung c a mail nh sau: for(int i=0. Folder folder = store. s d ng hai l p này tr c tiên b n c n ch nh giao th c nh n mail.sun. Trong ó: host là a ch c a mail server mà b n mu n l y th user/password là tài kho n ng nh p vào h p th c a b n. Store store =mailSession. b n dùng i t ng Session. Có hai giao th c nh n mail chính là POP3 và IMAP.sun.2. trong khi k t n i v n còn m b n có th g i bao nhiêu th tu ý mà không ph i k t n i l i v i mail server. k t n i v n c duy trì cho n khi b n g i ph ng th c transport.

"" + smtpPort).edu.*.port". b ng câu l nh Properties props = new Properties(). props.host".java import javax.port". smtpHost). G i mail n gi n Ch ng trình SendMailAPI d i ây s g i mail i theo giao th c SMTP. null). String to = "thek44a2@yahoo.smtp. msg. Trang 212 .smtp.put("mail.mail. c nh c ng c a mail s là 25.*.*.put("mail.send(msg). public class SendMailAPI { public static void main(String args[]) throws Exception { String smtpHost = "utehy. msg.put("mail.setSubject(subject). } } Tr c tiên b n t o ra m t i t ng Properties ch a các thông tin: tên máy ch mail.smtp. // Create a mail session Properties props = new Properties().internet. "" + smtpPort). msg. // Send the message Transport. int smtpPort = 25.mail. String from = "theht@utehy. SendMailAPI là ch ng trình java thu n tuý s d ng th vi n java mail.port".com"..setFrom(new InternetAddress(from)).edu. new InternetAddress(to)).smtp.util. import javax. Ti p theo b n l y v m t phiên k t n i b ng dòng l nh: Session session = Session. Nó t ng t ch ng trình SenMailApp chúng ta ã tìm hi u trong ph n tr c.vn".setText(content). String content = "". null). Session session = Session.*.getDefaultInstance(props.activation.setRecipient(Message. Transport c a java mail API. props. "" + smtpPort).host". // Construct the message Message msg = new MimeMessage(session). //SendMailAPI. G i mail 1. n u mail ho t ng trên m t c ng không ph i là 25 thì b n ph i ch rõ c ng c a mail server b ng dòng l nh: props.put("mail. String subject = "Xin chao". msg. props. smtpHost).RecipientType.put("mail. import java.TO. import javax. props.getDefaultInstance(props.smtp. M c dù v y thay vì s ng l p SmtpClien b n s d ng các l p Session.vn".III. ng c a mail server.

setText(content).Ti p theo b n t o ra i t ng thông p và n các thông tin c n thi t vào: Message msg = new MimeMessage(session).connect(host. Cu i cùng g i th i b n g i ph ng th c: Transport. msg. String to = "thek44a2@yahoo.smtp.””. msg. Ví d sau minh ho cách g i th v i n i dung có nh d ng HTML: // SendMailAPIFromat. msg.internet.RecipientType. //Gán n i dung là m t xâu có nh d ng HTML String content = "<p><b><font face=\". tp. n có th thay dòng l nh này b ng n l nh sau: Transport tp= session. // Construct the message Trang 213 .setConten(StringMsg.smtp.””).close(). import javax. Do b n ang g i mail nên các thông tin ng nh p user.edu.util.sendMessage(msg.connect(). G i th v i n i dung có nh d ng HTML N u n i dung th là thu n v n b n b n g i ph ng th c Message.getAllRecipients()). smtpHost). Session session = Session. tp.host".edu. String from = "theht@utehy. props. import javax.*. n có th cung c p cho nó m t xâu r ng nh sau: tp. N u n i dung th không ph i là d ng thu n v n b n b n c n g i ph ng th c Message.vn". "" + smtpPort). new InternetAddress(to)). String subject = "Xin chao".vn".mail.put("mail.*. u b n ch a gán a ch mail server và c ng c a nó thì b n ph i g i ph ng th c: tp. tp. // Create a mail session Properties props = new Properties().connect(host. public class SendMailAPIFromat{ public static void main(String args[]) throws Exception { String smtpHost = "utehy.setText(StringMsg) gán n i dung cho i t ng thông p c n g i i.VnTimeH\">Chúc m t ngày vui v </font></p>".setSubject(subject).getTransport("smtp").com".*.put("mail. import java. null).VnArialH\" size=\"8\">Xin chào các n</font></b></p><p><font face=\".mail. props. int smtpPort = 25.setRecipient(Message. 2.getDefaultInstance(props.TO. MimeType) v i MimeType là m t xâu cho bi t ki u n i dung c ch a trong mail.port".password không c n thi t.activation.user.*.msg.java import javax.send(msg).password). msg.setFrom(new InternetAddress(from)).

internet.TO. "text/html").java d i ây s cho th y k thu t g i mail v i file ính kèm. T t c các BodyPart c g i là MultiPart.put("mail.edu.*. import javax. M t Message c xem là g m nhi u phân n. msg. // Send the message Transport tp = session. "").vn". //SendMailAttachAPI. Nh ng file này th ng c nhúng vào ph n n i dung mail g i i d ng mã hoá t ng phân n (Multi – part MIME). //t o i t ng session Properties props = new Properties(). public class SendMailAttachAPI { public static void main(String args[]) throws Exception { String smtpHost = "utehy.vn". tp. "" + smtpPort). props.java import javax. //Tên c a file ính kèm String fileName = "C:/test. Session session = Session. Ch ng trình SendMailAttachAPI. tp. int smtpPort = 25.close(). import javax.host".connect("utehy. String to = "thek44a2@yahoo.sendMessage(msg.mail.activation.*.setContent(content. String content = "Chuc mot buoi sang tot lanh". smtpHost). msg.setFrom(new InternetAddress(from)).*.setRecipient(Message. } } Trong ví d trên b n gán n i dung là m t xâu có nh d ng HTML.smtp.edu. G i th v i file ính kèm Th vi n java mail API cho phép b n g i mail v i các file ính kèm.vn". msg. String from = "theht@utehy.edu. M i phân n c g i là m t BodyPart.setSubject(subject).getTransport("smtp").getAllRecipients()).com". new InternetAddress(to)). //T o i t ng thông p Trang 214 .setContent(content.Message msg = new MimeMessage(session).smtp.*. props.getDefaultInstance(props. 3. import java.RecipientType. D a vào hai l p BodyPart và MultiPart ta có th t o ra m t mail ph c t p có th phân tích b i i nh n.txt". tp. null).util. "".put("mail. báo cho ng i nh n bi t n i dung bên trong th có nh d ng HTML b n g i ph ng th c msg. String subject = "Xin chao". //Gán ki u n i dung MimeType là text/html msg. msg. "text/html").port".mail.

msgBodyPart.close(). msg. import com.mail. //G i thông p i Transport tp = session.*. //Thêm i t ng msgBodyPart vào multiPart multiPart.edu. //T o ra i t ng BodyPart ch a n i dung mail BodyPart msgBodyPart = new MimeBodyPart(). b n k t n i vào mail server l y v các Message trong th m c INBOX. Nh n mail n gi n nh n mail.connect("utehy. ""). "". b ng cách t o ra nhi u BodyPart khác nhau.setDataHandler(new DataHandler(source)). msg. msg. tp.setFileName(fileName).pop3.sendMessage(msg.setRecipient(Message.setText(content).vn". Nh n mail 1. //Thêm i t ng msgBodyPart vào multiPart multiPart. //Gán multiPart cho i t ng thông p msg.TO. IV. tp.vn".util. i t ng này dùng ch a ph n file ính kèm */ msgBodyPart = new MimeBodyPart(). public class GetMailAPI { public static void main(String[] args) throws Exception { String smtpHost = "utehy. import javax. /* T o i t ng Multipart.setFrom(new InternetAddress(from)).setDisposition("attachment"). msg.setContent(multiPart). //Cho bi t ây là ph n ch a file ính kèm msgBodyPart. //GetMailAPI. } } Chú ý: B n có th dính kèm bao nhiêu file tu ý.mail.*. tp. int smtpPort = 25. //Gán tên t p tin cho BodyPart msgBodyPart.getAllRecipients()). i t ng này dùng ch a các BodyPart */ Multipart multiPart = new MimeMultipart(). msgBodyPart.setSubject(subject). /*T o i t ng BodyPart th hai.RecipientType.*. Ví d GetMailAPI sau minh ho cách nh n mail t trình ch và hi n th ra màn hình. DataSource source = new FileDataSource(fileName).edu.getTransport("smtp"). //T o i t ng Session Trang 215 .addBodyPart(msgBodyPart). new InternetAddress(to)).sun.java import java.Message msg = new MimeMessage(session).addBodyPart(msgBodyPart).

} } //L y v các a ch nh n TO Address[] to = m.RecipientType.smtp. */ } public static void printMessage(Message m) throws Exception { //In ph n tiêu th //L y v các a ch g i Address[] from = m.println("To: " + to[i]).host". store.connect(smtpHost.length.println("From: " + from[i]).close(false).getStore("pop3"). store.out. "thek44a2". } //L y v ngày th cg i Date d = m. for (int i = 0.length.put("mail. //L y v th m c INBOX Folder folder = store. i++) { System.println("Subject: " + subject). props.Properties props = new Properties(). i < from. null). Trang 216 . } } //L y v tiêu th String subject = m.out. System.out.getFolder("INBOX"). if (to != null) { for (int i = 0.println("Date: " + d).getSubject(). props.getFrom(). } //M th m c INBOX v i ch ch c folder. //T o i t ng Store Store store = session. if (from != null) { for (int i = 0.length. i < to. "" + smtpPort).READ_ONLY).getMessages(). if (folder == null) { System.TO). "abc").open(Folder.out. smtpHost). } /* óng k t n i nh ng không xoá các Message t mail server folder.out.close().put("mail.getDefaultInstance(props. i < messages. Session session = Session.exit(1). i++) { System.port".println("No folder").getSentDate(). i++) { printMessage(messages[i]). //L y v các i t ng Message và hi n th ra màn hình Message[] messages = folder. if (subject != null) { System. if (d != null) { System.getRecipients(Message.smtp.

ng cách này b n không c n ph i t o ra i t ng Store 2.println("Unrecognized Content Type")."utehy. Trang 217 .write(c). L y v các thông tin i kèm v i mail n có th l y v các thông tin i kèm v i th nh : ngày g i. //In n i dung c a th Object content = m. } } //L y v các a ch ã ph n h i String replyTo = InternetAddress. } else if (content instanceof InputStream) { InputStream in = (InputStream) content.toString(m.getFolder("INBOX").vn". i++) { System.getFrom()). public static void printInfo(Message m)throws Exception { //L y v a ch c a ng i g i String from = InternetAddress.connect(smtpHost.} //Thêm m t hàng xu ng dòng phân cách ph n tiêu và ph n chính c a th System. int c. store. //L y v th m c INBOX Folder folder = store.getReplyTo()).getContent().getFrom(). if (content instanceof String) { System.getStore("pop3"). "thek44a2".println("From: " + from)."abc"). Folder folder = session.out. } else { // nh d ng này s c gi i thi u trong ph n sau System. if (from != null) { for (int i = 0.read()) != -1) System.getFolder(urlName).110.toString(m.println(content). b n có th thay n ch ng trình sau: Store store = session.println("From: " + from[i]).out. //Ho c Address[] from = m.edu."thek44a2". "abc").out. i n ch ng trình URLName urlName=new URLName("pop3"."INBOX". tiêu … ph ng th c printInfo sau s in ra màn hình các thông tin i kèm v i th . if (from != null) System.out.length.println().out. while ( (c = in. i < from. } } } Chú ý: B n có th không c n dùng i t ng Store.out.

Ví d GetMailAttach.smtp.println("Sent: " + sent).mail.edu.port".println("Reply-to: "+ replyTo). if (subject != null) System.*. //t o ra m t mail Session Properties props = new Properties(). n u có thì ghi n i dung c a file ính kèm xu ng th m c C:\data.getRecipients(Message.getReceivedDate().java minh ho cách ki m tra mail có file ính kèm hay không?.getSentDate().length.smtp.put("mail.*. //Ho c Address[] reply = m.RecipientType.mail. int smtpPort = 25. if (sent != null) System. } 3. //L y v các a ch BCC String bcc = InternetAddress.BCC)). smtpHost). props. props.toString(m.if (replyTo != null) System.sun. //L y v ngày th c nh n Date received = m. if (cc != null) System. if (reply != null) { for (int i = 0.out.*. import javax.out.out.put("mail. import java.println("Subject: " + subject).vn".out. if (to != null) System.pop3.getRecipients(Message.getRecipients(Message. Trang 218 . } } //L y v các a ch TO String to = InternetAddress.RecipientType.toString(m.internet.net.println("Reply: " + reply[i]).*.mail.java import java. Nh n mail v i các file ính kèm N u n i dung th có ch a file ính kèm b n có th tách ph n ính kèm.out. "" + smtpPort). if (bcc != null) System. public class GetMailAttach { public static void main(String[] args) throws Exception { String smtpHost = "utehy.println("Received: " + received).out. import com.host".println("To: " + to). i < reply.toString(m. //L y v các a ch CC String cc = InternetAddress.TO)). if (received != null) System.*.util.io. import javax.CC)).out. //GetMailAttach. i++) { System.*.out.getReplyTo().RecipientType. //L y v ngày th cg i Date sent = m.println("Cc: " + cc).getSubject(). //L y v tiêu c a th String subject = m. ph n th ra.println("Bcc: " + to). import java.

i < messages. } else { //N i dung th ch có m t ph n processPart(messages[i]). /* Ki m tra xem Part có ph i là file ính kèm không? Chú ý không nên s d ng disposition.open(Folder. i < mp. "abc").exit(1). } } // óng k t n i.close(). //L y v các th trong Mail Box Message[] messages = folder. vì disposition có th nh n giá tr null khi ó ph ng th c equals s nh n m t ngo il */ Trang 219 .getCount().getFileName(). /* y v d u hi u cho bi t Part có ph i là ph n file ính kèm không */ String disposition = p.length. nh ng không xoá các th folder. i++) { processPart(mp. "thek44a2".out.getDefaultInstance(props. //N u không có th m c này thì thoát if (folder == null) { System.println("No folder").Session session = Session. //Ki m tra xem n i dung th có nhi u ph n hay không? if (body instanceof Multipart) { //N i dung th g m nhi u ph n processMultipart( (Multipart) body). i++) { //L y v n i dung c a th Object body = messages[i]. store. } } //Ph ng th c x lý m t Part public static void processPart(Part p) { try { //Th l y v tên file c a Part String fileName = p.equals(Part.getStore("pop3"). System. null).connect(smtpHost.getDisposition().close(false). //K t n i v i mail server store. } //M th m c l y th theo ch ch c folder.ATTACHMENT).getBodyPart(i)). //L y v th m c INBOX Folder folder = store.getContent(). } //Ph ng th c x lý th g m nhi u Part public static void processMultipart(Multipart mp) throws MessagingException { for (int i = 0.getFolder("INBOX").READ_ONLY). //L y v Store Store store = session.getMessages(). //X lý t ng th m t for (int i = 0.

printStackTrace().ATTACHMENT.flush().getInputStream()). // óng lu ng g n v i t p in. //Ghi vùng nh m ra t p out. //L y v lu ng nh p g n v i Part InputStream in = new BufferedInputStream(p.available()]. // c n i dung t part vào vùng nh m out.println(e). } } catch (Exception e) { System.close().println(p. } //L y v lu ng xu t g n v i t p tin FileOutputStream out = new FileOutputStream(f).close(). File f = new File("C:/data/" + fileName). } } } Trang 220 .write(buffer).txt".exists().out.err. for (int i = 0.getContent()). i++) { f = new File("C:/data/" + fileName + " " + i). //Khai báo vùng nh t m c n i dung t Part byte buffer[] = new byte[in. e. in.equals(disposition)) { //N u Part là ph n ch a file ính kèm if (fileName == null) fileName = "data.read(buffer).// óng lu ng g n v i Part } else { //Part không ph i là ph n ch a file ính kèm System. f. //Ghi d n h t vùng m ra t p out.if (Part.

Flag.out.SEEN)) { System.out. } if (messages[i].Flag.println("Deleted").isSet(Flags.isSet(Flags.Flag.isSet(Flags. } if (messages[i].Flag.length.out.DELETED)) { System.out.Flag. Ki m tra tr ng thái c c a mail // Ki m tra tr ng thái c a các c : // ã ánh d u xoá if (messages[i].open(Folder.USER)) { // We don't know what the user flags might be in advance // so they're returned as an arrya of strings String[] userFlags = messages[i]. } } Trang 221 . folder.getUserFlags(). Xoá mail 1. Ti p n óng k t n i.close(true).println("Read").Flag.out.println("Draft").isSet(Flags. } // ã c if (messages[i]. } // ã vào thùng rác if (messages[i]. c/ghi nh sau: Ti p n t c xoá: Messages[i].DELETE.println("Recent"). } // ã tr l i if (messages[i].println("User flag: " + userFlags[j]). Xoá mail xoá mail b n m h p th v i quy n Folder folder = store.ANSWERED)) { System.getFolder("INBOX").isSet(Flags. } // ã c gán c if (messages[i].READ_ONLY).out.getMessages().V.//Chú ý b t bu c ph i là tham s true 2.Flag.true).RECENT)) { System.DRAFT)) { System. j++) { System.getFlags(). mail server s t ng xoá mail folder.setFlag(Flags.Flag.out. Message[] messages = folder.println("Marked").FLAGGED)) { System.isSet(Flags. for (int j = 0.isSet(Flags.println("Answered"). j < userFlags.

Có r t nhi u công ngh l p trình phân tán nh : DCOM. B3 là các i t ng c c b . câu h i t ra là làm th nào có th tri u g i các ph ng th c c a m t i t ng n m trên m t máy khác. Thông th ng n u các i t ng c t p trung trên cùng m t máy thì b n có th tri u g i các ph ng th c c a nó b ng cách g u cho nó m t thông báo. Khi t ng d ng có mã l nh th c thi c phân tán trên nhi u máy thì ch ng trình ó c i là ch ng trình phân tán và vi c l p trình t o ra các ch ng trình này c g i là l p trình phân tán. ây là cách l p trình truy n th ng. Sau khi h c xong ch ng này ng i h c có th : Hi u c khái ni m v l p trình phân tán và công ngh RMI ng d ng công ngh RMI xây d ng các ng d ng phân tán Chuy n tham s cho ph ng th c tri u g i t xa và nh n k t qu tr v t ph ng th c tri u g i t xa I. RMI là cách th c giao ti p gi a các i t ng Java có mã l nh cài t (bao g m c ph ng th c và thu c tính) n m trên các máy khác nhau có th tri u g i l n nhau. Trên máy A các i t ng A1. Trong mô hình d i ây thì l i tri u g i ph ng th c c a i t ng B2 ( n m trên máy B) t i t ng A1 ( n m trên máy A) là l i g i ph ng th c t xa. Trang 222 . A2 i các ph ng th c c a nhau c g i là tri u g i ph ng th c c c b (local method invoke) ây là cách l p trình h ng i t ng truy n th ng v n s d ng. EJB. RMI. t c là mã l nh c a nó ã không t p trung trên m t máy mà c phân tán trên nhi u máy. ã khi n các ch ng trình truy n th ng này không còn áp ng c yêu c u n a. Ch ng này ta th o lu n v các khía c nh ó.. trong ó RMI là công ngh thu n Java và d l p trình nh t. CORBA. Các ch ng trình bây gi yêu c u ph i có s h p tác x lý. B2. Tuy nhiên các i t ng Java có th tri u g i ph ng th c c a m t i t ng n m trên m t máy khác d a vào giao th c tri u g i t xa RMI. S phát tri n nh v bão c a m ng máy tính c bi t là m ng Internet toàn c u. t ng t các i ng B1. RMI và l p trình phân tán i t ng Thông th ng mã l nh c a m t ch ng trình khi th c thi c t p trung trên cùng t máy.Ch ng 10: L P TRÌNH PHÂN TÁN V I JAVA RMI ( REMOTE METHOD INVOKE) L p trình phân tán v i RMI là m t trong nh ng v n nóng b ng c a n n công nghi p ph n m m ngày nay. giúp các b n có các ki n th c c b n v l p trình phân tán và công ngh l p trình phân tán RMI. Hình sau mô hình tri u g i i t ng phân tán. ây chính là n i dung c a l p trình phân tán mã l nh RMI (Remote Method Invoke – t m ch là tri u g i ph ng th c t xa).

Ví d khi b n truy n m t i t ng cho m t ph ng th c tri u g i t xa thì th c s b n truy n m t tham chi u i t ng n ph ng th c t xa.Máy A A1 A2 Máy B B2 B1 B3 Máy C C Hình 1: Mô hình tri u g i các ph ng th c t xa II. Phía máy khác l p trung gian này c g i là stub (l p móc). Vai trò c a các l p trung gian i v i l i g i ph ng th c c c b . III. L i g i ph ng th c c c b luôn tr v k t qu thông qua ng n x p trong khi l i g i ph ng th c xa k t qu tr v ph i thông qua k t n i m ng chính vì v y các s c v truy n thông luôn có th s y ra. phía máy ch l p trung gian c g i là skeletion (l p n i). nh v y vi c b t và ki m soát l i trong các ng d ng phân tán là r t t. p trung gian t n t i c hai phía: phía máy khách (n i g i ph ng th c c a i t ng xa) và máy ch (n i i t ng th c s c cài t). G i ph ng th c t xa và các v n phát sinh Vi c tri u g i m t ph ng th c t xa tho t nhìn có v n gi n nh ng th c t l i ph c t p h n tri u g i ph ng th c c c b . Ta có th hình dung l p trung gian stub và skel là hai ng i trung gian giúp các i ng xa có th giao d ch c v i nhau. Trang 223 . tuy nhiên vùng nh th c s c a i t ng l i n m trên m t máy khác. các tham s truy n vào ph ng th c c ng nh t qu tr v t ph ng th c c th c hi n thông qua ng n x p (stack) trong khi l i g i ph ng th c t xa ph i c óng gói và chuy n qua m ng. n gi n và trong su t i v i ng i l p trình i t ng Java trên hai máy khác nhau không tri u g i ph ng th c c a nhau m t cách tr c ti p mà thông qua l p trung gian. Các i t ng trên hai máy khác nhau ho t ng trên hai ti n trình khác nhau (có hai không gian a ch khác nhau) nên vi c tham chi u bi n a ch i t ng là khác nhau.

Máy A A1

A1 C1_stub

Máy C C1_skel

C1

B1_stub

Máy B

B1_skel

B1 Hình 2: G i ph ng th c c a it ng thông qua l p trung gian

Trong hình trên b n có i t ng C1 c cài t trên máy C. trình biên d ch Java giúp ta t o ra hai l p trung gian C1_stub và C1_skel. L p C1_stub c mang v máy A. Khi A1 trên máy A tri u g i ph ng th c c a i t ng C1 nó s chuy n l i g i ph ng th c cho l p trung gian C1_stub. L p trung gian C1_stub có trách nhi m óng gói các tham chuy n tham s qua m ng n ph ng th c c tri u g i c a i t ng C1. Trên máy C l p trung gian C1_Skel có nhi m v nh n các tham s và chuy n vào vùng a ch thích p sau ó g i ph ng th c t ng ng. K t qu tr v (n u có) c a ph ng th c do C1 tr s c l p C1_Skel óng gói và chuy n ng c v cho trình khách. Trên máy khách l p trung gian C1_Stub chuy n giao k t qu cu i cùng l i cho A1. B ng c ch này A1 luôn ngh r ng i t ng C1 ang t n t i ngay trên cùng máy v i nó nh các i t ng c c b khác. H n n a nh có l p trung gian C1_Stub mà khi k t n i m ng g p s c thì l p trung gian stub s luôn bi t cách thông báo l i n i t ng A1. Th c t làm cách nào A1 tham chi u c n C1, m t khi không có i t ng C1 c cài t trên máy A? C1_Stub trên máy A ch th c hi n vi c chuy n tham s , nh n k t qu tr v n u có và th c hi n các giao th c m ng, nó không ph i là hình nh c a C1. làm c u này i t ng C1 c n cung c p m t giao di n t ng ng v i các ph ng th c mà các i t ng trên máy khác có th tri u g i. Chúng ta ti p t c làm sáng t ìêu này khi nói giao di n t xa. IV. Cài t i t ng phân tán 1. Giao di n t xa Khi b n mu n t o ra m t s v t t xa thì b n che m t n cài t n n b ng cách truy n qua m t giao di n. V y khi khách thu c m t tham chi u n i t ng t xa thì th c ch t ó là m t giao di n. Trang 224

Khi t o ra m t giao di n t xa, thì b n ph i tuân theo các h ng d n sau: Giao di n t xa ph i là m t giao di n public, t c là khi t o ra m t giao di n t xa ta ph i thêm t khoá public vào tr c nh ngh a giao di n. B ng không, khi b n tham chi u n i t ng t xa b n s thu c m t ngo i l Giao di n t xa ph i là giao di n c k th a t giao di n Remote i ph ng pháp trong giao di n t xa ph i khai báo RemoteException trong m nh throws bên b t c ngo i l nào khác, t c là t t c các ph ng th c trong giao di n t xa u ph i ném ra ngo i l RemoteException u tham s truy n cho ph ng th c ho c giá tr nh n v t th c tri u g i t xa là m t i t ng thì i t ng ó ph i tri n khai giao di n Remote ho c giao di n Serializable Thông th ng b n th ng th y m t giao di n t xa có c u trúc nh sau:
import java.rmi.*; public interface RemoteInterface extends Remote{ [public] ReturnDataType method1([DataType arg1,][ DataType arg2, RemoteException; [public] ReturnDataType method2() throws RemoteException; } ] ) throws

Ví d 1-1: Sau ây là m t giao di n t xa n gi n c a ng d ng HelloRMI HelloRMI.java import java.rmi.*; public interface HelloRMI extends Remote{ public String sayHello() throws RemoteException; } Nhìn vào giao di n này ta th y nó gi ng b t k giao di n nào khác ngo i tr nó c r ng t giao di n Remote và t t c các ph ng th c trong giao di n này u ph i nem ra ngo i l RemoteException, b n hãy nh r ng t t c các ph ng th c c khai báo trong giao di n s t ng là public, th nên trong giao di n trên b n có th b t khoá public khi khai báo ph ng th c sayHello. B n ti n hành biên d ch javac HelloRMI.java b n s thu c t p tin HelloRMI.class 2. Tri n khai giao di n t xa Sau khi b n t o ra giao di n t xa, công vi c ti p theo mà b n c n ph i làm là tri n khai t t c các ph ng th c trong giao di n t xa. Ví d 1-2: Sau ây là cài t c a giao di n t xa HelloRMI HelloRMIImpl.java
import java.rmi.*; public class HelloRMIImpl implements HelloRMI { public String sayHello() throws RemoteException { return "Hello RMI"; } }

V n t ra là làm th nào cài t i t ng HelloRMI lên m t máy (máy 2) và g i ph ng th c sayHello() c a HelloRMI t máy khác (máy 1)? Nh ã nêu trên ta không i c ph ng th c sayHello c a HelloRMI m t cách tr c ti p mà c n có thêm hai l p trung gian là HelloRMIImpl_Stub và HelloRMIImpl_Skel. D a vào l p Trang 225

HelloRMIImpl.class, trình biên d ch rmic.exe c a Java s giúp ta t o ra hai l p trung gian Stub và Skel. B n m c a s DOS – Prompt và gõ vào dòng l nh Rmic HelloRMIImpl.class t qu b n s thu c hai t p HelloRMIImpl_Stub.class và HelloRMIImpl_Skel.class 3. Cài t, ng kí i t ng t xa B c ti p theo sau khi b n cài t giao di n t xa là công vi c ng ký nó v i trình rmiregistry theo m u sau: Ví d 1-4: Ví d sau là ch ng trình ng ký và cài t i t ng HelloRMIImpl v i trình ch rmiregistry. Setup.java
import java.rmi.server.*; import java.rmi.*; import java.net.*; public class Setup { public static void main(String[] args) { // t o ra m t th hi n c a i t ng t xa HelloRMI h=new HelloRMIImpl(); try { // Khai báo i t ng có kh n ng tri u g i t xa UnicastRemoteObject.exportObject(h); // ng ký nó v i trình rmiregistry Naming.bind("//localhost/hello , h); // có th thay ph ng th c bind b i ph ng th c rebind nh sau: // Naming.rebind("//localhost/hello , h); } catch (MalformedURLException ex) { } catch (AlreadyBoundException ex) { } catch (RemoteException ex) { } } }

Công vi c u tiên b n ph i làm khi cài t i t ng t xa là t o ra m t th hi n a i t ng t xa. HelloRMI h=new HelloRMIImpl(); b n có th thay b ng dòng l nh HelloRMIImpl h=new HelloRMIImpl(); Ti p theo b n g i ph ng th c t nh exportObject c a l p UnicastRemoteObject java bi t i t ng h (HelloRMI) là i t ng có kh n ng truy xu t t xa. UnicastRemoteObject.exportObject(h); máy o

u ý s d ng c l p UnicastRemoteObject b n ph i khai báo import java.rmi.server.*; u ch ng trình

Trang 226

c cu i cùng là b n t cho i t ng h m t cái tên g i nh và ng ký tên này ib ng ký rmiregistry. Ph ng th c t nh c a l p Naming s th c hi n u này Naming.bind("[rmi:]//hostname[:port]/name , h); Ph ng th c bind có hai tham s : tham s th nh t là m t chu i nh v URL, i s th hai là b n thân i t ng c n ng ký Chu i nh v URL có nh d ng nh sau: [rmi:]//hostname[:port]/name Trong ó: mri là tên giao th c, ây là ph n tu ch n, m c nh giao th c là rmi nên b n có th b qua. Hostname là tên c a máy ch ho c a ch IP c a máy ch n i i t ng phân tán ang n t i. Port là s hi u c ng c a ch ng trình rmiregistry, ây là tham s tu ch n, n u b qua tham s này thì c ng m c nh là 1009 Name là tên g i nh c a i t ng phân tán Ph ng th c bind s i vào vòng l p vô h n ch k t n i t máy kách. Các ch ng trình phía máy khách s d a vào chu i nh v URL mà ta ng ký v i trình rmiregistry truy tìm tham chi u n i c n dùng. n có th kh i ng b ng ký rmiregistry này âu? B n m c a s DOS-Prompt và cho ch y ch ng trình rmiregistry này t dòng l nh nh sau: C:\JDK1.4\bin\rmiregistry.exe u trong WintNT thì b n có th ch y nó nh m t d ch v b ng dòng l nh start C:\JDK1.4\bin\rmiregistry.exe Sau khi kh i ng ch ng trình rmiregistry b ng m t trong hai cách b n không th y ph n h i gì c b i vì ây là ch ng trình ch y d i d ng d ch v (service). M c nh rmiregistry l ng nghe các k t n i trên c ng 1009. B n có th ch nh ng khác cho nó. Ví d l nh sau s kh i ng rmiregistry trên c ng 2004 C:\Jdk1.4\bin\rmiregistry.exe 2004 Chú ý: Trong java 1 hostname không th là localhost, ngh a là n u b n mu n th nghi m trên máy c c b thì b n ph i truy n cho nó m t a ch IP ch ng h n nh 127.0.0.1 ho c tên c a máy ( bi t tên c a máy c a mình b n vào Control Panel\Net Work ch n th Indentification và b n s th y tên máy c a mình trong ph n Computer Name) RMI s không làm vi c ch ng nào b n ch a cài h giao th c TCP/IP. u b n ang ki m th trên máy c c b thì b n có th ng ký v i trình rmiregistry d n gi n nh sau: Naming.bind(“hello”,h); u b n ng ký m t i t ng m i v i m t cái tên g i nh ã c s d ng cho m t i t ng khác b n s nh n c m t ngo i l AlreadyBoundException. ng n c n u này b n nên dùng ph ng th c Naming.rebind() thay cho ph ng th c Naming.bind() vì Naming.rebind() b sung m t cái tên m i n u nó ch a có và thay th m t cái tên ã t n t i i m t i t ng m i. Cho dù ph ng th c main() k t thúc thì i t ng t xa b n t o ra và ng ký cho nó t cái tên v n còn ó ch ng nào mà rmiregistry v n còn ang ch y và b n không g i Trang 227

ph ng th c Naming.unbind() thì s v t này v n còn ó. B i lý do này, khi b n phát tri n ng d ng c a mình thì b n c n ph i t t rmiregistry và cho ch y l i nó m i khi b n biên d ch i i t ng t xa. n không nh t thi t ph i kh i ng rmiregistry nh m t ti n trình ngoài. N u b n bi t ng ng d ng c a mình là ng d ng duy nh t s dùng s ng ký. Thì b n có th b t u nó bên trong ch ng trình c a mình b ng dòng l nh: LocateRegistry.createRegistry(Port); ây Port là s hi u c ng. u này là t ng ng v i vi c ch y rmiregistry Port t d u nh c c a DOS-Prompt 4. Vi t trình khách tri u g i ph ng th c c a i t ng cài t t xa Trình khách tri u g i i t ng phân tan RMI có th là m t trong các ki u ng d ng sau: ng d ng console ng d ng có giao di n ho ng d ng Servlet trang JSP … u duy nh t b n ph i làm trong ch ng trình khách là tra c u và l y v giao di n xa t trình ch . T ó tr i vi c tri u g i ph ng th c t xa gi ng nh là tri u i ph ng th c c a b t k i t ng c c b nào khác. Sau ây là m u ch ng trình phía trình khách tri u g i i t ng phân tán RMI import java.rmi.*; import java.rmi.registry*; public Client { public static void main(String args[]) throws RemoteException { // l y v tham chi u i t ng phân tán b ng ph ng th c Naming.lookup() RemoteInterface r=(RemoteInterface)Naming.lookup(“[rmi:]//hostname[:port]/name”); // tri u g i các ph ng th c c a i t ng t xa } } Ví d 1-5: Sau ây là trình khách tri u g i i t ng HelloRMI Client.java import java.rmi.*; import java.rmi.registry*; public Client { public static void main(String args[]) throws RemoteException {// l y v tham chi u i t ng phân tán b ng ph ng th c Naming.lookup() HelloRMI r=( HelloRMI)Naming.lookup(“//localhost/hello”); // tri u g i ph ng th c sayHello c a i t ng t xa System.out.println(HelloRMI.sayHello()); } } Trang 228

truy tìm i t ng xa, ch ng trình máy khách g i ph ng th c Naming.lookup(); Ph ng th c này ch yêu c u i s là chu i cho bi t a ch c a máy ch và tên ng ký c a i t ng. RemoteInterfacer=(RemoteInterface)Naming.lookup(“[rmi:]//hostname[:port]/name”); M c nh ph ng th c Naming.lookup() tr v m t tham chi u Object nên b n c n ph i ép ki u sang giao di n t xa. B n có th hình dung ph ng th c Naming.lookup() óng vai trò nh m t d ch v tìm ki m i t ng trên máy ch , nó liên l c v i trình rmiregistry trên máy ch và yêu c u tr tham chi u i t ng cho b n s d ng. Còn Naming.bind() óng vai trò nh d ch v ng ký. Biên d ch và ch y trình khách Javac Client.java tc s n sàng, b n hãy ch y ch ng trình khách nh sau: Java Client t qu thu c là l i chào “Hello RMI” Hình 3 di n t c ch g i ph ng th c t xa c a các i t ng RMI m t cách t ng quát: ng ký i t ng v i trình rmiregistry b ng cách g i ph ng th c Naming.bind() ho c Naming.rebind(). Máy khách mu n g i ph ng th c c a i t ng trên máy ch tr c h t c n ph i g i ph ng th c Naming.lookup() truy tìm tham chi u n i t ng xa theo tên. ng ký s tr v tham chi u c a i t ng xa thông qua giao di n t xa. a vào giao di n t xa mà trình khách có th g i các ph ng th c c a i t ng xa. Khi m t ph ng th c c g i, l i g i s c chuy n n l p trung gian _Stub. L p trung gian này có nhi m v óng gói các tham s và chuy n n l p trung gian _Skel trên trình ch . p trung gian trên máy ch s ti p nh n các tham s g i n t trình khách và tr c ti p yêu c u i t ng th c thi ph ng th c và chuy n k t qu (n u có) v cho trình khách. . M¸y kh¸ch
Client Naming.looku p2
3

M¸y chñ
rmiregistry Naming.bin d Naming.rebi HelloRMIIm nd pl
6 1

HelloRMI
4

HelloRMIImpl_Stub
5

HelloRMIImpl_Skel

Ví d 2: Vi t l p Calculator, l p này có các ph ng th c add, less, mul, div dùng hi n các phép toán t ng ng c ng, tr , nhân và chia c 1: t o ra giao di n t xa - M m t trình so n th o b t k gõ vào n i dung nh sau: Trang 229

th c

//Calculator.java import java.rmi.*; public interface Calculator extends Remote { float add(float a, float b) throws RemoteException; float less(float a, float b) throws RemoteException; float mul(float a, float b) throws RemoteException; float div(float a, float b) throws RemoteException; } - Ghi l i vào th m c C:\NetWork\Server - M c a s DOS-Prompt và gõ vào dòng l nh biên d ch nh sau:

c 2: Cài t giao di n t xa - M trình so n th o b t k gõ vào n i dung sau: // CalculatorImpl.java
import java.rmi.RemoteException; public class CalculatorImpl implements Calculator { public float add(float a, float b) throws RemoteException { return a+b; } public float less(float a, float b) throws RemoteException { return a-b; } public float mul(float a, float b) throws RemoteException { return a*b; } public float div(float a, float b) throws RemoteException { return a/b; } }

- Ghi l i v i cái tên CalculatorImpl.java - M c a s DOS_Prompt và gõ vào dòng l nh sau

biên d ch

Trang 230

sau khi biên d ch b n thu c t p tin CalcultatorImpl.class c 3 T o ra các l p trung gian _Stub và _Skel n m c a s DOS_Prompt và gõ vào dòng l nh

Sau khi th c hi n xong l nh này b n s thu c hai l p trung gian là CalcultatorImpl_Stub và CalcultatorImpl_Skel trong cùng th m c C:\network\server c 4: ng ký i t ng t xa v i trình rmiregistry - B n m trình so n th o b t k và gõ vào n i dung nh sau: // CalculatorSetup.java import java.rmi.server.*; import java.rmi.*; public class CalculatorSetup { public static void main(String[] args) throws Exception{ Calculator c=new CalculatorImpl(); UnicastRemoteObject.exportObject(c); Naming.rebind("rmi://localhost/Cal",c); } } - Ghi l i v i cái tên CalculatorSetup.java trong vào th m c c:\network\server - M c a s DOS_Prompt gõ vào dòng l nh sau:

Trang 231

chuy n vào th m c C:\NetWork\Server và gõ vào dòng l nh sau: ng trình ang ký ã c kh i ng c 6: Kh i ng trình setup n m c a s DOS-Prompt khác gõ vào dòng l nh Chú ý: N u b n không chuy n vào th m c C:\NetWork\Server tr ang ký thì b n s nh n cm tl i Ch c khi kh i ng d ch Trang 232 .c 5: Kh i ng d ch v ng ký tên rmiregistry n m c a s DOS-Prompt.

Ch ng 11: JAVA JSP (JAVA SERVLET) Trang 233 .

nh ng chúng ph i là ph ng th c public. Chính tên ph ng th c m i báo cho công c xây d ng bi t ây có là m t thu c tính hay m t s ki n hay ch là m t ph ng th c thông th ng. T ng quan v JavaBean JavaBean là m t công ngh l p trình h ng thành ph n c a Sun d a trên n n t ng a ngôn ng Java. Nh v y t JavaBean c ng có các thu c tính và các ph ng th c. nh ng n c ng có th dung “is” thay cho “get”. Các ph ng th c thông th ng c a Bean không tuân theo quy t c trên. M t câu h i b n t ra là làm th nào ng i dùng Bean c a b n có th bi t c trong Bean ó có nh ng thu c tính. B ng cách s d ng JavaBean các nhà phát tri n ng d ng có th gi m kh i ng mã mà h ph i vi t. H có th t vi t ra chúng ho c có th mua l i c a m t hãng phát tri n th ba khác (third party). u Bean cho phép ng ký thính gi thì v i m t thính gi (listener) XxxListener b n ph i có hai ph ng th c t ng ng i kèm là addXxxListener(XxxListener) và Trang 234 . Nh ng thành ph n JavaBean có th c “nhúng” vào t ng d ng. Xây d ng thành ph n JavaBean Nh ã gi i thi u trên JavaBean th c ch t là m t l p java thông th ng. JavaBean th c ch t là m t l p Java nh các l p Java thông th ng khác. i m t thu c tính boolean. bi t c các thu c tính và các ph ng th c c a m t Bean n ch c n tuân th theo quy t c t tên sau: i m t thu c tính có tên là xxx. thì b n t o ra hai ph ng th c: getXxx() và setXxx(). B n không c n ph i vi t thêm b t c mã ph nào hay s d ng nh ng m r ng ngôn ng c bi t nào t o ra m t Bean. II. JavaBean là m t giao di n l p trình dùng t o ra nh ng kh i mã xây ng s n và có th dùng l i c. ph ng th c nào. B n c ng chú ý cho là tên c a thu c tính và ki u cho “get” và “set” là không liên quan. b n có th dùng cách ti p c n “get” và “set” trên. u ý r ng ký t th nh t sau “get” hay “set” ph i vi t hoa. ki u c a chúng ra làm sao? u này ã c các nhà thi t k java gi i quy t m t cách r t n gi n.Ch ng 12: EJB (ENTERPRISE JAVA BEANS) Ch ng này ta s nghiêm c u và xây d ng m t trong nh ng thành ph n thú v c a java ó là JavaBean m t mô hình quan tr ng trong ki n trúc c a Java. Các v n chính s c c p trong ch ng này JavaBean và công ngh ph n m m Tìm hi u các thành ph n c a JavaBean Tìm hi u b phân tích Introspector c a java Xây d ng và s d ng JavaBean Tích h p JavaBean v i các công ngh thành ph n khác I. liên k t v i thành ph n JavaBean khác hay c dùng k t n i v i các ng d ng. Ki u tr v c a ph ng th c “get” c ng chính là ki u c a i ph ng th c “set” và th ng thì chúng c ng là ki u c a thu c tính xxx. nh ng nó c vi t theo m t quy t c quy nh tr c. u duy nh t b n ph i làm h i s a cách t tên cho các ph ng th c c a mình.

thông th ng các thu c tính th ng c t m c truy c p là private. Ví d : Trình bày cách t o ra các thu c tính và cách xây d ng các ph ng th c “get” và “set” public class Bean1 { private String str. // thu c tính ki u String private int i. thu c tính này là m t //m ng nên tham s là m t ng public void setArr(int[] arr) { this. } public void setI(int i) { //ph ng th c set cho thu c tính i this. Ph n l n các bi n c và thính gi là có s n b n có th t t o ra các bi n c và thính gi riêng c a mình.} } Thu c tính myName trong l p xBean c l y và gán gián tr thông qua ph ng th c getName và setName.removeXxxListener(XxxListener). } //Ph ng th c get cho thu c tính arr thu c tính này là m t //m ng nên giá tr tr v là m t ng public int[] getArr() { return arr. // thu c tính ki u m ng int private boolean b.arr = arr. public String getStr() { //Ph ng th c get cho thu c tính str return str.io. Ví d v i m t Bean n gi n có tên là xBean nh sau: public class xBean { private String myName.DataOutputStream os. Thu c tính c a Bean Thu c tính th c ch t là m t bi n n m bên trong m t l p. } //Ph ng th c set cho thu c tính arr. } public void setStr(String str) { //Ph ng th c set cho thu c tính str this.DataInputStream is. truy c p n các thu c tính private này ta th ng dùng hai ph ng th c: “get” mang ngh a là l y giá tr c a thu c tính và “set” hàm ngh a gán giá tr cho thu c tính. // thu c tính ki u int private int[] arr. } public int getI() { //Ph ng th c get cho thu c tính i return i.} public void setName(String newName) { myName=newName.io. public String getName() { return myName. // thu c tính ki u logic private float f. } Trang 235 . // thu c tính ki u i t ng private java. // thu c tính ki u float private java.i = i. Khi B phân tích (Instrospector) c a java th y trong Bean có hai ph ng th c tên là getName và setName nó s hi u r ng bên trong Bean này có m t thu c tính tên là name (vì có hai ph ng th c tên là getName và setName). Nh b n th y gi a tên thu c tính và tên ph ng th c “get” và “set” là không liên quan n nhau.str = str. 1.

DataOutputStream getOs() { return os. } } a) Các thu c tính th hi n s thay i (Bound Property) JavaBean là các thành ph n riêng bi t nh ng nó v n có th t ng tác v i các i ng khác thông qua c ch truy n thông p (message).f = f. } public void setOs(java. Object oldValue.io.. } public float getF() { return f. public void addSizeListener(PropertyChangeListener lst){ } public void removeSizeListener(PropertyChangeListener lst){ } } Các i t ng mu n nh n c thông báo t JavaBean này u ph i cài t giao di n PropertyChangeListener . S thay i bao Trang 236 .io.DataOutputStream os) { this.is = is. ch cài t m t thu c tính có th thông báo cho các i t ng khác bi t khi nó thay i r t n gi n ch c n cài t hai ph ng th c dùng ng ký và lo i b m t i t ng listener nh sau: public void add<PropertyName>Listener(PropertyChangeListener lst) public void remove<PropertyName>Listener(PropertyChangeListener lst) Ví d : n có m t JavaBean A có m t thu c tính size cho bi t kích c gì ó. } //n u thu c tính là m t i t ng thì ph ng th c get tr //v m t i t ng ki u i ng public java. } public java. } public void setB(boolean b) { this. Khi m t thu c tính c a m t Bean A thay i nó có th thông báo cho các i t ng khác bi t là thu c tính c a A ã thay i i t ng này th c hi n công vi c gì ó ch ng h n nh c p nh t l i giá tr c a nó theo thu c tính c a A. Khi thu c tính size thay i các i t ng khác u bi t s thay i này ta cài t nh sau: public class BeanA {float size. sau ó ng ký v i thành ph n BeanA nh các ph ng th c mà b n xây d ng b c trên. private PropertyChangeSupport changeSize=new PropertyChangeSupport(this).io.//Ph ng th c get cho thu c tính b. } public void setF(float f) { this. } public void setIs(java.b = b.} Các th t c trên ây ch th c hi n nhi m v ng ký và t o i t ng Listener mà thôi.os = os.io. Object newValue) Ph ng th c này s thông báo n m i i t ng listener (b ng cách g i ph ng th c propertyChange c a listener) ã ng ký v i thành ph n JavaBean. do thu c tính này ki u //logic nên b n có th s d ng is thay cho get public boolean isB() { return b.DataInputStream is) { this.DataInputStream getIs() { return is. các i t ng Listener này có th nh n bi t c s thay i c a thu c tính size ta ph i g i ph ng th c firePropertyChange c a i t ng PropertyChangeSupport t thành ph n BeanA nh sau: public void firePropertyChange (String propertyName. Ph ng th c duy nh t mà b n ph i ghi è khi cài t giao di n PropertyChangeListener là public void propertyChange(PropertyChangeEvent evt) {.

beans. new Float(oldSize).addSizeListener(new MyListener()).setSize(333).getPropertyName(). public class TestBeanA { public static void main(String[] args) { // t o ra m t i t ng BeanA BeanA ba = new BeanA().*.java import java. size = newSize. } public void addSizeListener(PropertyChangeListener lst) { changeSize. // changeSize có nhi m v qu n lý các i t ng listener ã ng //ký và g i thông báo n chúng m i khi thu c tính size thay i PropertyChangeSupport changeSize = new PropertyChangeSupport(this). } //Ph ng th c gán giá tr cho cho thu c tính size public void setSize(float newSize) { float oldSize = size. public float getSize() { return size.java t trên import java.getOldValue()).beans. //thay i giá tr c a thu c tính size ba.floatValue(). float newdSise = ( (Float) evt.*.m giá tr tr c khi thay i (oldValue) và giá tr sau khi thay i (newValue) và tên thu c tính c thay i. } } Ví d sau th nghi m BeanA v a cài // TestBeanA. D i ây là cài t l p BeanA và m t l p th nghi m thu c tình nh n bi t s thay i size //BeanA. ph ng th c này // c tri u g i m i khi thu c tính thay i public void propertyChange(PropertyChangeEvent evt) { float oldSise = ( (Float) evt.removePropertyChangeListener(lst). Trang 237 . //N u có thay i v kích th c thì thông báo n t t c các i //t ng ã ng ký l ng nghe if(oldSize!=newSize) changeSize. String propertyName = evt. } } //T o ra i t ng có kh n ng l ng nghe s thay i c a thu c tính class MyListener implements PropertyChangeListener { //Ph ng th c duy nh t c n ph i cài t. } public void removeSizeListener(PropertyChangeListener lst) { changeSize.floatValue(). new Float(newSize)). public class BeanA { //Khai báo thu c tính size private float size.firePropertyChange("size". // ng ký i t ng l ng nghe v i i t ng ba ba.addPropertyChangeListener(lst).getNewValue()).

i t ng l ng nghe có th t ch i s thay i và nh v y giá tr c a thu c tính v n gi nguyên giá tr ban u. Ph ng th c duy nh t mà b n ph i ghi è khi cài t giao di n VetoableChangeListener là public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException {. T ng t nh thu c tính bound m i khi thu c tính constrain nh thay i giá tr (ch d nh ch ch a thay i) nó s thông báo n t t các i t ng ang l ng nghe. } i t ng l ng nghe không ng ý cho thay i thu c tính nó ch c n ném ra m t ngo i l PropertyVetoException. Object newValue) Trang 238 . Ng c l i n u t t c các i t ng ng nghe u không ph n i s thay i thì lúc ó thu c tính này m i nh n c giá tr i. Object oldValue.println("Change " + propertyName + " old value " + oldSise + " new value " + newdSise). m t thu c tính có th thông báo cho các i t ng khác bi t khi nó s p thay i giá tr r t n gi n b n ch c n cài t hai ph ng th c dùng ng ký và lo i b t i t ng listener nh sau: public void add<PropertyName>Listener(VetoableChangeListener lst) public void remove<PropertyName>Listener(VetoableChangeListener lst) Các i t ng mu n nh n c thông báo t JavaBean này u ph i cài t giao di n VetoableChangeListener. } } t qu khi ch y ch ng trình nh sau: Change size old value 1. Các i t ng s không bi t n s thay i c a thu c tính size cho n khi b n g i ph ng th c firePropertyChange c a i t ng PropertyChangeSupport. Java cung c p m t kh n ng khác m nh h n ó là t o ra các thu c tính b ràng bu c (constrain property). b) Các thu c tính ràng bu c (Constrain Property) H n ch c a các thu c tính bound trên là các i t ng ch ph n ng l i khi giá tr a thu c tính ã b thay i.out.0 Chú ý: Trong ví d trên tên c a ph ng th c dùng ng ký là addSizeListener và tên c a ph ng th c dùng g b ng ký là removeSizeListener tuy nhiên b n có th t cho nó m t cái tên thu thích ch ng h n nh dangKyLangNghe ng ký i ng l ng nghe hay huyBoLangNghe hu b i t ng l ng nghe. ng nh thu c tính bound.0 new value 333. khi thu c tính constrain có d nh thay i giá tr trong ph ng th c “set” nó c n thông báo n các i t ng ã ng ký l ng nghe (listener) v i nó b ng ph ng th c fireVetoableChange c a i t ng VetoableChangeSupport t thành ph n JavaBean nh sau: public void fireVetoableChange (String propertyName.. lo i v i thành ph n BeanA nh các ph ng th c mà b n xây d ng b c trên. sau ó ng ký. thành ph n JavaBean có thu c tính constrain s b t y và hu b vi c thay i giá tr cho thu c tính.System.

beans.fireVetoableChange("size".removeVetoableChangeListener(lst). i t ng listener này s t ch i không cho thay i n u size >100. } //Ph ng th c dùng g b i t ng l ng nghe public void removeSizeListener(VetoableChangeListener lst) { vetoAgent. Nh n xét: i t ng VetoableChangeSupport c ng t ng t nh i t ng PropertyChangeSupport dùng qu n lý các i t ng listener. //Ph ng th c l y v giá tr c a thu c tính size public int getSize() { return size. try { // Thông báo n t t c các i t ng ã ng ký l ng nghe vetoAgent. oldSize. // BeanB.*. newSize). } catch (PropertyVetoException ex) { // N u có m t listener nào ó ph n i không cho phép thay i //giá tr c a thu c tính size thì k t thúc ph ng th c return. } } Ví d sau dùng test th BeanB v a t o // TestBeanB.addVetoableChangeListener(lst). PropertyChangeSupport c dùng v i các thu c tính bound còn VetoableChangeSupport dùng cho thu c tính constrain. // vetoAgent vó nhi m v qu n lý t t c các i t ng listener // ã ng ký private VetoableChangeSupport vetoAgent = new VetoableChangeSupport(this).java import java. } //Ph ng th c dùng thay i giá tr c a thu c tính size public void setSize(int newSize) { int oldSize = size. } //N u t t c các listener u không ph n i s thay i thì // ti n hành gán giá tr m i cho thu c tính size size = newSize. public class TestBeanB { public static void main(String[] args) { Trang 239 . public class BeanB { //Khai báo thu c tính size private int size = 0. i ây là m t cài t cho m t JavaBean B có thu c tính size. M i khi size thay i nó s thông báo cho các thành ph n khác bi t thông qua i t ng listener.Ph ng th c này s thông báo n m i i t ng listener (b ng cách g i ph ng th c vetoableChange c a listener) ã ng ký v i thành ph n JavaBean.beans.*.java import java. } //Ph ng th c dùng ng ký i t ng l ng nghe public void addSizeListener(VetoableChangeListener lst) { vetoAgent.

println(">Sau khi gan thuoc tinh size= "+b.addSizeListener(new MyListener()).getOldValue()).getSize()). System.getSize()).getSize()).setSize(234).getSize()).println("size=10").setSize(123).println("size=234"). System.//T o ra m t i t ng BeanB BeanB b = new BeanB(). System. //Gán giá tr 123 (123>100) cho thu c tính size b.out. //Gán giá tr 234 (234>100) cho thu c tính size b.out.out.println(">Sau khi gan thuoc tinh size= "+b. System. System.out.println(">Sau khi gan thuoc tinh size= "+b. //Gán giá tr 56 (56>100) cho thu c tính size b. System. } } //Cài t l p l ng nghe bi n c VetoableChangeListener class MyListener implements VetoableChangeListener { //Ghi è ph ng th c vetoableChange public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException { int oldSize = ( (Integer) evt.intValue().setSize(56). evt).getPropertyName().println("size=123").setSize(10).println("size=56"). System. int newSize = ( (Integer) evt.out.out. String propName = evt. } } t qu khi ch y ch ng trình size=10 >Sau khi gan thuoc tinh size= 10 size=123 >Sau khi gan thuoc tinh size= 10 size=234 >Sau khi gan thuoc tinh size= 10 size=56 >Sau khi gan thuoc tinh size= 56 Trang 240 . // ng ký i t ng l ng nghe b.getNewValue()).println(">Sau khi gan thuoc tinh size= "+b.out.intValue(). System. //N u newSize>100 thì không cho thay i b ng cách ném ra m t //ngo i l PropertyVetoException if (newSize > 100) throw new PropertyVetoException( "Gia tri gan cho Size lon hon 100".out. //Gán giá tr 10 (10<100) cho thu c tính size b.

4. 4. Các i t ng khác mu n l ng nghe và x lý bi n c do JavaBean c a b n g i n nó ph i cài t giao di n l ng nghe t ng ng và ph i ng ký nó v i JavaBean c a b n. Ví d : JavaBean c a b n có th x lý các bi n c v chu t do các i t ng khác g i n. Xây d ng các ph ng th c cho JavaBean Các ph ng th c c a JavaBean c xây d ng nh các ph ng th c thông th ng. import java. có th l ng nghe và x lý các bi n c do các i t ng khác g i n JavaBean c a b n ch c n tri n khai các giao di n t ng ng và cài t các ph ng th c n thi t trong các giao di n ó. public class Bean3 implements MouseListener { public void mouseClicked(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } } Nh n xét: Nh b n th y vi c t o ra m t JavaBean có th l ng nghe các bi n c hoàn toàn ng t nh vi c t o ra các i t ng l ng nghe bi n c khác. T o ra JavaBean có kh n ng l ng nghe bi n c M t JavaBean có th c thi t k l ng nghe m t s bi n c do các i t ng khác g i n.Event Source). ng ký i t ng listener v i thành ph n JavaBean các thành ph n khác có th ng ký c i t ng listener v i thành ph n JavaBean thì b n thân thành ph n JavaBean c a b n ph i cài t hai ph ng th c theo khuôn m u (pattern) sau: public synchronized void add<EventListener>(<EventListener> lst) public synchronized void remove<EventListener>(<EventListener> lst) Ví d : các i t ng khác có th ng ký i t ng listener cho tình hu ng nh n chu t thì JavaBean c a b n ph i cài t hai ph ng th c ng ký nh sau: Trang 241 .MouseListener. sau ó ng ký nó v i các i t ng ngu n.event.MouseEvent.event. Lúc này JavaBean c a b n c coi là i t ng ngu n i t ng phát sinh bi n c . T o ra JavaBean có th ng ký i t ng l ng nghe bi n c Ngoài vi c b n có th t o ra các JavaBean có th l ng nghe bi n c do các i t ng khác g i n b n còn có th t o ra các JavaBean có kh n ng ng ký và g i i các bi n c n các i t ng l ng nghe khác.awt. 3.1. JavaBean c a b n ch c n cài t giao di n MouseListener nh sau: import java.2.awt.

setText("Mouse JavaBean").public synchronized void addMouseListener(MouseListener l) public synchronized void removeMouseListener(MouseListener l) Thành ph n JavaBean c n l u l i danh sách các listener ã ng ký.event. i ây là m t ví d minh ho .*. Th c ch t nó ch a g i i b t c thông báo nào n i t ng l ng nghe. import javax.removeElement(l). Khi t JavaBean mu n thông báo n các i t ng l ng nghe nó ch c n duy t trong danh sách các i t ng ã ng ký l ng nghe bi n c và g i ph ng th c t ng ng mà i ng listener ã cài t.util.CENTER).swing. ta xây d ng thành ph n JavaBean có kh n ng ti p nh n các i t ng listener dùng x lý tình hu ng chu t.addElement(l). JavaBean s g i n t ng ph ng th c t ng ng c a các listener này. // MouseBean. this. } } Hai ph ng th c trên ch là hình th c dùng ng ký và lo i b các i t ng l ng nghe mà thôi. } //Ph ng th c dùng lo i b i t ng l ng nghe bi n c Trang 242 . // T o ra m t nút l nh JButton jButton1 = new JButton().contains(l)) { mouseListeners.*. import java. public class MouseBean extends JPanel { // M t Vecto l u tr các i t ng listener private transient Vector mouseListeners = new Vector().setLayout(new BorderLayout()). jButton1. // Thêm vào danh sách } } //Ph ng th c dùng lo i b m t listener public synchronized void removeMouseListener(MouseListener l) { if (mouseListeners != null && mouseListeners.awt. BorderLayout.add(jButton1.awt. Khi mu n chuy n giao tình hu ng.java import java.*. this. import java.*. public MouseBean() { jButton1.contains(l)) { mouseListeners. N u có nhi u listener cùng ng ký thì JavaBean c a b n th ng l u l i danh sách các i t ng listener ã ng ký b ng m t Vecto nh sau: //T o ra m t Vecto l u l i danh sách các listener ã ng ký private transient Vector mouseListeners=new Vector(). //Ph ng th c ng ký i t ng listener public synchronized void addMouseListener(MouseListener l) { //N u listener ng ký ch a có trong danh sách thì thêm nó vào if (!mouseListeners.addMouseListener(new MyListener(this)).

addElement(l). } } } /*Khi chu t c kích trên nút l nh thì thông báo n t t c các i t ng ã ng ký ng nghe b ng cách g i ph ng th c fireMouseClicked */ void jButton1_mouseClicked(MouseEvent e) { fireMouseClicked(e). i < count.swing. Khi b n kích chu t trên MouseBean thì thính gi này s xu t hi n t h p thông báo (message).size(). import java. MyListener(MouseBean adaptee) { this. for (int i = 0. } } /*Ph ng th c này dùng thông báo n t t c các i t ng l ng nghe bi n c khi có ki n mouseClick s y ra trên i t ng jbutton1*/ protected void fireMouseClicked(MouseEvent e) { if (mouseListeners != null) { int count = mouseListeners. i++) { ( (MouseListener) listeners.awt.java import javax. } public void mouseClicked(MouseEvent e) { adaptee.mouseClicked(e). import java.public synchronized void removeMouseListener(MouseListener l) { if (mouseListeners != null && mouseListeners.*.removeElement(l). } } //Ph ng th c dùng ng ký i t ng l ng nghe bi n c public synchronized void addMouseListener(MouseListener l) { if (!mouseListeners.awt. public class Frame1 extends JFrame { //t o ra i t ng MouseBean Trang 243 . } } //T o ra l p l ng nghe s ki n chu t c a nút l nh class MyListener extends java.event.event. } } Sau ây là ng d ng test th thành ph n MouseBean.elementAt(i)).awt.*.jButton1_mouseClicked(e).contains(l)) { mouseListeners.adaptee = adaptee.contains(l)) { mouseListeners. // Frame1.MouseAdapter { MouseBean adaptee. Có m t thính gi l ng nghe bi n click trên MouseBean.*.

setDefaultCloseOperation(EXIT_ON_CLOSE). MouseBeanListener(Frame1 adaptee) { this.util. 150).setLayout(null). f. this. } public void mouseClicked(MouseEvent e) { adaptee.setBounds(new Rectangle(61.mouseBean1_mouseClicked(e). // ng ký i t ng l ng nghe v i i t ng MouseBean mouseBean1. 48)).event. 34. this.showMessageDialog(this. } //Khi kích chu t vào MouseBean thì hi n th h p thông báo void mouseBean1_mouseClicked(MouseEvent e) { JOptionPane. f.setLocale(java.adaptee = adaptee. this.setVisible(true).MouseAdapter { Frame1 adaptee. 100.getContentPane(). null).JOptionPane.MouseBean mouseBean1 = new MouseBean().addMouseListener(new MouseBeanListener(this)).awt. 270. } public static void main(String[] args) { Frame1 f = new Frame1(). 137.INFORMATION_MESSAGE). "Ban vua kich chuot vao MouseBean"."Test MouseBean".add(mouseBean1. public Frame1() { this.getContentPane(). mouseBean1. } } //T o ra i t ng l ng nghe class MouseBeanListener extends java. } } t qu ch y ch ng trình sau khi b n kích chu t vào MouseBean Trang 244 .setBounds(100.getDefault()).Locale.

VetoableChangeListener. ch cho phép nhi u listener cùng c ng ký x lý cùng m t tình hu ng cg i là milticast. } hi u rõ h n. ch ng h n listener này thì cho phép thay i giá tr c a thu c tính trong khi listener khác l i ng n c n. Kh n ng ng ký m t listener (unicast) và nhi u listener (milticast) c a thành ph n JavaBean Thông th ng m t JavaBean cho phép ng ký nhi u i t ng l ng nghe bi n c . import java. public class UseBean2 { public static void main(String[] args) { Trang 245 . Ch ng trình này dùng l i thành ph n BeanB ã thi t k ph n u (xem ví d v thu c tính ràng bu c –contrain property). n u có nhi u h n m t listener c ng ký thì ph ng th c ng ký c a JavaBean c n c thi t k ném ra m t ngo i l là: TooManyListenerException nh sau: public void add<EventListenerType>(< EventListenerType> lst) throws TooManyListenerException n ch ng trình sau t o ra hai ph ng th c add và remove ch cho phép ng ký t listener mà thôi: MouseListener saveListener=null. v i c ch này ôi lúc s d n n tr ng h p xâm ph m l n nhau. Tuy nhiên. import java. //UseBean2.beans. tr c khi thay i giá tr c a thu c tính nó c n h i ý ki n c a t t c listener. } else{ /* u ã có m t listener nào ó c ng ký thì ném ra m t ngo i l */ throw new TooManyListenerException(). Chính vì v y m t vài thành ph n JavaBean ch cho phép ng ký m t listener mà thôi (unicast).PropertyVetoException.beans.java import java. minh ho ta s t o ra hai i ng listener là MyListener21 ch cho phép thay i thu c tính size khi giá tr m i l n h n 50 còn MyListener22 ch cho phép thay i thu c tính size khi giá tr m i l n h n 100.4.2. } //Ph ng th c này dùng lo i b i t ng listener public void removeMouseListener(MouseListener lst) { saveListener=null. Thu c tính size c a thành ph n BeanB là thu c tính ràng bu c.PropertyChangeEvent. Ch ng trình s d ng hai i t ng listener cùng x lý m t tình hu ng. d i ây ta s vi t m t ví d minh ho cho s tranh ch p khi có nhi u i t ng listener cùng ng ký x lý m t tình hu ng.beans. /* Ph ng th c ng ký i t ng listener*/ public void addMouseListener(MouseListener lst) throws TooManyListenerException { if(saveListener==null){ saveListener=lst.

println("old size:" + b. System. b. if (newSize > 100) throw new PropertyVetoException("Gia tri lon hon 100 Listener 2 reject".setSize(90). b.BeanB b = new BeanB(). Trang 246 . } } class myListener21 implements VetoableChangeListener { public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException { int newSize = ( (Integer) evt.out.getSize()). b. } } t qu ch y ch ng trình: old size:0 set new size 30 size after setting:30 old size:30 set new size 90 size after setting:30 Quan sát k t qu ch y ch ng trình ta th y t t c giá tr l n h n 50 u không th gán c cho thu c tính size. evt). b.addSizeListener(new myListener22()). evt). Chính vì v y java phân bi t hai cách ng ký listener là unicast và multicast. Tuy nhiên theo khuy n khích thì các thành ph n JavaBean nên c xây d ng h tr c ch ng ký nhi u i t ng listener (multicast).getSize() + " set new size 90"). System. nh y trong tr ng h p listener th hai myListener22 cài t mà không bi t r ng myListener21 ã c cài t tr c ó thì ng i dùng cu i s b nh m l n.out.println("old size:" + b.println("size after setting:" + b.out. System.out.getNewValue()).getSize() + " set new size 30").getNewValue()).println("size after setting:" + b.intValue(). if (newSize > 50) throw new PropertyVetoException("Gia tri lon hon 50 Listener 1 reject". m c dù listener th hai là myListener22 cho phép gán giá tr >50 và <100 nh ng listener th nh t là myListener22 l i không cho phép. System.intValue(). } } class myListener22 implements VetoableChangeListener { public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException { int newSize = ( (Integer) evt.addSizeListener(new myListener21()).getSize()).setSize(30).

Th ng thì ta dùng các m u sau khi xây d ng các ph ng th c dành cho thu c tính và s ki n. Công c này chính là l p Instrospector. không nh ng làm cho JavaBean n gi n h n trong s d ng mà còn cung c p t ngõ c a chu n t o ra các JavaBean ph c t p h n. ph ng th c. d a vào BeanInfo này b n có th m x tìm ra các thu c tính. s ki n nào. n truy n tham chi u Class cho l p này và nó hoàn toàn i h i l p ó và cho l i t i t ng BeanInfo. ph ng th c. m t trong nh ng lý do chính mà ph n x c thêm vào cho java là h tr JavaBean (m c dù nó còn c dùng trong tu n t hoá và g i các ph ng th c ng t xa). Thi t k các ph ng th c m u dùng cho thu c tính i v i m i thu c tính b n c n xây d ng hai ph ng th c “get” và “set” theo m u sau ây: public <propertyType> get<PropertyName>() public void set<PropertyName>(<propertyType> newValue) Trong ó: propertyType là b t c ki u d li u nào nguyên thu hay i t ng PropertyName là tên c a thu c tính Chú ý: u thu c tính có ki u boolean thì ph ng th c “get” có th thay b ng ph ng th c “is” Trang 247 . Cách mà Instrospector làm vi c Ví d khi ra có hai ph ng th c nh sau: public int getSize() public void setSize(int newSize) Theo cách này java hi u r ng b n mu n t o ra m t thu c tính có tên là size có ki u int.III. Trong th c t . Hay khi t o ra các thu c tính ràng bu c (contrain property) ta vi t: public addSizeListener(VetoableChangeListener lst) public removeSizeListener(VetoableChangeListener lst) java s hi u là có m t thu c tính size c n g i n hai ph ng th c này m i khi mu n ng ký hay lo i b m t i t ng listener dùng quan sát s thay i c a thu c tính. 2. c ch ph n x giúp ta có th phát hi n ra các thu c tính. Instrospector là gì? M t câu h i b n t ra là khi b n kéo m t JavaBean t thanh công c và th vào Form (trong m t môi tr ng phát tri n tr c quan nào ó ch ng h n nh Jbuilder ch ng n).. s ki n c a m t l p b t k (k c l p vô danh). làm th nào môi tr ng phát tri n tr c quan này có th bi t c trong JavaBean a ta có nh ng thu c tính.. u này là hoàn h o gi i quy t v n Bean mà không yêu c u b n ph i làm thêm b t c th thu t ngôn ng nào nh v n b yêu c u trong các ngôn ng l p trình tr c quan khác. ph ng pháp quan tr ng nh t c a l p này là static getBeanInsfo(). Nh ng nh ng ng i thi t k java l i mu n cung c p m t công c chu n. V n này ã c gi i quy t b ng tính ph n x (reflect). Tìm hi u Instrospector 1. ph ng th c. s ki n c a JavaBean.?. Tóm l i n u các ph ng th c c thi t k theo m t m u (pattern) nào ó thì nó s c em dùng vào m c ích riêng.

Tìm hi u l p BeanInfo Khi b n t o ra BeanB (xem l i l p này trong ph n thu c tính ràng bu c) b n có th o ra m t l p ph khác là BeanBBeanInfo. } return null. PropertyDescriptor[] pds = new PropertyDescriptor[] { _size}.beans.ICON_COLOR_16x16: return iconColor16x16Filename != null ? loadImage(iconColor16x16Filename) : null.class. return pds.ICON_MONO_16x16: return iconMono16x16Filename != null ? loadImage(iconMono16x16Filename) : null. String iconColor32x32Filename.java l p này c d n xu t t l p SimpleBeanInfo có nhi m v cung c p các thông tin v thành ph n JavaBean mà ta xây ng: import java.ICON_COLOR_32x32: return iconColor32x32Filename != null ? loadImage(iconColor32x32Filename) : null. } } Trang 248 . return null.Image getIcon(int iconKind) { switch (iconKind) { case BeanInfo. } catch(IntrospectionException ex) { ex. Ví d thành ph n JavaBean có th ng ký c các tình hu ng Action ta vi t public void addActionListener (ActionListener lst) public void removeActionListener (ActionListener lst) 3. case BeanInfo. public BeanBBeanInfo() { } public PropertyDescriptor[] getPropertyDescriptors() { try { PropertyDescriptor _size = new PropertyDescriptor("size".awt.ICON_MONO_32x32: return iconMono32x32Filename != null ? loadImage(iconMono32x32Filename) : null. beanClass. public class BeanBBeanInfo extends SimpleBeanInfo { Class beanClass = BeanB. } } public java. case BeanInfo. case BeanInfo.printStackTrace(). "getSize".*. "setSize").Java ch hi u là b n nh t o ra m t thu c tính n u nh có c hai ph ng th c “get” và “set” Ki u tr v c a ph ng th c “get” th ng là ki u c a i ph ng th c “set Thi t k các ph ng th c m u dùng cho s ki n xây d ng m t s ki n nào ó cho m t thành ph n JavaBean ta c n xây d ng hai ph ng th c “add” và “remove” theo m u sau ây: public void add<EventListenerType> (<EventListenerType> evt) public void remove<EventListenerType> (<EventListenerType> evt) Trong ó EventListenerType là i t ng tình hu ng mà JavaBean mu n các thành ph n khác t ng tác c v i mình. String iconMono32x32Filename. String iconColor16x16Filename. String iconMono16x16Filename.

óng gói JavaBean Tr c khi xu t b n JavaBean b n th ng óng gói nó vào trong m t t p .Các ph ng th c quan tr ng mà b n c n quan tâm là: Ph ng th c getIcon() ph ng th c này c g i khi các môi tr ng phát tri n tr c quan mu n l y v bi u t ng cho JavaBean. Ph ng th c getMethodDescriptors() ph ng th c này giúp cho Instrospector d dàng y v các ph ng th c c a JavaBean… ng cách xây d ng l p BeanInfo i kèm v i JavaBean c a b n.class Name BeansDir/BeanBInfo.mf Dòng th nh t cho bi t phiên b n.0 Name BeansDir/BeanB. Trang 249 . Trình biên d ch d dàng tìm ra các thu c tính. Ph ng th c getPropertyDescriptors() ph ng th c này giúp cho Instrospector d dàng y v các thu c tính c a JavaBean. các công c xây d ng tr c quan bi t trong t p óng gói này là m t JavaBean b n c n o t p mô t óng gói b ng cách sau: d ng m t trình so n th o b t k t o ra t p tin BeanB. s ki n. B n ti n hành óng gói b ng l nh jar hoàn toàn t ng t nh b n óng gói các l p khác. ph ng th c.class Java-Bean: True Ghi l i v i cái tên gì ó ch ng h n BeanB. dòng cu i cùng cho bi t n v óng gói này là m t JavaBean. IV. Tr c khi mu n bi t JavaBean c a n có nh ng thành ph n nào trong Bean c a b n tr c tiên nó i tìm trong l p BeanInfo t ng ng.jar chu n. n u không tìm th y BeanInfo i kèm v i l p lúc ó nó m y s ng c ch ph n x hay i tìm các ph ng th c c thi t k theo m u. t dòng th hai tr i cho bi t trong tên c a các l p có trong t p óng gói.mf nh sau: Manifest-Version: 1.

You're Reading a Free Preview

Download