1. Trang chủ
  2. » Giáo án - Bài giảng

Bài giảng lập trình java

102 367 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 102
Dung lượng 509,7 KB

Nội dung

Java là một ngôn ngữ lập trình mạnh đang được sử dụng rất rộng rãi hiện nay trên toàn thế giới. Trên thực tế, Java được biết đến không chỉ là một ngôn ngữ lập trình mà là một platform – một môi trường và công nghệ phát triển – riêng biệt. Khi làm việc với Java, người lập trình được sở hữu một thư viện lớn, có tính mở với một lượng mã nguồn tái sử dụng khổng lồ luôn có trên internet. Ngoài ra, các chương trình viết bằng Java có môi trường thực thi riêng với các tính năng bảo mật, khả năng triển khai trên nhiều hệ điều hành khác nhau và nhiều tính năng ưu việt khác chúng ta sẽ xem xét trong phần sau

MỤC LỤC MỤC LỤC CHƯƠNG 1: CÁC KHÁI NIỆM CƠ BẢN .4 I Lịch sử hình thành phát triển ngơn ngữ lập trìnhJava .4 A Giới thiệu vềJava .4 B Các đặc trưng Java C Các loại ứng dụng Java .7 D Công cụ môi trường lập trình Java .7 E Cài đặt Java II Nền tảng Java 10 A Các kiểu liệu Java .10 B Khai báo biến trongJava .11 C Các toán tử biểu thức 14 CHƯƠNG 2: CẤU TRÚC ĐIỀU KHIỂN 16 I Lệnh if 16 II Lệnh switch …case 16 III Các lệnh lặp 17 A Vòng lặpfor 17 B Vòng lặpwhile 18 C Vòng lặp while 19 D Phépnhảy 19 IV Vào liệu từ bàn phím xuất liệu mànhình 20 A Lấy giá trị nhập vào từ bànphím 20 CHƯƠNG 3: LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG TRONG JAVA 23 I Khái niệm lập trình hướng đối tượng (Object-Oriented Programming -OOP) 23 A Khái niệm OOP .23 B Cơ sở lý luận củaOOP .23 C Trừu tượnghóa 23 II Tính đóng gói trongJava 25 A Khái niệm tính đónggói 25 B Mối quan hệ cácclass .25 C Một số gợi ý thiết kếclass 25 D Sử dụng Class xây dựng sẵn thư viện 26 E Xây dựng Class Java 27 III Tính kế thừa trongJava 33 A Sự kế thừa thuộc tính phươngthức .33 B Sự kế thừa cácconstructor 36 IV Tính đa hình trongJava 37 A Sự ép kiểu gán tham chiếu đốitượng 37 B Sự ràng buộc động –DynamicBinding 37 V LớpObject 38 VI Giaodiện .39 A Cấu trúc giaodiện 39 B Các tính chất giaodiện .41 VII Package 41 A Sử dụng package thư viện Java 41 B Đặt lớp vàopackage 42 CHƯƠNG XỬ LÝ NGOẠI LỆ 43 I Các tình sử dụng ngoạilệ 43 II Cơ sở quản lý ngoại lệ trongJava 43 III Cấu trúc kế thừa xử lý ngoạilệ 44 IV Sử dụng ngoại lệ kiểmsoát 45 V Xây dựng ngoạilệ 46 CHƯƠNG 5: LẬP TRÌNH GIAO DIỆN ĐỒ HỌA GUI .48 I Giới thiệuAWT .48 II Vật chứa(Container) .49 A JFrame .49 B JPanel .49 C JDialog .50 D JScrollPane 51 III Giới thiệu thành phần GUI cơbản .51 A Nútnhấn 51 B Nhãn(Label) .52 C Nút đánh dấu(checkbox) 53 D Nút chọn (radiobutton) 55 E Hộp thoạiCombo .56 F Danh sách(Lists) 57 G Ô văn (text field) vùng văn (textareas) 59 H Thanh trượt(Scrollbar) .61 IV Thành phầnMenu 62 V Bộ quản lý cách trình bày (LayoutManager) .65 A Cách trình bày FlowLayout: 66 B Cách trình bàyGridLayout: 66 C Cách trình bàyBorderLayout 66 VI Các hộpthoại 66 A Hộp thoại thôngbáo 66 B Hộp thoại chọnFile 67 C Hộp thoại chọnmàu 68 VII Khái niệm sở xử lý sựkiện .68 A Truy cập thông tin kiện .74 B Xử lý kiện window 75 C Các lớp thích nghi 76 D Xử lý kiệnchuột 102 CHƯƠNG 6: LUỒNG VÀ TẬP TIN 103 I Khái niệmthread 103 A Khái niệm: .103 B LớpThread .103 C Các bước để tạo mộtthread 103 D Các trạng thái thread .104 E Các thuộc tính thread 105 F Điều khiển thread 107 G Đồng thread 110 II Các luồng vào liệu với file 114 A Khái niệm luồng vào (I/O stream) .114 B Nhập xuất lọc 117 C Vào/ra có sử dụng đệm .118 D Đối tượng System.in 121 CHƯƠNG 1: CÁC KHÁI NIỆM CƠ BẢN I Lịch sử hình thành phát triển ngơn ngữ lập trìnhJava A Giới thiệu vềJava Java ngơn ngữ lập trình mạnh sử dụng rộng rãi toàn giới Trên thực tế, Java biết đến khơng ngơn ngữ lập trình mà platform – môi trường công nghệ phát triển – riêng biệt Khi làm việc với Java, người lập trình sở hữu thư viện lớn, có tính mở với lượng mã nguồn tái sử dụng khổng lồ ln có internet Ngồi ra, chương trình viết Java có mơi trường thực thi riêng với tính bảo mật, khả triển khai nhiều hệ điều hành khác nhiều tính ưu việt khác xem xét phần sau Năm 1991, nhóm kỹ sư hãng SUN bao gồm Patrick Naughton, Sun Fellow James Gosling có ý tưởng phát minh ngơn ngữ lập trình nhỏ gọn thực thi thiết bị dạng chuyển kênh truyền hình cáp thiết bị kiểu có nhớ nhỏ Bên cạnh đó, hãng khác sử dụng chíp xử lý (CPUs) khác nên đặc tính quan trọng mà ngơn ngữ phải có độc lập với dòng CPUs khác – gọi đặc tính di động Nhóm mở dự án có tên Green để thực hóa ý tưởng Để giải vấn đề di động, nhóm sử dụng ý tưởng kỹ sư Niklaus Wirth – người sáng lập ngôn ngữ Pascal – việc sử dụng chế thông dịch máy ảo (virtual machine) Về tảng ngôn ngữ, hãng SUN phát triển UNIX nên họ sử dụng ngơn ngữ lập trình C++ chủ yếu Do đó, ngôn ngữ thiên hướng đối tượng (Object Oriented) C++ hướng thủ tục Pascal Ban đầu nhóm đặt tên cho ngơn ngữ “Oak” sau chuyển thành Java Oak tên ngơn ngữ lập trình khác Năm 1992, dự án Green cho đời sản phẩm có tên “*7” khơng chào đón mong đợi Sau nhóm phải năm 1993 nửa đầu 1994 để tiếp thị cơng nghệ Từ năm 1994, phát triển Internet tạo hội để Java phát triển nhanh chóng Nhóm phát triển trình duyệt có tên HotJava cho phép chương trình Java nhúng (applet) Đây minh chứng rõ ràng sức mạnh Java nhanh chóng cộng đồng người sử dụng internet biết đến tiền đề để Java phát triển rực rỡ ngày hôm Phiên 1.0 Java đời vào năm 1996, sau phiên 1.1 mạnh nhiều hạn chế Năm 1998 đánh đấu bước chuyển mạnh mẽ Java với đời phiên 1.2 làm cho Java tiến gần tới mục tiêu “viết lần, chạy khắp nơi” (Write once, Run Anywhere) Các nhân viên tiếp thị Java gọi phiên “Java Standard Edition Software Development Kit Version 1.2” ý nói tới có mặt đồng thời phiên “Standard Edition” Micro Edition Enterprise Edition Java Các phiên 1.3, 1.4 phát triển mở rộng phiên 1.2 Phiên 1.5 (chuyển sang gọi phiên 5.0) đánh dấu tích hợp đầy đủ cơng nghệ Java Bảng sau cho thấy phát triển thư viện Java qua phiên bản: Phiên Số Class Interface 1.0 211 1.1 477 1.2 1524 1.3 1840 1.4 2723 5.0 3270 Hiện tại, Java phát triển tới phiên 1.6 B Các đặc trưng Java Java biết đến với đặc trưng sau: Tính đơn giản Java phát triển dựa C++ lược bớt thay khái niệm khó hiểu header file, trỏ, structures, union, operator overloading, virtual base class Trong Java có thừa kế đơn mà khơng có tính đa thừa kế C++ Tuy nhiên tính đa thừa kế biểu thơng qua việc sử dụng cácInterface Tính hướng đối tượng Như trình bày trên, Java phát triển từ C++ nên ngơn ngữ lập trình hướng đối tượng Tính phân tán Java cho phép lập trình truy cập đối tượng từ xa thơng qua giao thức HTTP, FTP phương thức RMI hay Socket Java hồn tồn thích hợp cho ứng dụng Internet Các công nghệ JSP, Servlet cho phép xây dựng website tương tác với tính thực thi tối ưu Tính mạnh mẽ Việc loại bỏ trỏ làm tăng độ tin cậy chương trình Lập trình viên khơng cần quan tâm đến thao tác cấp phát giải phóng nhớ Với Java, nhớ giải phóng tự động Tính an tồn Ngơn ngữ Java thiết kế để tránh cố:  Nạp chồng stack lúcruntime  Ảnh hưởng tới nhớ nằm phạm vi cấpphát  Đọc ghi file tựdo Tính trung lập Các chương trình viết Java khơng bị phụ thuộc vào hệ điều hành Điều có mã nguồn chương trình khơng biên dịch thành mã máy mà thành mã Bytecode Khi đem mã Bytecode chạy hệ máy tính trình thông dịch virtual machine (Java Vitual Machine-JVM) thông dịch chúng sang mã máy tương ứng để thực thi Mã nguồn -> ByteCodes -> machine code Từ mã nguồn -> Bytecodes: Trình biên dịch Java Từ Bytecodes -> machine code: Trình thơng dịch Virtual machine Bytecode Trình biên dịch Trình thông dịch Java IBM Sparc (Java Interpreter) Macintosh Java Virtual Machine – JVM Máy ảo phần mềm dựa sở máy tính ảo Nó có tập hợp lệnh logic để xác định hoạt động máy tính Người ta xem hệ điều hành thu nhỏ JVM thiết lập lớp trừu tượng cho phần cứng bên dưới, hệ điều hành, mã biên dịch Trình biên dịch chuyển mã nguồn thành tập lệnh máy ảo mà không phụ thuộc vào phần cứng cụ thể Trình thơng dịch máy chuyển tập lệnh thành chương trình thực thi Máy ảo tạo môi trường bên để thực thi lệnh cách:  Nạp file.class  Quản lý bộnhớ  Dọn “rác”, thu hồi nhớ cấp cho biến khơng sửdụng Việc không quán phần cứng làm cho máy ảo phải sử dụng ngăn xếp để lưu trữ thông tin sau:  Các “Frame” chứa trạng thái phươngthức  Các toán hạng mãbytecode  Các tham số truyền cho phươngthức  Các biến cụcbộ Tính di động Khơng giống C++ C, kiểu liệu nguyên thủy Java cấp phát lượng nhớ cố định Chẳng hạn kiểu liệu int Java byte (32 bit) kiểu int C++ hiểu byte byte Thiết kế giúp cho trình biên dịch ln có số bytecode hệ máy sau phát sinh mã máy theo khuôn dạng cố định Trong phiên đầu Java, vấn đề giao diện đồ họa cho người sử dụng (GUI) chưa xử lý triệt để phụ thuộc vào hệ máy Ngày nay, thư viện GUI Java viết lại hoàn toàn có tính độc lập cao giúp cho chương trình Java có giao diện giống hệ máy Tính thơng dịch Trình thơng dịch Java thơng dịch mã bytecode sang mã máy nơi mà cài đặt Quá trình làm chương trình Java chạy chậm Tuy nhiên lại giải pháp cho tính di động Tính thực thi cao Java sử dụng cơng nghệ Just-In-Time (JIT) giúp q trình thông dịch thực nhanh Với công nghệ này, mã bytecode giống cần thông dịch lần Ngày nay, công nghệ liên tục cải tiến cho kết vượt trội so với trình thơng dịch truyền thống Ví dụ JIT quản lý đoạn mã sử dụng thường xuyên chương trình, tối ưu chúng để nâng cao tốc độc thựchiện 10 Tính đa luồng Với chương trình Java, lập trình viên lúc quản lý nhiều tiến trình khác Điều giúp cho việc cài đặt thuật toán song song Java máy tính nhiều CPU dễ dàng hơn, đặc biệt ứng dụng thời gian thực 11 Tính động Các chương trình Java nâng cấp mà không ảnh hưởng tới người sử dụng Các phương thức cài đặt thêm vào lớp đối tượng hay giao diện thư viện chương trình chạy C Các loại ứng dụng Java       Ứng dụng console: Khơng có giao diệnGUI Ứng dụng đồ hoạ: Có giao diệnGUI Applet: Nhúng trangWeb Servlet: Các class thực thi phía webserver JSP: Các file nhúng mã Java vàHTML Ứng dụng EJB, RMI, JMS: Xây dựng ứng dụng nhiều thành phần ghép lại, giao tiếp từxa D Cơng cụ mơi trường lập trình Java Hiện có nhiều mơi trường phát triển Java (Integrated Development Environment IDE) Mỗi môi trường cung cấp cho lập trình viên tiện ích lập trình mức độ khác Một số IDE thông dụng là:  Netbeans (miễn phí tạihttp://www.netbeans.org)  Jcreator (thươngmại)  Jbuilder (thươngmại)  Eclipse (miễn phíhttp://www.eclipse.org/) E Cài đặt Java Java phiên Java download địa http://java.sun.com/j2se Sau cài đặt ứng dụng bình thường Thư mục cài đặt mặc định Java Windows C:\Program Files\Java\jdk1.6.0_02 (nếu phiên cài jdk1.6.0_02) Trong có chứa thư mục với ý nghĩa sau: bin Chứa cơng cụ trình biên dịch Java demo Chứa chương trình Java Demo docs Chứa tài liệu mô tả thư viện Java includes Chứa file dùng để biên dịch đoạn mã nguồn viết ngôn ngữ khác (native) jre Chứa file lưu thông tin môi trường lúc thực thi lib Chứa file thư viện src Chứa mã nguồn java Trong thư mục \bin có chữa cơng cụ Java: Trình biên dịch, 'javac' Cú pháp:javac [options] sourcecodename.java Trình thơng dịch, 'java' Cú pháp:java [options] classname Trình dịch ngược, 'javap' javap dịch ngược bytecode in thông tin thuộc tính (các trường), phương thức lớp Cú pháp:javap [options] classname Công cụ sinh tài liệu, 'javadoc' Tiện ích cho phép ta tạo tệp HTML dựa lời giải thích mã chương trình (phần nằm cặp dấu /* */) Cú pháp:javadoc [options] sourcecodename.java Chương trình tìm lỗi - Debug, 'jdb„ Cú pháp:jdb [options] sourcecodename.java hay jdb -host -password [options] sourcecodename.java Cài đặt đường dẫn mặc định Mở ControlPanel ChọnSystem Chọn TabAdvanced Chọn EnvironmentVariables Thêm đường dẫn C:\Program Files\Java\jdk1.6.0_02\bin vào biến môi trườngPath - Chọn VariablePath - Chọn Edit II Nền tảng Java A Các kiểu liệu Java Các kiểu liệu số nguyên Java có kiểu số nguyên: int bytes Từ –2,147,483,648 đến 2,147,483, 647 short bytes Từ –32,768 đến 32,767 long bytes Từ –9,223,372,036,854,775,808 đến9,223,372,036,854,775,807 byte byte Từ –128 đến 127 12 Các kiểu số thực Java có kiểu số thực dấu chấm động: float bytes Xấp xỉ ±3.40282347E+38F double bytes Xấp xỉ ±1.79769313486231570E+308 Số dấu chấm động nhận giá trị:  Vô cựcâm/dương  Sốâm/dương  Số0  NaN (không số =0.0/0.0f) 13 Kiểu ký tự (character) Là kiểu liệu ký tự Một biến char có giá trị ký tự Unicode 14 Kiểu logic (boolean) Là kiểu liệu có hai giá trị true false dùng để xác định kết điều kiện Chú ý: kiểu boolean 15 Kiểu chuỗi Java xem chuỗi đối tượng Biến đối tượng chuỗi thường khai báo từ lớp String nằm gói java.lang.String 16 Chuyển đổi kiểu số Giả sử hành vi đơn vị (atomic- hành vi chiếm chu lệnh CPU), thread thực phép tính cách mà không gây ảnh hưởng thời điểm, CPU phục vụ cho thread Tuy nhiên, phép tính lại khơng phải atomic, cơng việc phải làm là: 1- Load giá trị account[to] vào ghi 2- Cộng vớiaccount 3- Load kết ngược trả lại choaccount[to] Giả sử có thread thread_1 thread_2 thực đến dòng lệnh Thread_1 thực xong bước bị ngắt, sau thread_2 thực câu lệnh với đầy đủ bước tức account[to] bị thay đổi giá trị Tiếp theo, thread_1 thức dậy làm tiếp bước 3, account[to] lúc ghi đè giá trị thread_2 cập nhật Điều dẫn tới việc tổng số tiền bị thay đổi, phần tiền thread_2 chuyển cho account[to] bị 31 Khóa đối tượng Trong ví dụ trên, ta đảm bảo phương thức transfer() thực thành cơng trước thread bị ngắt khơng có vấn đề xảy Có nghĩa là, thời điểm có thread truy cập vào đoạn mã lệnh Từ phiên Java 5.0 có hỗ trợ hai chế để bảo vệ khối lệnh khỏi truy cập đồng thời Các phiên trước Java sử dụng từ khóa synchronized, Java 5.0 giới thiệu thêm lớp ReentrantLock cho mục đích Cấu trúc đoạn lệnh để sử dụng chế là: myLock.lock(); // đối tượng ReentrantLock try { //Đoạn lệnh cần bảo vệ } finally { myLock.unlock(); // đảm bảo khóa mở kể exception xảy } Đoạn lệnh đảm bảo có thread thời điểm vào vùng bảo vệ Khi thread gọi lock khơng thread sau vượt qua lệnh lock() Bây khóa phương thức transfer() lớp Bank: public class Bank { public void transfer(int from, int to, int amount) { bankLock.lock(); try { if (accounts[from] < amount) return; System.out.print(Thread.currentThread()); accounts[from] -= amount; System.out.printf(" %10.2f from %d to %d", amount, from, to); accounts[to] += amount; System.out.printf(" Total Balance: %10.2f%n", getTotalBalance()); } finally { bankLock.unlock(); } } private Lock bankLock = new ReentrantLock(); // ReentrantLock lớp cài đặt giao diện lock } 32 Đối tượng điều kiện Trong trường hợp thread vào vùng bảo vệ, cần hồn thành cơng việc để mở khóa cho thread khác vào Tuy nhiên, cơng việc cần thực bị giới hạn điều kiện đó, chẳng hạn đây, việc gọi transfer() để chuyển tiền thực số tiền account gửi lớn số tiền gửi: if (bank.getBalance(from) >= amount) bank.transfer(from, to, amount); Khi có điều kiện này, thread khơng thỏa mãn khơng thực việc chuyển tiền, tức cơng việc khơng hữu ích Đến đây, ta nghĩ giải pháp để thread đợi có đủ tiền để chuyển: public void transfer(int from, int to, int amount) { bankLock.lock(); try { while (accounts[from] < amount) // Đợi tài khoản có đủ tiền { // đợi } // Chuyển tiền } finally { bankLock.unlock(); } } Việc đợi kết thúc thread khác chuyển tiền vào cho Tuy nhiên ta thấy vùng chứa lệnh chuyển tiền lại bị khóa thread nên thread khác chuyển tiền Kết thread khơng khỏi tình trạng đợi, chương trình rơi vào deadlock Đây tình mà ta phải sử dụng đối tượng điều kiện: class Bank { public Bank() { sufficientFunds = bankLock.newCondition(); } private Condition sufficientFunds; } Nếu phương thức transfer() kiểm tra thấy chưa đủ tiền để chuyển gọi: sufficientFunds.await();Lúc nằm chờ thread khác chuyển tiền Có khác thread đợi để khóa (gọi phương thức lock() để vào vùng bảo vệ) thread gọi phương thức await() Nó khơng thể mở khóa nằm vùng khóa thread khác gọi signalAll() Một thread thực xong việc chuyển tiền, nên gọi: sufficientFunds.signalAll() để mở khóa cho thread nằm đợi thỏa mãn điều kiện đủ tiền Một thread thoát khỏi tình trạng đợi await() gây ra, chạy tiếp cố gắng vào vùng khóa vị trí mà chờ đợi trước - vị trí gọi phương thức await() kiểm tra lại điềukiện Một phương thức await() nên gọi vòng lặp đợi: while (!(đủ tiền)) condition.await(); Nếu khơng có thread gửi signalAll() thread đợi khơng có cách chạy tiếp Nếu tất thread khác bị chặn, thread gọi await() khơng giả phóng tình trạng cho thread thân bị chặn, chương trình bị treo Vấn đề gọi signalAll()? Nguyên tắc chung thread hoàn thành việc thay đổi trạng thái đối tượng nên gọi signalAll() Ở đây, sau cộng tiền vào cho tài khoản nhận signalAll() gọi Việc gọi giúp thread tình trạng chờ đợi không bị chặn tiếp tục cơng việc với giá trị tài khoản bị thayđổi public void transfer(int from, int to, int amount) { bankLock.lock(); try { while (accounts[from] < amount) sufficientFunds.await(); // Chuyển tiền sufficientFunds.signalAll(); } finally { bankLock.unlock(); } } Chú ý việc gọi signalAll() kích hoạt thread bị chặn Nó giải phóng tình trạng bị chặn thread khác kết thúc đoạn chương trình bảo vệ Một phương thức khác sign() trao khóa cho thread xác định thay tất Một thread gọi phương thức signalAll(), sign() await() vùng bảo vệ Chúng ta kết thúc phần câu chuyện minh họa: Có 10 người đến ngân hàng để chuyển tiền cho nhau, người chuyển cho người khác số người lại Mỗi thời điểm ngân hàng chuyển tiền cho người, người gửi tiền vào ngân hàng giữ khóa cổng, người khác phải chờ ngồi cổng Nếu chẳng may người thực chuyển số tiền lớn có, đợi ngân hàng (gọi await()) ném khóa cổng cho tất người Một số người cổng vào ngân hàng, thực việc chuyển tiền Sau chuyển xong, thông báo cho tất anh khác phải đợi ngân hàng vừa chuyển tiền (gọi signalAll()) ngồi, sau người đợi quay cổng để đợi đến lượtvào XXII Các luồng vào liệu với file Một khả quan trọng mà ngôn ngữ lập trình phải có việc quản lý luồng liệu vào hệ thống máy tính giúp chương trình giao tiếp liệu với giới bên A Khái niệm luồng vào (I/O stream) Luồng dòng chảy liệu Có loại luồng:  Luồng nhập (input stream): tất từ giới bên ngồi đưa vào máy tính, đọc từ bàn phím, đọc từ tậptin  Luồng xuất (output stream): tất gửi từ máy tính ngồi thơng qua thiết bị ngoại vi, hình, máy in, tệp tin, Đối với mội luồng lại có dòng bao gồm:  Lớp System.out: Dòng xuất chuẩn dùng để hiển thị kết mànhình  Lớp System.in: Dòng nhập chuẩn thường đến từ bàn phím dùng để đọc ký tự liệu  Lớp System.err: Đây dòng lỗi chuẩn cho phép chương trình đưa thơng báo lỗi mànhình Các dòng bị đổi hướng đến nhiều nguồn khác Ví dụ System.err đưa thơng báo lỗi file Khi cần làm việc với luồng, ta khai báo khối thư viện: import java.io.*; Thư viện cho phép ta làm việc với luồng nhập xuất qua việc cung cấp lớp: FileInputStrem, FileOutputStream, FileReader, FileWriter nhiều lớp khác Sự phân cấp class gói java.io thể qua bảng sau: java.lang.Object File FileDescriptor InputStream ByteArrayInputStream FileInputStream FilterInputStream BufferedInputStream DataInputStream PushbackInputStream ObjectInputStream PipedInputStream SequenceInputStream OutputStream ByteArrayOutputStream FileOutputStream FilterOutputStream BufferedOutputStream PipedOutputStream RandomAccessFile Reader BufferedReader LineNumberReader CharArrayReader FilterReader ObjectOutputStream InputStreamReader DataOutputStream PrintStream PushbackReader FileReader PipedReader StringReader Writer BufferedWriter CharArrayWriter FilterWriter OutputStreamWriter FileWriter PipedWriter PrintWriter StringWriter Sau xem xét class quan trọng thường sử dụng: LớpInputStream: Là lớp trừu tượng định nghĩa cách thức nhận liệu Có phương thức sau:  read(): Đọc byte liệu từ dòng Nếu khơng có byte liệu nào, phải chờ Khi phương thức phải chờ, luồng thực phải tạm dừng có dữliệu  read(byte[]): Trả số byte đọc hay „-1‟ đọc đến cuối dòng Nó gây ngoại lệ IOException có lỗi xảyra  read(byte[],int,int): Nó đọc vào mảng byte Nó trả số byte thực đọc kết thúc dòng Nó gây ngoại lệ IOException lỗi xảyra  available(): Phương pháp trả số lượng byte đọc mà khơng phải chờ Nó trả số byte có dòng Nó khơng phải phương thức tin cậy để thực tiến trình xử lý đầuvào  close(): Phương thức đóng dòng Nó dùng để giải phóng tài ngun dòng sử dụng Ln ln đóng dòng để chắn dòng xử lý kết thúc Nó gây ngoại lệ IOException lỗi xảyra  mark(): Đánh dấu vị trí củadòng  markSupported(): Trả giá trị boolean dòng có hỗ trợ khả mark reset hay khơng Nó trả true dòng hỗ trợ ngược lại trả vềfalse  reset(): Phương thức định vị lại dòng theo vị trí đánh lần cuối Nó gây ngoại lệ IOException lỗi xảyra  skip(): Phương thức bỏ qua „n‟ byte dòng vào ‟-n‟ định số byte bỏ qua Nó gây ngoại lệ IOException lỗi xảy Phương thức sử dụng để di chuyển tới vị trí đặc biệt bên dòngvào 33 LớpOutputStream Là lớp trừu tượng định nghĩa cách ghi kết xuất đến dòng Nó cung cấp tập phương thức trợ giúp tạo ra, ghi xử lý kết xuất dòng Các phương thức bao gồm:  write(int): Phương thức ghi mộtbyte  write(byte[]): Phương thức phong toả byte ghi Dòng phải chờ tác vụ ghi hồn tất Nó gây ngoại lệ IOException lỗi xảyra    write(byte[], int, int): Phương thức ghi mảng byte Lớp OutputStreamđịnh nghĩa ba dạng khác phương thức để ghi byte riêng lẻ, mảng byte, hay đoạn smột mảngbyte flush(): Phương thức xả dòng Đệm liệu ghi dòng Nó kích hoạt IOException lỗi xảyra close(): Phương thức đóng dòng Nó dùng để giải phóng tài ngun gắn với dòng Nó kích hoạt IOException lỗi xảyra 34 LớpFileInputStream Kế thừa từ InputStream, lớp cho phép đọc vào từ tập tin dạng stream Các đối tượng lớp tạo nhờ đường dẫn tới file, đối tượng File, đối tượng FileDescriptor làm đối số Lớp có phương thức khởi tạo sau:  FileInputStream(String name): Tham số tên tập tin để tạoluồng  FileInputStream(File f): Tham số đối tượng file để tạoluồng  FileInputStream(FileDescriptor fdObj): Tham số đối tượng FileDescriptor để tạoluồng Ví dụ: InputStream in = new FileInputStream(“C:\\LETI\\JAVA\\Account.txt”); 35 LớpFileOutputStream Lớp cung cấp khả ghi liệu xuống tập tin, dẫn xuất từ lớp cha OutputStream Có phương thức khởi tạo:  FileOutputStream(Stringname);  FileOutputStream(Filef);  FileOutputStream(FileDescriptorfdObj) 36 LớpFile Lớp sử dụng để truy cập đối tượng tập tin thư mục Các tập tin đặt tên theo qui ước đặt tên tập tin hệ điều hành Lớp cung cấp phương thức thiết lập tập tin thư mục Tất thao tác thư mục tập tin thực thông qua phương thức lớp File Như vậy, ta dùng File tất thao tác quản lý file thư mục Có cách để tạo đối tượng từ lớp File:  File(Stringpath);  File(String path, Stringname);  File(File dir, Stringname); Ví dụ:File f = new File("C:\jdk1.4\bin\hello.java"); File f = new File("C:\jdk1.4\bin", "hello.java"); File curDir = new File("."); File f = new File(curDir, "Hello.java"); Các phương thức:  public String getName(): lấy tên đối tượng tậptin  public String gePath(): lấy đường dẫn tậptin  public String getAbsolutePath(): lấy đường dẫn tuyệt đối tậptin public String getParent(): lấy tên thư mụccha public Boolean createNewFile(): tạo tập tinmới public void createTempFile(String pattern, File dir): tạo tập tin tạmthời public void deleteOnExit(): yêu cầu xoá tập tin chương trình chấmdứt public boolean canWrite(): cho biết tin có cho phép ghi hay khơng (true nếucó) public boolean canRead(): cho biết tập tin phép đọc hay không (true nếucó) public void setReadOnly(): đặt thuộc tính chỉđọc public boolean isFile(): cho biết tệp tin có hợp lệ hay khơng (true nếucó) public boolean isDirectory(): cho biết tập tin có phải thư mục hay khơng (true có)  public boolean isHidden(): kiểm tra xem tập tin có ẩn hay khơng (true nếucó)  public long length(): cho biết kích thước tập tin(byte)  public boolean mkdir(): tạo thư mục từ đối tượng file, true thànhcông  renameTo(File dest): đổi tên tập tin sang tênmới  public String[ ] list(): lấy danh sách tập tin thưmục  public String[ ] list(FilenameFilter filter): lấy danh sách tập tin thoả mãn điều kiện lọc, ví dụ*.gif  public booean delete(): xoá tập tin, true xoá thànhcông  public String toString(): trả đường dẫn tậptin  public String toURL(): trả đối tượng URL tương ứng với tập tin Chương trình vídụ: public class Test { public static void main(String args[]) { File f = new File("test"); System.out.println(f.getAbsolutePath()); // Lấy đường dẫn tuyệt đối System.out.println(f.exists()); // Kiểm tra tồn } }          RR.Nhập xuất lọc Là kiểu dòng có từ việc thay đổi cách xử lý dòng có Các lớp, dòng nhập xuất lọc java giúp ta lọc vào/ra theo số cách Bộ lọc nằm dòng nhập dòng xuất Nó thực xử lý q trình byte truyền từ đầu vào đến đầu Các lọc ghép với đầu lọc trở thành đầu vào lọc Lớp FilterInputStream: Đây lớp trừu tượng Nó cha tất lớp dòng nhập lọc Một dòng đọc đưa kết cho dòng khác Lớp FilterInputStream thiết kế cho có khả kết chuỗi nhiều lọc Để thực điều dùng vài tầng lồng 37 Lớp FilterOutputStream Lớp dạng bổ trợ cho lớp FilterInputStream Nó lớp cha tất lớpdòng xuất lọc Dữ liệu ghi vào lớp sửa đổi theo nhu cầu để thực tác vụ lọc sau chuyển tới đối tượng OutputStream SS Vào/ra có sử dụng đệm Vùng đệm kho lưu trữ liệu Chúng ta lấy liệu từ vùng đệm thay quay trở lại nguồn ban đầu liệu Java sử dụng chế nhập/xuất có lập vùng đệm để tạm thời lập cache liệu vào/ra dòng Nó giúp chương trình đọc/ghi lượng liệu nhỏ không ảnh hưởng lớn đến hiệu chung hệ thống Lớp BufferedInputStream: Lớp tự động tạo trì vùng đệm để hỗ trợ thao tác vào Nhờ chương trình đọc liệu từ dòng byte mà khơng ảnh hưởng đến tốc độ thực hệ thống 38 Lớp BufferedOutputStream Lớp định nghĩa hai phương thức thiết lập, cho phép định kích cỡ vùng đệm xuất, sử dụng kích cỡ vùng đệm ngầm định Lớp định nghĩa chồng tất phương thức OutputStream khơng đưa thêm phương thức Chương trình sau đọc ghi thơng tin đối tượng SinhVien theo format, sinh viên nằm dòng file: // Ke thua lop People import java.io.*; import java.util.StringTokenizer; public class SinhVien extends People { private String Lop;// Ten lop private double DiemTongKet; // Diem tong ket public final String mauda ="vang";//Hang so private int ID;// Ma so SinhVien protected static int MaSo;// ma so chung de cap phat cho moi sinh vien public SinhVien(int ns,String ht,String l,double dtk) { super(ns,ht);//goi constructor cua lop cha la People Lop = l; DiemTongKet=dtk; // Id cua SinhVien duoc gan bang gia tri MaSo hien thoi cua lop ID=MaSo; // Tang ma so len den gan cho SinhVien sau MaSo+=1; } // Phuong thuc tinh tuoi protected int TinhTuoi() { java.util.Date homnay = new java.util.Date(); return (homnay.getYear() - NamSinh +1); } // Khai bao chong phuong thuc toString() public String toString() { return String.valueOf(ID)+ "|" + String.valueOf(this.TinhTuoi()) + "|" + String.valueOf(DiemTongKet)+"|" + HoVaTen; } // Ghi thông tin sinh viên vào file public void GhiData(PrintWriter out) throws IOException { out.println(this.toString()); } // Đọc thông tin sinh viên từ đệm đọc public void DocData(BufferedReader in) throws IOException { String s = in.readLine(); // Đọc dòng đệm StringTokenizer t = new StringTokenizer(s, "|"); MaSo = Integer.parseInt(t.nextToken()); NamSinh = Integer.parseInt(t.nextToken()); DiemTongKet = Double.parseDouble(t.nextToken()); HoVaTen = t.nextToken(); } // Ham main public static void main(String[] argv) { // Dat gia trị bien static, sinh vien dau tien co ma so SinhVien.MaSo=1; // bien doi tuong Vector lưu sinh viên java.util.Vector sv = new java.util.Vector(5); SinhVien k1 = new SinhVien(80,"Nguyen Thi Mai 1","Letio3",5); sv.addElement(k1); // Them sinh vien vao Vector SinhVien k2 = new SinhVien(81,"Tran Thi Mai 2","Letio3",6); sv.addElement(k2); SinhVien k3 = new SinhVien(82,"Pham Thi Mai 3","Letio3",7); sv.addElement(k3); SinhVien k4= new SinhVien(83,"Phan Thi Mai 4","Letio3",8); sv.addElement(k4); SinhVien k5= new SinhVien(84,"Hoang Thi Mai 5","Letio3",9); sv.addElement(k5); // Dung interface Enumeration de duyet cac phan tu cua Vector java.util.Enumeration enu = sv.elements(); try { PrintWriter out = new PrintWriter(new FileWriter("C:\\LETI\\JAVA\\Sinhvien.dat")); while (enu.hasMoreElements()) { // Ep kieu, kieu Object la kieu cha cua moi kieu nen luon ep duoc SinhVien g = (SinhVien)enu.nextElement(); g.GhiData(out); } out.close(); } catch(Exception ep) {} // Doc tu file SinhVien[] svs = new SinhVien[5]; try { BufferedReader in = new BufferedReader(new FileReader("C:\\LETI\\JAVA\\Sinhvien.dat")); for(int i=0;i

Ngày đăng: 12/01/2018, 09:54

TỪ KHÓA LIÊN QUAN

w