Tải bản đầy đủ (.doc) (29 trang)

BÁO CÁO BÀI TẬP LỚN Môn Lập Trình Java Tìm hiểu về cơ chế bắt lỗi (Exception Handling) trong Java

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (251.72 KB, 29 trang )

TRƯỜNG ĐẠI HỌC NÔNG NGHIỆP HÀ NỘI
KHOA CÔNG NGHỆ THÔNG TIN
BÁO CÁO BÀI TẬP LỚN
Môn Lập Trình Java
Đề tài 7: “ - Tìm hiểu về cơ chế bắt lỗi (Exception Handling) trong Java
- Tìm hiểu về lớp File và interface Serializable
- Viết chương trình đọc và ghi tệp chứa các đối tượng Sinh viên có các
thông tin về mã sinh viên, họ tên và ngày sinh.”
Giáo viên hướng dẫn: Ngô Công Thắng
Nhóm sinh viên thực hiện :
1. Nguyễn Thị Hồng Anh
2. Nguyễn Thị Thu Hải
3. Hoàng Thị Hoa
4. Hoàng Thị Nga
5. Nguyễn Thị Thu Quỳnh
- 1 -
Nội dung chính :
I, Cơ chế bắt lỗi (Exception Handling)
1, Giới thiệu một lỗi (exception)
2, Mục đích của việc xử lý lỗi
3, Mô tả mô hình xử lý lỗi
4, Các khối ‘try’ và ‘catch’
5, Khối ‘finally’
6, Các ngoại lệ được định nghĩa với lệnh ‘throw’ và ‘throws’
7, Danh sách các ngoại lệ
II, Lớp File :
1, Giới thiệu lớp File
2, Một số phương thức trong lớp File
3, Thư mục
4, FilenameFiter
5, ListFiles()


III, Lớp interface Serializable :
IV, Chương trình :
Tên chương trình : “Viết chương trình đọc và ghi tệp chứa các đối
tượng Sinh viên có các thông tin về mã sinh viên, họ tên và ngày sinh”
- 2 -
I. Cơ chế bắt lỗi (Exception Handling)
1. Giới thiệu
Exception là một nỗi đặc biệt. Lỗi này xuất hiện vào lúc thực thi trương trình.
Các trạng thái không bình thường xảy ra trong khi thi hành trương trình tạo ra
các Exception. Những trạng thái này không được biết trước khi ta xây dựng
chương trình. Nếu bạn không phân phối các trạng thái này thì exception có thể
bị kết thúc đột ngột. Ví dụ, việc chia cho 0 sẽ tao một lỗi trong trương trình.
Ngôn ngữ Java cung cấp bộ máy xử lý lỗi rất tốt. Việc xử lý này làm hạn chế tối
đa trường hợp hệ thống bị phá vỡ (crash) hay hệ thống bị ngắt đột ngột. Tính
năng này làm cho Java là một ngôn ngữ lập trình mạnh.
Các lỗi trong một chương trình:
- Lỗi cú pháp: Đố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,
dựa vào trình biên dịch, đây là lỗi dễ phát hiện và sửa chữa, tuy nhiên đâ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.
- Lỗi thuật toán: Đây là lỗi khó phát hiện và sửa chữa nhất, tuy nhiên trong bài
này ta không bàn luận về vấn đề này.
- Lỗi thực thi : Ta hoàn toàn có thể kiểm soát được chúng, 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, hay thực hiện phép chia nhưng mẫu số lại bằng 0,
kết nối với máy tính ở xa nhưng máy đó lại không tồn tại… Là một lỗi khách
quan chúng ta có thể kiểm soát được nhờ cơ chế bắt lỗi trong java.
2. Mục đích của việc xử lý lỗi
Một chương trình nên có cơ chế xử lý lỗi thích hợp. Nếu không, chương trình sẽ
ngắt khi hệ thống xảy ra lỗi. Trong trường hơp đó, tất cả các nguồn tài nguyên
mà hệ thống trước kia phân phối sẽ được di dời trong cùng trạng thái. Điều này

làm gây lãng phí nguồn tài nguyên. Để tránh trường hợp này, tất cả các nguồn
- 3 -
tài nguyên mà hệ thống phân phối nên được thu hồi lại. Tiến trình này đòi hỏi cơ
chế xử lý lỗi thích hợp.
Cho ví dụ, xét thao tác nhập xuất (I/O) trong một tập tin. Nếu việc chuyển đổi
kiểu dữ liệu không thực hiện đúng, một lỗi sẽ xảy ra và chương trình bị hủy mà
không đóng lai tập tin. 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 thu hồi lại cho hệ thống.
3. Mô hình xử lý lỗi
Khi một lỗi xảy ra, đối tượng tương ứng với lỗi đó được tạo ra. Đối tượng này
sau đó được truyền cho phương thức là nơi mà lỗi xảy ra. Đối tượng này chứa
thông tin chi tiết về lỗi. Thông tin này có thể được nhận về và xử lý. Các môi
trường runtime như ‘IllegalAccessException’, ‘EmptyStackException’ v.v có
thể chặn được các lỗi, đoạn mà trong chương trình đôi khi có thể xảy ra các
ngoại lệ.
Trong Java, mô hình xử lý ngoại lệ kiểm tra việc xử lý những hiệu ứng lỗi, được
biết đến là mô hình ‘catch và throw’. Trong mô hình này, Khi một lỗi xảy ra,
một ngoại lệ sẽ bị chặn và được đưa vào trong một khối. Người lập trình nên xét
các trang thái ngoại lệ độc lập nhau từ việc điều khiển thông thương trong
chương trình. Các ngoại lệ phải được bắt giữ nêu không chương trình sẽ bị ngắt.
Mô hình xử lý lỗi dựa trên 3 hoạt động chính :
- Đặ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. Để khai báo biệt lệ ta sử dụng từ
khoá throws trong khai báo phương thức, ví dụ: public void myMethod() throws
IOException, 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, 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 ‘,’.
- Loại bỏ một ngoại lệ ra: Một phương thức sau khi đã khai báo các biệt lệ, 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ệ, có

kiểu mà ta đã khai báo trong danh sách throws.
- 4 -
Cú pháp của lệnh ném ra ngoại lệ: throw ExceptionObject;
- Bắt lỗi: 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 điều kiện không bình thường nào đó. Khi một ngoại lệ
xảy ra, đối tượng tương ứng với ngoại lệ đó được tạo ra. Đối tượng này sau đó
được truyền cho phương thức là nơi mà ngoại lệ xảy ra. Đối tượng này chứa
thông tin chi tiết về ngoại lệ. Thông tin này có thể được nhận về và được xử lý.
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. Trong mô hình này mỗi khi lỗi xảy ra sẽ được phát hiện và đưa
vào một khối để xử lý. Mọi lớp biệt lệ trong java đều được dẫn xuất từ lớp cơ sở
throwable, ta có thể tạo ra lớp ngoại lệ riêng bằng cách mở rộng lớp throwable:
- try: dùng để chứa đoạn mã gây ra lỗi
- catch: dùng để chứa đoạn mã xử lý lỗi
- throw: chỉ ra lỗi vừa xảy ra
- throws: liệt kê các lỗi xảy ra
- finally: khối lệnh luôn thực hiện dù lỗi có xảy ra trong khối try hay
không.
Sau khi bạn đã biết cách khai báo và ném ra biệt lệ, thì phần việc quan trọng
nhất là bắt và xử lý biệt lệ. Vấn đề đối với người lập trình java là phải biết được
đoạn mã nào của anh ta có thể gây ra lỗi. Khi họ đã khoanh vùng được đoạn mã
có thể gây ra lỗi họ sẽ đặt đoạn mã, có khả năng gây ra lỗi đó trong khối ‘try’
( thử làm), và đặt đoạn mã xử lý lỗi trong khối ‘catch’ ( bắt giữ). Dạng tổng
quát như sau:
Dưới đây là cấu trúc của mô hình xử lý ngoại lệ:
try
{
// Các lệnh có khả năng gây lỗi
}
catch ( TypeException1 ex)

{
- 5 -
// 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
}

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.
}
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, 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ì 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ệ, nếu kiểu ngoại lệ so khớp với kiểu ngoại lệ trong mệnh
đề catch, thì mã lệnh trong khối catch đó sẽ được thực thi, 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ệ, 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, 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.err
4. Các khối ‘try’ và ‘catch’
Khối try - catch được sử dụng để thi hành mô hình catch và throw của việc xử

lý lỗi. Khối try chứa một bộ các lệnh có thể thi hành được. Các lỗi có thể bị
- 6 -
chặn khi thi hành những câu lệnh này. Phương thức dùng để chặn lỗi có thể
được khai báo trong khối try. Một hay nhiều khối catch có thể theo sau khối
try. Các khối catch này bắt các lỗi trong khối try.
Để bắt giữ bất cứ một lỗi nào, ta phải chỉ ra kiểu lỗi là Exception.
catch(Exception e)
Khi lỗi bị bắt giữ không biết thuộc kiểu nào, chúng ta có thể sử dụng lớp
Exception để bắt lỗi đó.
Các khối chứa nhiều catch
Các khối chứa nhiều catch xử lý các kiểu lỗi khac nhau một cách độc lập. Một
chương trình cũng có thể chứa các khối ‘try’ lồng nhau. Ví dụ đoạn mã dưới
đây:
try
{
statement 1;
statement 2;
try
{
statement 1;
statement 2;
}
}
catch(Exception e)
{
}

Khi sử dụng các “try” lồng nhau, khối “try”bên trong được thi hành đầu tiên .
Bất kỳ lỗi nào bị chặn trong khối “try” sẽ bị bắt giữ trong khối “catch” theo
sau. Nếu khối catch thích hợp không được tìm thấy thì các khối “catch” của các

- 7 -
khối “try” bên ngoài sẽ được xem xét. Nếu không, Java Runtime Environment
xử lý các lỗi.
Chương trình 1 minh họa cách sử dụng các khối “try” và “catch”.
Chương trình 1:
class TryClass
{
public static void main(String args[])
{
int b=0;
try
{
System.out.println(20/b);
}
catch(ArithmeticException a)
{
System.out.println(“Khong the thuc hien phep chia cho 0”);
}
}
}
Kết quả chương trình hiện ra dòng thông báo:
Khong the thuc hien phep chia cho 0
Trong chương trình này, một số được chia cho 0. Đây không là toán tử số học
hợp lệ. Do đó một lỗi bị chặn và bị bắt giữ trong khối catch . Khi người lập trình
viên nhận biết được loại ngoại lệ nào có thể xảy ra, anh ta viết một câu lệnh
trong khối catch. Ở đây “a” được sử dụng như một đối tượng của
Arithmaticexception để in các chi tiết về các toán tử lỗi mà hệ thống cung cấp.
Nếu bạn thay thế lệnh ‘System.out.println’ của khối catch bằng lệnh
- 8 -
‘System.out.println(a.getMessage())’ thì kết quả xuất của chương trình như

sau:
/ by zero
Khi các khối try được sử dụng mà không có các khối catch nào, chương trình sẽ
biên dịch mà không gặp sự cố nào nhưng sẽ bị ngắt khi thực thi. Bởi vì lỗi đã
xảy ra khi thực thi chuong trình.
Mô hình ‘catch và throw’ có hai ưu điểm:
- Người lập trình viên phải phân phối trạng thái lỗi chỉ vào những nơi cần thiết,
không cần phải thực hiện tại mọi mức.
- Một thông báo lỗi có thể được in ra khi tiến hành xử lý lỗi.
5. Khối “finally”
Khi một lỗi xuất hiện, phương thức đang được thực thi có thể bị dừng mà không
được thi hành toàn vẹn. Nếu điều này xảy ra, thì các đoạn mã (ví dụ như đơạn
mã với chức năng thu hồi tài nguyên có các lệnh đóng lại tập tin khai báo cuối
phương thức) sẽ không bao giờ được gọi. Java cung cấp khối “finally” để giải
quyết việc này. Khối “finally” thực hiện tất cả các việc thu dọn khi một lỗi xảy
ra. Khối này có thể được sử dụng kết hợp với khối “try”. Khối “finally” chứa
các câu lệnh thu hồi tài nguyên về cho hệ thống hay lệnh in ra các câu thông
báo.
Các lệnh này bao gồm:
- Đóng tập tin
- Đóng lại bộ kết quả (được sử dụng trong chương trình cơ sở dữ liệu).
- Đóng lại các kết nối được tạo trong cơ sở dữ liệu.
try
{
doSomethingThatMightThrowAnException();
}
finally
{
- 9 -
cleanup();

}
Phương thức “cleanup()” được gọi nếu phương
thức”doSomethingThatMightThrowAnException()” chặn một lỗi. Mặt khác
cleanup() cũng được gọi ngay khi không có lỗi nào bị chặn và thi hành tiếp tục
sau khối lệnh finally.
Khi finally là tùy ý, không bắt buộc. Khối này được đặt sau khối catch. Hệ
thống sẽ duyệt từ câu lệnh đầu tiên của khối finally sau khi gặp câu lệnh return
hay lệnh break được dung trong khối try.
Khối ‘finally’ bảo đảm lúc nào cũng được thực thi, bất chấp có lỗi nào xảy ra
hay không.
Hình minh họa sự hình thành các khối ‘try’,’catch’ và ‘finally’.
try block
catch blockfinally block
finally block
No Exception Exception occurs
Chương trình Tryclass sử dụng khối finally. Ở đây khối finally được thi hành
bất chấp ArithmeticException có xảy ra hay không. Khối này khai báo các hoạt
động thu dọn.
Chương trình:
class FinallyDemo
{
public static void main(String[] args)
{
String name;
int a=5,b=0;
try
{
System.out.println("Ket qua :" + a/b);
}
- 10 -

catch(ArithmeticException i)
{
System.out.println("Khong the chia cho so 0");
}
finally
{
System.out.println("Finally da duoc thuc hien");
}
}
}
Kết quả xuất của chương trình:
Thông báo dòng: Khong the chia cho so 0
Finally da duoc thuc hien
Trong ví dụ này, các câu lệnh trong khối ‘Finally’ luôn luôn thi hành bất chấp
lỗi có xảy ra hay không. Trong kết quả xuất bên trên, khối ‘finally’ được thi
hành mặc dù có lỗi xảy ra.
6. Các ngoại lệ được định nghĩa với lệnh ‘throw’ và ‘throws’
Trong exception còn 1 kiểu là ngoại lệ tự định nghĩa với throw và throws
Các ngoại lệ bị chặn với sự trợ giúp của từ khóa throw . Từ khóa throw chỉ ra 1
exception vừa xảy ra, Từ khóa‘throws’ để xử lý nhiều loại ngoại lệ.Một phương
thức đơn có thể chặn nhiều loại lỗi và để xử lý những lỗi này, ta cần cung cấp
một danh sách các lỗi mà phương thức chặn trong phần định nghĩa của phương
thức.
Public class Example
{
Public void exceptionExamble( ) throws ExException, LookupExxeption
{
Try
{
// mã lệnh

}
- 11 -
Catch(ExException exmp)
{
}
}
}
Ta có ví dụ: Ta có 1 mảng và nó xuất hiện ngoại lệ khi các phần tử của mảng
không phải là 1 số tự nhiên có 1 chữ số.
Ví dụ :
//Tu dinh nghia 1 exeption
package example;
public class NgoaiMienXacDinh extends NegativeArraySizeException
{
public NgoaiMienXacDinh()
{
super("Ngoai khoang 0->9");
}
}
Và 1 class nữa như sau:
package example;
import fita.ncthang.console.cin;
public class ThrowDemo
{
public static void throwDemo(int n)
{
try
{
- 12 -
checkValue(n);

}
catch (NgoaiMienXacDinh e)
{
System.out.println("Loi!: "+e.getMessage());
}
}
public static void checkValue(int n)
{
if(n>9 || n<0)
throw new NgoaiMienXacDinh();
else
System.out.println(n+" is ok!");
}
public static void main(String[] args)
{
int[] A= new int[3];
System.out.print("Nhap A[1]= ");
A[0]= cin.getInt();
throwDemo(A[0]);
System.out.print("Nhap A[2]= ");
A[1]= cin.getInt();
throwDemo(A[1]);
System.out.print("Nhap A[3]= ");
A[2]= cin.getInt();
throwDemo(A[2]);
}
}
- 13 -
Ở đây ngoại lệ ta tự định nghĩa là ngoại lệ NgoaiMienXacDinh ngoại lệ này
được kế thừa từ class NegativeArraySizeException

Phuơng thức checkValue được gọi để chặn ngoại lệ và nó được đặt trong khối
try-catch. Ngoại lệ được kiểm trong điều kiện if của phuơng thức checkValue.
Nếu giá trị của phần tử ko phải là từ 0 -> 9 thì nó sẽ đối tượng của class
NgoaiMienXacDinh được tạo ra.
7. Danh sách các ngoại lệ:
Bảng sau đây liệt kê một số ngoại lệ:
Lỗi Lớp cha của thứ tự phân cấp lỗi
RuntimeException Lớp cơ sở cho nhiều lỗi java.lang
ArthmeticException Trạng thái lỗi về số, ví dụ như chia cho 0
IllegalAccessException Lớp không thêt truy cập
IllegalArgumentException Phương thúc nhận một đối số không hợp
lệ
ArrayIndexOutOfBoundsExeption Kích thước của mảng lớn hơn 0 hay lớn
hơn kích thước thật của mảng
NullPointerException Khi muốn truy cập tới đối tượng null
SecurityException Việc thiết lập cơ chế bảo mật không được
hoạt động
ClassNotFoundException Không thể truy nạp lớp yêu cầu
NumberFormatException Việc chuyển đổi không thành công từ
chuỗi sang số thực
AWTException Lỗi về AWT
IOException Lớp cha của các ngoại lệ I/O
FileNotFoundException Không thể định vị tập tin
EOFException Kết thúc một tập tin
NoSuchMethodException Phương thức yêu cầu không tồn tại
InterruptedException Khi một luồng bị ngắt
II. Lớp File
1. Giới thiệu lớp file
- 14 -
Mặc dù hầu hết các lớp của java.io hoạt động trên các stream, nhưng ngược lại

ở lớp File. Nó giao tiếp trực tiếp các file và hệ thống file. Lớp File không xác
định thông tin mang về hoặc được lưu trữ trên các tập tin như thế nào. Một đối
tượng File dùng giám sát và thao tác thông tin tương ứng với một tập tin trên đĩa
như thời gian, ngày tháng, đường dẫn thư mục và cây thư mục con.
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
thường 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,….).
Các tập tin là nguồn và đích của dữ liệu bên trong nhiều chương trình. Mặc dù
có nhiều hạn chế trong việc sử dụng chúng. Vì các lý do an toàn, tập tin vẫn là
tài nguyên trọng yếu cho việc lưu trữ liên tục và chia sẻ thông tin. Một thư mục
xem như một tập tin trong Java với thuộc tính thư mục.
2. Một số phương thức trong lớp File
Lớp File có các hàm khởi tạo sau:
File(String directoryPath)
File(String directoryPath, String filename)
File(File dirObj, String filename)
Trong đó, directoryPath là tên đường dẫn của tập tin, filename là tên tập tin, và
dirObj là một đối tượng File xác định thư mục.
Ví dụ sau tạo ra ba tập tin: f1, f2, f3. Đối tượng File đầu tiên được xây dựng với
một đường dẫn thư mục. Đối tượng thứ hai với đường dẫn và tên file. Đối tượng
thứ ba bao gồm đường dẫn của tập tin chỉ đến f1 và một tên tập tin; f3 chỉ đến
cùng một tập tin như f2.
File f1 = new File("/");
File f2 = new File("/","autoexec.bat");
File f3 = new File(f1,"autoexec.bat");
File định nghĩa nhiều phương thức lấy các thuộc tính chuẩn của đối tượng File.
Ví dụ, getName() trả về tên của file, getParent() trả về tên của thư mục cha và
exists() trả về true nếu file tồn tại. Tuy vậy, lớp File không có tính đối xứng.
- 15 -
Tức là có nhiều phương thức cho phép bạn tham chiếu các thuộc tính của một

đối tượng file đơn giản, nhưng không có phương thức tương ứng để thay đổi các
thuộc tính đó. Ví dụ sau minh họa một số phương thức của File.
Ví dụ:
import java.io.File;
import fita.ncthang.console.cin;
class tuan
{
public static void main(String args[])
{
File f1 = new File("/Program Files/java/jre6/COPYRIGHT");
System.out.println("File Name: "+ f1.getName());
System.out.println("Path: "+f1.getPath());
System.out.println("Abs Path: "+ f1.getAbsolutePath());
System.out.println("Parent: "+f1.getParent());
System.out.println(f1.exists() ?"exists" : "does not exist");
System.out.println(f1.canWrite()? "is writeable":"is not writeable");
System.out.println(f1.canRead() ? "is readable":"is not readable");
System.out.println("is "+ (f1.isDirectory()?"" : "not"+"a
directory"));
System.out.println(f1.isFile()?"is normal file":"might be a named
pipe");
System.out.println(f1.isAbsolute()?"is absolute":"is not absolute");
System.out.println("File last modified: "+f1.lastModified());
System.out.println("File size: "+ f1.length()+"Bytes");
}
}
- 16 -
Kết quả:
isFile() trả về true nếu đối tượng là tập tin thật sự, trả về false nếu là thư mục,
isFile() trả về false với các tập tin đặc biệt như là các tập tin điều khiển thiết bị

(driver). Hàm isAbsolute() trả về true nếu file có một đường dẫn tuyệt đối và
false nếu đường dẫn của nó là tương đối.
File cũng có hai phương thức tiện ích.
+Thứ nhất là renameTo():
boolean renameTo(File newName)
- 17 -
Trong đó, tên tập tin là newName trở thành tên mới của đối tượng File. Nó trả về
true nếu đổi tên thành công, ngược lại trả về false (trường hợp bạn cố gắng đổi
tên một tập tin đến mức nó di chuyển từ thư mục này sang thư mục khác hoặc
trùng tên với một tập tin khác đang tồn tại ).
+.Thứ hai là delete(): Xóa tập tin trên đĩa:
boolean delete()
Bạn có thể sử dụng delete() xóa một thư mục nếu nó rỗng. delete() trả về true
nếu xóa thành công, ngược lại trả về false.
Một số phương thức quan trọng :
Phương thức Mô tả
public void deleteOnExit() Xóa file tương ứng với đối tượng gọi
hàm khi máy ảo Java kết thúc
public boolean isHidden() Trả về true nếu file là ẩn. Ngược lại là
false
public boolean setLastModified(long
milisec)
Đặt thời gian của tập tin theo milisec,
là số mili giây kể từ 0h00 ngày
01/01/1970 theo mốc định vị toàn
cầu(UTC).
public boolean setReadOnly(long
milisec)
Đặt thuộc tính tập tin là read-only
public String getPath() Lấy đường dẫn của tập tin

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
3.Thư mục:
Thư mục là lớp File chứa danh sách các tập tin và thư mục khác. Hai hàm tiện
ích khác của File là mkdir() và mkdirs(). Hàm mkdir() tạo ra một thư mục, trả
về true nếu thành công. Trường hợp xảy ra lỗi khi đường dẫn xác định trong đối
- 18 -
tượng File đang tồn tại, hoặc là đường dẫn không gồm tên thư mục cần tạo của
File chưa tồn tại.Để tạo ra một thư mục không cần có đường dẫn đã tồn tại ta
dùng hàm mkdirs(), nó tạo ra một thư mục và tất cả các thư mục cha của thư
mục đó có mặt trong đường dẫn của File.
Khi bạn tạo đối tượng File và đặt nó là thư mục, hàm isDirectory() trả về true.
Trong trường hợp đó, bạn có thể gọi list() để trích danh sách các file và thư mục
khác bên trong. Hàm này có hai dạng, thứ nhất là:
String[] list()//Danh sách các tập tin trả về trong mảng các String
Chương trình sau khi chỉ ra cách dùng list() như thế nào để có nội dung của thư
mục.
import java.io.File;
import fita.ncthang.console.cin;
class DirList
{
public static void main(String args[])
{
String dirname = "C:/Program Files/Java/jdk1.6.0_16";
File f1 = new File(dirname);
if (f1.isDirectory())
{
System.out.println("Directory of "+ dirname);
String s[] = f1.list();

for (int i=0;i<s.length;i++)
{
File f = new File(dirname+ "/"+s[i]);
- 19 -
if (f.isDirectory())
{
System.out.println(s[i]+" is a directory");
}
else
{
System.out.println(s[i]+" is file");
}
}
}
else
{
System.out.println(dirname+" is not a directory");
}
}
}
Kết quả chương trình:
- 20 -
4. FilenameFiter
Bạn thường muốn giới hạn số lượng tập tin do list() trả về, chỉ gồm các
tập tin có tên tương xứng với mẫu tên nào đó bộ lọc. Để làm điều này, bạn dùng
dạng thứ hai của hàm list() :
String[] list(FilenameFilter FFObj )
Trong dạng này, FFObj là đối tượng của lớp thể hiện giao diện FilenameFiter
FilenameFiter định nghĩa chỉ một phương thức đơn giản accept(), nó gọi một
lần cho từng tập tin trong một danh sách. Dạng mở rộng của hàm này như sau:

boolean accept(File drectory, String filename)
Hàm accept() trả về true cho các tập tin trong thư mục directory và có mặt
trong danh sách (các tập tin tương xứng với filename).
- 21 -
Lớp OnlyExt thể hiện FilenameFiter. Nó sẽ dùng sửa đổi chương trình trước
để giới hạn các tập tin trả về bởi list() với những tập tin có cùng phần tên mở
rộng.
import java.io.*;
import fita.ncthang.console.cin;
public class OnlyExt implements FilenameFilter
{
String ext;
public OnlyExt(String ext)
{
this.ext="."+ext;
}
public boolean accept(File dir, String name)
{
return name.endsWith(ext);
}
}
Bây giờ chương trình sau chỉ hiện các tập tin có phần mở rộng.html
import java.io.*;
import fita.ncthang.console.cin;
class DirListOnly
{
public static void main(String args[])
{
String dirname = "C:/Program Files/Java/jdk1.6.0_16";
File f1 = new File(dirname);

FilenameFilter only = new OnlyExt("html");
- 22 -
String s[] = f1.list(only);
for (int i=0;i<s.length;i++)
{
System.out.println(s[i]);
}
}
}
Kết quả chương trình:
5. listFiles()
Java cung cấp một dạng biến thể của list() là listFiles() rất hữu ích. Các
dạng của listFiles() trình bày sau đây.
File[] listFiles()
File[] listFiles(FilenameFilter FFObj)
File[] listFiles(FileFilter FObj)
- 23 -
Các phương thức trên trả về mảng các đối tượng File thay thế vì mảng
chuỗi tên tập tin. Hàm đầu tiên trả về tất cả các tập tin và hàm thứ hai trả về
những file thỏa mãn FilenameFilter xác định. Chỉ khác là trả về các đối tượn
File. Hai hàm đầu tiên làm việc tương tự như các dạng hàm list() tương ứng.
Hàm thứ ba trả về các tập tin với đường dẫn thỏa mãn FileFilter xác định.
FileFilter chỉ định nghĩa hàm đơn giản accept(), hàm này gọi một lần cho mỗi
tập tin trong danh sách. Dạng chung của nó như sau đây:
boolean accept(File path)
Hàm accept() trả về true với các tập tin chứa trong danh sách (đó gồm các tập
tin tương xứng với path), ngược lại trả về false.
III. Lớp interface Serializable
Để ghi được đối tượng vào file ta cần lớp ObjectOutputStream và đọc đối tượng
đó là ObjectInputStream. Muốn đọc và ghi được đối tượng thì ta cần cài đặt

(implement ) interface Serializable cho nó.
Vậy Serializable là gì ?
Serializable là 1 interface được cung cấp bởi jdk trong gói java.io; Trong java,
khi cần truyền dữ liệu là một object qua tầng mạng thì Object đó phải implement
giao diện này. Một object đc Serialize có khả năng chuyển đổi qua lại với dữ
liệu kiểu mảng byte.
Nó đươc dùng để nhận ra các đối tượng cái mà được lưu vào luồng .Nó không
chứa một phương thức hay thuộc tính nào cả .Chúng ta chi cần khai báo lớp
implement nó là ta đã có thể sử dụng lớp ObjectOutputStream ().Khi đối tượng
được đc ghi vào luông thì methods writeOject() sẽ tự động lưu các thông tin của
đối tượng đó. Và ta có thể đọc lại đối tượng đó bằng methods readObject(); để
viết một object ra file thì object đó cần implemnts inteface Serializable. Vì lúc
này khi viết object ra file nó giúp chuyển cấu trúc phức của object thành cấu trúc
tuần tự đơn giản hơn trước khi ghi ra file. Serialize -nhận một tham chiếu
- 24 -
System.Object và một tham chiếu System.IO.Stream làm đối số, tuần tự hóa
Object và ghi nó vào Stream.
Sau đây là VD minh hoạ cách đọc và ghi một số đối tượng:
import java.io.*;
import java.util.*;
public class ObjectApp
{
public static void main(String[] args)
{
try
{
File file = new File("C:\\writeObj.txt");
ObjectOutputStream f1 = new ObjectOutputStream(new
FileOutputStream(file));
String str = " THC-K52 ";

int i = 10;
Date date = new Date();
f1.writeObject(new Testclass1(true,10,'a',1.2,"NGUYEN THI THU HAI "));
f1.writeObject(new Testclass2());
f1.writeObject(str);
f1.writeObject(i);
f1.writeObject(date);
f1.close();
ObjectInputStream robj = new ObjectInputStream(new
FileInputStream(file));
System.out.println(robj.readObject());
System.out.println(robj.readObject());
System.out.println(robj.readObject());
- 25 -

×