Giáo trình Mô đun Lập trình java - Thiết kế trang Web
Máy ảo Java (JVM - Java Virtual Machine).
Tất cả các chƣơng trình muốn thực thi đƣợc thì phải đƣợc biên dịch ra mã máy.
Mã máy của từng kiến trúc CPU của mỗi máy tính là khác nhau (tập lệnh mã máy của
CPU Intel, CPU Solarix, CPU Macintosh là khác nhau), vì vậy trƣớc đây một chƣơng
trình sau khi đƣợc biên dịch xong chỉ có thể chạy đƣợc trên một kiến trúc CPU cụ thể
nào đó. Đối với CPU Intel chúng ta có thể chạy các hệ điều hành nhƣ Microsoft
Windows, Unix, Linux, OS/2, Chƣơng trình thực thi đƣợc trên Windows đƣợc biên
dịch dƣới dạng file có đuôi .EXE còn trên Linux thì đƣợc biên dịch dƣới dạng file có
đuôi .ELF, vì vậy trƣớc đây một chƣơng trình chạy đƣợc trên Windows muốn chạy đƣợc
trên hệ điều hành khác nhƣ Linux chẳng hạn thì phải chỉnh sửa và biên dịch lại. Ngôn
ngữ lập trình Java ra đời, nhờ vào máy ảo Java mà khó khăn nêu trên đã đƣợc khắc
phục. Một chƣơng trình viết bằng ngôn ngữ lập trình Java sẽ đƣợc biên dịch ra mã của
máy ảo java (mã java bytecode). Sau đó máy ảo Java chịu trách nhiệm chuyển mã java
bytecode thành mã máy tƣơng ứng. Sun Microsystem chịu trách nhiệm phát triển các
máy ảo Java chạy trên các hệ điều hành trên các kiến trúc CPU khác nhau.Trang 6
Thông dịch:
Java là một ngôn ngữ lập trình vừa biên dịch vừa thông dịch. Chƣơng trình nguồn
viết bằng ngôn ngữ lập trình Java có đuôi *.java đầu tiên đƣợc biên dịch thành tập tin có
đuôi *.class và sau đó sẽ đƣợc trình thông dịch thông dịch thành mã máy.
Độc lập nền:
Một chƣơng trình viết bằng ngôn ngữ Java có thể chạy trên nhiều máy tính có hệ
điều hành khác nhau (Windows, Unix, Linux, ) miễn sao ở đó có cài đặt máy ảo java
(Java Virtual Machine). Viết một lần chạy mọi nơi (write once run anywhere).
Hƣớng đối tƣợng:
Hƣớng đối tƣợng trong Java tƣơng tự nhƣ C++ nhƣng Java là một ngôn ngữ lập
trình hƣớng đối tƣợng hoàn toàn. Tất cả mọi thứ đề cập đến trong Java đều liên quan
đến các đối tƣợng đƣợc định nghĩa trƣớc, thậm chí hàm chính của một chƣơng trình viết
bằng Java (đó là hàm main) cũng phải đặt bên trong một lớp. Hƣớng đối tƣợng trong
Java không có tính đa kế thừa (multi inheritance) nhƣ trong C++ mà thay vào đó Java
đƣa ra
khái niệm interface để hỗ trợ tính đa kế thừa. Vấn đề này sẽ đƣợc bàn chi tiết
trong chƣơng 3.
Đa nhiệm - đa luồng (MultiTasking - Multithreading):
Java hỗ trợ lập trình đa nhiệm, đa luồng cho phép nhiều tiến trình, tiểu trình có
thể chạy song song cùng một thời điểm và tƣơng tác với nhau.
Khả chuyển (portable):
Chƣơng trình ứng dụng viết bằng ngôn ngữ Java chỉ cần chạy đƣợc trên máy ảo
Java là có thể chạy đƣợc trên bất kỳ máy tính, hệ điều hành nào có máy ảo Java. “Viết
một lần, chạy mọi nơi” (Write Once, Run Anywhere).
Hỗ trợ mạnh cho việc phát triển ứng dụng:
Công nghệ Java phát triển mạnh mẽ nhờ vào “đại gia Sun Microsystem” cung
cấp nhiều công cụ, thƣ viện lập trình phong phú hỗ trợ cho việc phát triển nhiều loại
hình ứng dụng khác nhau cụ thể nhƣ: J2SE (Java 2 Standard Edition) hỗ trợ phát triển
những ứng dụng đơn, ứng dụng client-server; J2EE (Java 2 Enterprise Edition) hỗ trợ
phát triển các ứng dụng thƣơng mại, J2ME (Java 2 Micro Edition) hỗ trợ phát triển các
ứng dụng trên các thiết bị di động, không dây,
Trang 1
Trang 2
Trang 3
Trang 4
Trang 5
Trang 6
Trang 7
Trang 8
Trang 9
Trang 10
Tải về để xem bản đầy đủ
Tóm tắt nội dung tài liệu: Giáo trình Mô đun Lập trình java - Thiết kế trang Web
trị int đƣợc xác định bởi val. void writeLong (long val) Ghi xuống luồng một giá trị long đƣợc xác định bởi val. void writeShort (int val) Ghi xuống luồng một giá trị short đƣợc xác định bởi val. Contructor: DataOutputStream(OutputStream outputStream) OutputStream: là luồng xuất dữ liệu. Để ghi dữ liệu ra file thì đối tƣợng outputStream có thể là FileOutputStream. DataInputStream: hiện thực interface DataInput. Interface DataInput có các phƣơng thức cho phép đọc tất cả những kiểu dữ liệu cơ sở của java (theo định dạng nhị phân). Phƣơng thức Ý nghĩa boolean readBoolean( ) Đọc một giá trị boolean Byte readByte( ) Đọc một byte char readChar( ) Đọc một Char double readDouble( ) Đọc một giá trị Double float readFloat( ) Đọc một giá trị float int readInt( ) Đọc một giá trị int Long readLong( ) Đọc một giá trị long short readShort( ) Đọc một giá trị short Contructor: DataInputStream(InputStream inputStream) InputStream: là luồng nhập dữ liệu. Đểđọ dữ liệu từ file thì đối tƣợng InputStream có thể là FileInputStream. Trang 85 Ví dụ: dùng DataOutputStream và DataInputStream để ghi và đọc những kiểu dữ liệu khác nhau trên file.import java.io.*; class RWData { public static void main(String args[]) throws IOException { DataOutputStream dataOut; DataInputStream dataIn; int i = 10; double d = 1023.56; boolean b = true; try { dataOut = new DataOutputStream( new FileOutputStream("D:\\testdata")); } catch(IOException exc) { System.out.println("Cannot open file."); return; } try { System.out.println("Writing " + i); dataOut.writeInt(i); System.out.println("Writing " + d); dataOut.writeDouble(d); System.out.println("Writing " + b); dataOut.writeBoolean(b); System.out.println("Writing " + 12.2 * 7.4); dataOut.writeDouble(12.2 * 7.4); } catch(IOException exc) { System.out.println("Write error."); } dataOut.close(); System.out.println(); // Now, read them back. try { dataIn = new DataInputStream( new FileInputStream("D:\\testdata")); } catch(IOException exc) { System.out.println("Cannot open file."); return; } try Trang 86 { i = dataIn.readInt(); System.out.println("Reading " + i); d = dataIn.readDouble(); System.out.println("Reading " + d); b = dataIn.readBoolean(); System.out.println("Reading " + b); d = dataIn.readDouble(); System.out.println("Reading " + d); } catch(IOException exc) { System.out.println("Read error."); } dataIn.close(); } } Kết quả thực thi chƣơng trình: Dữ liệu ghi xuống file D:\\testdata Hình 5.4 Dữ liệu ghi xuống file D:\\testdata Kết quả đọc và xuất ra Console: Hình 5.5 Kết quả đọc và xuất ra Console 5.4.File truy cập ngẫu nhiên (Random Access Files) Bên cạnh việc xử lý xuất nhập trên file theo kiểu tuần tự thông qua các luồng, java cũng hỗ trợ truy cập ngẫu nhiên nội dung của một file nào đó dùng RandomAccessFile. RandomAccessFile không dẫn xuất từ InputStream hay OutputStream mà nó hiện thực các interface DataInput, DataOutput (có định nghĩa các phƣơng thức I/O cơ bản). RandomAccessFile hỗ trợ vấn đềđịnh vị con trỏ file bên trong một file dùng phƣơng thức seek(long newPos). Ví dụ: minh họa việc truy cập ngẫu nhiên trên file. Chƣơng trình ghi 6 số kiểu double xuống file, rồi đọc lên theo thứ tự ngẫu nhiên. import java.io.*; class RandomAccessDemo { public static void main(String args[]) throws IOException Trang 87 { double data[] = {19.4, 10.1, 123.54, 33.0, 87.9, 74.25}; double d; RandomAccessFile raf; try { raf = new RandomAccessFile("D:\\random.dat", "rw"); } catch(FileNotFoundException exc) { System.out.println("Cannot open file."); return ; } // Write values to the file. for(int i=0; i < data.length; i++) { try { raf.writeDouble(data[i]); } catch(IOException exc) { System.out.println("Error writing to file."); return ; } } try { // Now, read back specific values raf.seek(0); // seek to first double d = raf.readDouble(); System.out.println("First value is " + d); raf.seek(8); // seek to second double d = raf.readDouble(); System.out.println("Second value is " + d); raf.seek(8 * 3); // seek to fourth double d = raf.readDouble(); System.out.println("Fourth value is " + d); System.out.println(); // Now, read every other value. System.out.println("Here is every other value: "); for(int i=0; i < data.length; i+=2) { raf.seek(8 * i); // seek to ith double d = raf.readDouble(); System.out.print(d + " "); } Trang 88 System.out.println("\n"); } catch(IOException exc) { System.out.println("Error seeking or reading."); } raf.close(); } } Kết quả thực thi chƣơng trình: HÌnh 5.6 ghi 6 số kiểu double xuống file, rồi đọc lên theo thứ tự ngẫu nhiên 5.5.Sử dụng luồng ký tự Chúng ta đã tìm hiểu và sử dụng luồng byte để xuất/nhập dữ liệu. Tuy có thể nhƣng trong một số trƣờng hợp luồng byte không phải là cách “lý tƣởng” để quản lý xuất nhập dữ liệu kiểu character, vì vậy java đã đƣa ra kiểu luồng character phục vụ cho việc xuất nhập dữ liệu kiểu character trên luồng. Mức trên cùng là hai lớp trừu tƣợng Reader và Writer. Lớp Reader dùng cho việc nhập dữ liệu của luồng, lớp Writer dùng cho việc xuất dữ liệu của luồng. Những lớp dẫn xuất từReader và Writer thao tác trên các luồng ký tự Unicode. Những phƣơng thức định nghĩa trong lớp trừu tƣợng Reader và Writer Phƣơng thức Ý nghĩa Reader abstract void close( ) Đóng luồng void mark(int numChars) Đánh dấu vị trí hiện tại trên luồng boolean markSupported( ) Kiểm tra xem luồng có hỗ trợ thao tác đánh dấu mark() không? int read( ) Đọc một ký tự int read(char buffer[ ]) Đọc buffer.length ký tự cho vào buffer Trang 89 abstract int read(char buffer[ ], int offset, int numChars) Đọc numChars ký tự cho vào vùng đệm buffer tại vị trí buffer[offset] boolean ready( ) Kiểm tra xem luồng có đọc đƣợc không? void reset( ) Dời con trỏ nhập đến vị trí đánh dấu trƣớc đó long skip(long numChars) Bỏ qua numChars của luồng nhập Writer abstract void close( ) Đóng luồng xuất. Có lỗi ném ra IOException abstract void flush( ) Dọn dẹp luồng (buffer xuất) void write(int ch) Ghi một ký tự void write(byte buffer[ ]) Ghi một mảng các ký tự abstract void write(char buffer[ ], int offset, int numChars) Ghi một phần của mảng ký tự void write(String str) Ghi một chuỗi void write(String str, int offset, int numChars) Ghi một phần của một chuỗi ký tự 5.5.1.Nhập Console dùng luồng ký tự Thƣờng thì việc nhập dữ liệu từ Console dùng luồng ký tự thì thuận lợi hơn dùng luồng byte. Lớp tốt nhất đểđọc dữ liệu nhập từ Console là lớp BufferedReader. Tuy nhiên chúng ta không thể xây dựng một lớp BufferedReader trực tiếp từSystem.in. Thay vào đó chúng ta phải chuyển nó thành một luồng ký tự. Để làm điều này chúng ta dùng InputStreamReader chuyển bytes thành ký tự. Để có đƣợc một đối tƣợng InputStreamReader gắn với System.in ta dùng constructor của InputStreamReader. InputStreamReader(InputStream inputStream) Tiếp theo dùng đối tƣợng InputStreamReaderđã tạo ra để tạo ra một BufferedReader dùng constructor BufferedReader. BufferedReader(Reader inputReader) Ví dụ: Tạo một BufferedReader gắn với Keyboard BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); Sau khi thực hiện câu lệnh trên, br là một luồng ký tự gắn với Console thông qua System.in. Trang 90 Ví dụ: Dùng BufferedReader đọc từng ký tự từ Console. Việc đọc kết thúc khi gặp dấu chấm (dấu chấm để kết thúc chƣơng trình). import java.io.*; class ReadChars { public static void main(String args[]) throws IOException { char c; BufferedReader br = newBufferedReader( new InputStreamReader(System.in)); System.out.println("Nhap chuoi ky tu, gioi han dau cham."); // read characters do { c = (char) br.read(); System.out.println(c); } while(c != '.'); } } Kết quả thực thi chƣơng trình: Hình 5.7 Nhập Console dùng luồng ký tự Ví dụ: Dùng BufferedReader đọc chuỗi ký tự từ Console. Chƣơng trình kết thúc khi gặp chuỗi đọc là chuỗi “stop” import java.io.*; class ReadLines { public static void main(String args[]) throws IOException { // create a BufferedReader using System.in BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str; System.out.println("Nhap chuoi."); System.out.println("Nhap 'stop' ket thuc chuong trinh."); do { str = br.readLine(); System.out.println(str); } while(!str.equals("stop")); } } Trang 91 Kết quả thực thi chƣơng trình: Hình 5.8 Dùng BufferedReader đọc chuỗi ký tự từ Console 5.5.2.Xuất Console dùng luồng ký tự Trong ngôn ngữ java, bên cạnh việc dùng System.outđể xuất dữ liệu ra Console (thƣờng dùng để debug chƣơng trình), chúng ta có thể dùng luồng PrintWriterđối với các chƣơng trình “chuyên nghiệp”. PrintWriter là một trong những lớp luồng ký tự. Việc dùng các lớp luồng ký tựđể xuất dữ liệu ra Console thƣờng đƣợc “ƣa chuộng” hơn. Để xuất dữ liệu ra Console dùng PrintWriter cần thiết phải chỉđịnh System.out cho luồng xuất. Ví dụ: Tạo đối tƣợng PrintWriter để xuất dữ liệu ra Console PrintWriter pw = new PrintWriter(System.out, true); Ví dụ: minh họa dùng PrintWriterđể xuất dữ liệu ra Console import java.io.*; public class PrintWriterDemo { public static void main(String args[]) { PrintWriter pw = new PrintWriter(System.out, true); int i = 10; double d = 123.67; double r = i+d pw.println("Using a PrintWriter."); pw.println(i); pw.println(d); pw.println(i + " + " + d + " = " + r); } } Kết quả thực thi chƣơng trình: Hình 5.9 Xuất Console dùng luồng ký tự 5.5.3.Đọc/ghi File dùng luồng ký tự Thông thƣờng đểđọc/ghi file ngƣời ta thƣờng dùng luồng byte, nhƣng đối với luồng ký tự chúng ta cũng có thể thực hiện đƣợc. Ƣu điểm của việc dùng luồng ký tự là chúng thao tác trực tiếp trên các ký tự Unicode. Vì vậy luồng ký tự là chọn lựa tốt nhất khi cần lƣu những văn bản Unicode. Hai lớp luồng thƣờng dùng cho việc đọc/ghi dữ liệu ký tự xuống file là FileReader và FileWriter. Ví dụ: Đọc những dòng văn bản nhập từ bàn phím và ghi chúng xuống file tên là “test.txt”. Việc đọc và ghi kết thúc khi ngƣời dùng nhập vào chuỗi “stop”. Trang 92 import java.io.*; class KtoD { public static void main(String args[]) throws IOException { String str; FileWriter fw; BufferedReader br = new BufferedReader( new InputStreamReader(System.in)); try { fw = new FileWriter("D:\\test.txt"); } catch(IOException exc) { System.out.println("Khong the mo file."); return ; } System.out.println("Nhap ('stop' de ket thuc chuong trinh)."); do { System.out.print(": "); str = br.readLine(); if(str.compareTo("stop") == 0) break; str = str + "\r\n"; fw.write(str); } while(str.compareTo("stop") != 0); fw.close(); } } Kết quả thực thi chƣơng trình Dữ liệu nhập từ Console: Hình 5.11 Đọc File dùng luồng ký tự Dữ liệu ghi xuống file: Hình 5.12 Ghi File dùng luồng ký tự Ví dụ: đọc và hiển thị nội dung của file “test.txt” lên màn hình. Trang 93 import java.io.*; class DtoS { public static void main(String args[]) throws Exception { FileReader fr = new FileReader("D:\\test.txt"); BufferedReader br = new BufferedReader(fr); String s; while((s = br.readLine()) != null) { System.out.println(s); } fr.close(); } } Kết quả thực thi chƣơng trình Nội dung của file test.txt: Hình 5.13 đọc và hiển thị nội dung của file “test.txt” lên màn hình Kết quả đọc file và hiển thị ra Console: Hình 5.14 đọc file và hiển thị ra Console 5.6.Lớp File Lớp File không phục vụ cho việc nhập/xuất dữ liệu trên luồng. Lớp File thƣờng đƣợc dùng để biết đƣợc các thông tin chi tiết về tập tin cũng nhƣ thƣ mục (tên, ngày giờ tạo, kích thƣớc, ) java.lang.Object +--java.io.File Các Constructor: Tạo đối tƣợng File từđƣờng dẫn tuyệt đối public File(String pathname) ví dụ: File f = new File(“C:\\Java\\vd1.java”); Tạo đối tƣợng File từ tên đƣờng dẫn và tên tập tin tách biệt public File(String parent, String child) ví dụ: File f = new File(“C:\\Java”, “vd1.java”); Tạo đối tƣợng File từ một đối tƣợng File khác public File(File parent, String child) ví dụ: File dir = new File (“C:\\Java”); File f = new File(dir, “vd1.java”); Một số phƣơng thức thƣờng gặp của lớp File (chi tiết về các phƣơng thức đọc thêm trong tài liệu J2SE API Specification) Trang 94 public StringgetName() Lấy tên của đối tƣợng File public StringgetPath() Lấy đƣờng dẫn của tập tin public boolean isDirectory() Kiểm tra xem tập tin có phải là thƣ mục không? public boolean isFile() Kiểm tra xem tập tn có phải là một file không? public String[] list() Lấy danh sách tên các tập tin và thƣ mục con của đối tƣợng File đang xét và trả về trong một mảng. Ví dụ: import java.awt.*; import java.io.*; public class FileDemo { public static void main(String args[]) { Frame fr = new Frame ("File Demo"); fr.setBounds(10, 10, 300, 200); fr.setLayout(new BorderLayout()); Panel p = new Panel(new GridLayout(1,2)); List list_C = new List(); list_C.add("C:\\"); File driver_C = new File ("C:\\"); String[] dirs_C = driver_C.list(); for (int i=0;i<dirs_C.length;i++) { File f = new File ("C:\\" + dirs_C[i]); if (f.isDirectory()) list_C.add("" + dirs_C[i]); else list_C.add(" " + dirs_C[i]); } List list_D = new List(); list_D.add("D:\\"); File driver_D = new File ("D:\\"); String[] dirs_D = driver_D.list(); for (int i=0;i<dirs_D.length;i++) Trang 95 { File f = new File ("D:\\" + dirs_D[i]); if (f.isDirectory()) list_D.add("" + dirs_D[i]); else list_D.add(" " + dirs_D[i]); } p.add(list_C); p.add(list_D); fr.add(p, BorderLayout.CENTER); fr.setVisible(true); } } Kết quả thực thi chƣơng trình: Hình 5.15 FileDemo Trang 96 Tài liệu tham khảo [1] java.sun.com [2] Herbert Schildt. Java 2. A Beginner’s Guide. Second Edition. McGraw-Hill - 2003. [3] Dr. Harvey M. Deitel - Paul J. Deitel. Java How to Program, 4th Ed (Deitel). Prentice Hall - 2002 [4] Simon Roberts – Philip Heller – Michael Ernest. Complete Java 2 Certification – study guide. BPB Publications – 2000. [5] Cay S. Horstmann – Gary Cornell. Core Java Volum 1 - Fundamentals. The Sun Microsystems press. 1997 [6] Cay S. Horstmann – Gary Cornell. Core Java Volum 2 – Advanced Features. The Sun Microsystems press. 1997
File đính kèm:
- giao_trinh_mo_dun_lap_trinh_java_thiet_ke_trang_web.pdf