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

