Trong các ngôn ngữ khác nhau thì việc truy xuất và xử lý file là một vấn đề quan trọng. Với java, có thể có nhiều cách khác nhau để có thể lưu được file.
Hôm nay, Blog NDanh sẽ hướng dẫn các bạn cách lưu, đọc và xử lý các vấn đề với FILE trong java của ArrayList.

I, Sử dụng serialization

1, Bước đầu tiên

interface Serializable một đối tượng cần được lưu bộ nhớ vào file. Mục đích là để chuyển các dữ liệu trong đối tượng đó về một dạng dữ liệu có thể đọc được.
- Giả sử ở đây, mình đang cần quản lý ArrayList<HOCSINH>() thì mình sẽ interface Serializable đối tượng class HOCSINH như sau:

2, Các thao tác 

Đầu tiên, bạn phải thêm thư viện cho việc ghi file. Ở đây, mình sử dụng thư viện java.io để chạy các thư viện đọc file.
Gọi các thư viện sau:
hoặc có thể dùng:
import java.io.*;

a, Ghi file 

Ở đây, mình đang muốn lưu ArrayList hs vào trong file là "hocsinh.txt" thì sẽ thực hiện như sau:

b, Đọc file

Các bạn chú ý dòng màu đỏ, nếu bạn muốn sắp xếp và in ra, in file thì sẽ chỉnh sửa ở chỗ đó.
Các phần khác là đang hỗ trợ đọc file.


c, Đọc file sau đó sắp xếp

Từ ý b, có thể sử dụng để làm nhiều việc khác nữa, như xoá đi một phần tử trong file, hay sắp xếp dữ liệu theo tên.
Chỉ cần thay đổi nội dung khung đỏ( ở ý b) thành thứ ta muốn, ví dụ dưới đây là đọc từ file và sau đó sắp xếp theo tên:
public void sapXep(){
try {
hs = new ArrayList<HOCSINH>();
// bắt đầu đọc danh sách từ file
FileInputStream fin = new FileInputStream("hocsinh.txt");
// định nghĩa fin đọc từ file hocsinh.txt
ObjectInputStream fout = new ObjectInputStream(fin);
hs = (ArrayList)fout.readObject(); // đang đọc
//Sắp xếp theo họ tên và in ra
Collections.sort(hs, new Comparator<HOCSINH>() {
@Override
public int compare(HOCSINH s1, HOCSINH s2) {
return (s1.getHoTen().compareTo(s2.getHoTen()));
}
});
FileOutputStream f = new FileOutputStream("hocsinh.txt");
ObjectOutputStream obj = new ObjectOutputStream(f);
obj.flush();
obj.writeObject(hs); // Ghi vào arraylist hs
obj.close(); // đóng file
f.close(); // đóng object
System.out.printf("\n%20s%15s%20s\n", "Họ tên", "Lớp", "Mã HS");
for(HOCSINH x:hs) {
x.xuat();
}
fin.close();
fout.close();// đóng lại
}
catch (FileNotFoundException fn) {
System.out.print("\nKhông tìm thấy file");
}
catch (Exception ex) {
ex.printStackTrace();
// in ra ngoại lệ
}
}

 d, Xoá phần tử và cập nhật vào file

Ví dụ, bạn muốn xoá một học sinh khỏi ArrayList và sau đó cập nhật lại vào file.
Code xoá và tự cập nhật vào file như sau:
public void xoa(){
         try {
hs = new ArrayList<HOCSINH>();
// bắt đầu đọc danh sách từ file
FileInputStream fin = new FileInputStream("hocsinh.txt");
// định nghĩa fin đọc từ file hocsinh.txt
ObjectInputStream fout = new ObjectInputStream(fin);
hs = (ArrayList)fout.readObject(); // đang đọc
//Xoá sau đó cập nhật lại
System.out.print("\nNhập vào mã SV muốn xoá: ");
int ma;
Scanner sc = new Scanner(System.in);
ma = sc.nextInt();
for(int i = 0; i<hs.size(); i++) {
if(ma == hs.get(i).getMaHS()){
hs.remove(hs.get(i));
}
}
System.out.printf("\n%20s%15s%20s\n", "Họ tên", "Lớp", "Mã HS");
for(HOCSINH x:hs) {
x.xuat();
}
// cập nhật lại vào file
FileOutputStream f = new FileOutputStream("hocsinh.txt");
ObjectOutputStream obj = new ObjectOutputStream(f);
obj.flush();
obj.writeObject(hs);
obj.close();
f.close();
fin.close();
fout.close();// đóng lại
}
catch (FileNotFoundException fn) {
System.out.print("\nKhông tìm thấy file");
}
catch (Exception ex) {
ex.printStackTrace();
// in ra ngoại lệ
}
}

e, Làm file rỗng

Ví dụ, mình muốn cập nhật lại file, tức là biến file đó thành rỗng chứ không phải xoá đi.
Thêm dòng lệnh sau vào:
new FileOutputStream("hocsinh.txt").close();
 hoặc cũng có thể dùng:
new FileWriter("hocsinh.txt", false).close();

hocsinh.txt có thể thay bằng tên file của bạn.
f, kiểm tra file có tồn tại?
Trong lúc mở file có lệnh try catch với FileNotFoundException để check xem file tồn tại không, nhưng ngoài ra, có một cách dễ hơn là dùng cấu trúc như sau:
public void checkFile(){
File f = new File("hocsinh.txt");
if(f.exists() && !f.isDirectory()) {
System.out.print("Tìm thấy file!");
}
else {
System.out.print("Không tìm thấy file!");
}
}
 Ở hình trên, file tồn tại nên trả về trường hợp "Tìm thấy file!"

Tải Source Code của phần I tại đây: