serialization

- Đặt 1 tình huống thực tế: khi ta muốn quản lý 1 danh sách sinh viên, tất nhiên sẽ là 1 dãy rất nhiều đối tượng, mỗi đối tượng sinh viên lại có nhiều thuộc tính: tên, tuổi, điểm, .v..v.. và chúng ta cần lưu toàn bộ thông tin này vào file, ngoài ra còn phải xử lý, chỉnh sửa thông tin nếu cần. Như vậy, nếu sử dụng kiến thức ở những bài trước làm điều này thì là rất khó khăn. Nhưng với phần kiến thức ở bài này thì điều đó lại trở lên cực kỳ dễ dàng. Cụ thể ở bài tập giống như tình huống giả thiết trên, chúng ta sẽ sử dụng kiểu đọc ghi object để thao thác, lưu trữ từng đối tượng lên file!

- Mình sẽ viết 2 ví dụ cụ thể, với các mức độ khác nhau,từ đơn giản nhất. Nếu bạn thấy khó hiểu chỗ nào có thể bình luận phía dưới. Mọi người cùng trao đổi.

**Chú ý: Để đọc ghi theo Object trong Java thì tại class Object đó ta cần đặt giao tiếp java.io.Serializable (implements Serializable)

Ví dụ 1: Đọc ghi 1 đối tượng lên file theo từng object:
- Khai báo 1 class SinhVien gồm 2 thuộc tính họ tên, tuổi. Tạo 1 đối tượng cụ thể sinh viên a sau đó
gán thông tin cho sinh viên a rồi ghi đối tượng a này xuống file "E:\\sinhvien.dat"
- Mở file trên ra. Đọc file đó theo kiểu object để lấy đối tượng đó ra, (cần ép kiểu về kiểu dữ liệu của đối tượng), rồi gán nó vào đối tượng a1. In ra màn hình thông tin đối tượng a1. Code như sau:

PHP:
package javaandroidvn;
 
import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;

class 
SinhVien implements Serializable {
    public 
String hoTen;
    public 
int tuoi;
}

public class 
JavaAndroidVn {

    public static 
void main(String[] argsthrows IOException {
        
SinhVien a = new SinhVien();
        
a.hoTen "Vũ Văn Tường";
        
a.tuoi 21;

        try {
            
FileOutputStream f = new FileOutputStream("E:\\sinhvien.dat");
            
ObjectOutputStream oOT = new ObjectOutputStream(f); // Sử dụng để ghi file theo từng Object
            
oOT.writeObject(a); // Ghi  Object là đối tượng a xuống file
            
oOT.close();
            
f.close();
        } catch (
IOException e) {
            
System.out.println("Có lỗi xảy ra!");
        }

        
SinhVien a1 = new SinhVien(); //Tạo đối tượng a1 mới, để phía dưới gán bằng đối tượng ta lấy được ra từ file

        
try {
            
FileInputStream f = new FileInputStream("E:\\sinhvien.dat");
            
ObjectInputStream oIT = new ObjectInputStream(f); // Sử dụng để đọc file theo từng Object
            
a1 = (SinhVienoIT.readObject(); //Đọc Object đầu tiên ép kiểu về kiểu SinhVien sau đó gán bằng đối tượng a1
            
oIT.close();
            
f.close();
        } catch (
IOException io) {
            
System.out.println("Có lỗi xảy ra!");
        } catch (
ClassNotFoundException ex) {
            
System.out.println("Không tìm thấy class");
        }
    
        
System.out.println("Thông tin sinh vien a1 đọc ra là: \nTên: "+a1.hoTen+"\nTuổi: "+a1.tuoi);
    }
}
Ví dụ 2: Đọc ghi 2 đối tượng lên file theo từng object. Các thuộc tính bài này để private:
(Qua ví dụ này, và kết hợp bài sau, mình sẽ giới thiệu cách đọc ghi 1 danh sách các đối tượng lên file, giúp việc quản lý danh sách các đối tượng dễ dàng hơn!)
PHP:
package javaandroidvn;
 
import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;

class 
SinhVien implements Serializable {

    private 
String hoTen;
    private 
int tuoi;

    public 
String getHoTen() {
        return 
hoTen;
    }

    public 
void setHoTen(String hoTen) {
        
this.hoTen hoTen;
    }

    public 
int getTuoi() {
        return 
tuoi;
    }

    public 
void setTuoi(int tuoi) {
        
this.tuoi tuoi;
    }
}

public class 
JavaAndroidVn {

    public static 
void main(String[] argsthrows IOException {
        
SinhVien a = new SinhVien();
        
a.setHoTen("Vũ Văn T");
        
a.setTuoi(21);
        
SinhVien b = new SinhVien();
        
b.setHoTen("Nguyễn Văn A");
        
b.setTuoi(22);

        try {
            
FileOutputStream f = new FileOutputStream("E:\\sinhvien.dat");
            
ObjectOutputStream oOT = new ObjectOutputStream(f); // Sử dụng để ghi file theo từng Object
            
oOT.writeObject(a); // Ghi  Object là đối tượng a xuống file
            
oOT.writeObject(b);
            
oOT.close();
            
f.close();
        } catch (
IOException e) {
            
System.out.println("Có lỗi xảy ra!");
        }

        
SinhVien a1 = new SinhVien(); //Tạo đối tượng a1 mới, để phía dưới gán bằng đối tượng ta lấy được ra từ file
        
SinhVien b1 = new SinhVien(); //Tạo đối tượng b1 mới, để phía dưới gán bằng đối tượng ta lấy được ra từ file
        
try {
            
FileInputStream f = new FileInputStream("E:\\sinhvien.dat");
            
ObjectInputStream oIT = new ObjectInputStream(f); // Sử dụng để đọc file theo từng Object
            
a1 = (SinhVienoIT.readObject(); //Đọc Object đầu tiên ép kiểu về kiểu SinhVien sau đó gán bằng đối tượng a1
            
b1 = (SinhVienoIT.readObject(); //Đọc Object tiếp theo, ép kiểu về kiểu SinhVien sau đó gán bằng đối tượng b1
            
oIT.close();
            
f.close();
        } catch (
IOException io) {
            
System.out.println("Có lỗi xảy ra!");
        } catch (
ClassNotFoundException ex) {
            
System.out.println("Không tìm thấy class");
        }

        
System.out.println("Thông tin sinh vien a1 đọc ra là: \nTên: " a1.getHoTen() + "\nTuổi: " a1.getTuoi());
        
System.out.println("Thông tin sinh vien b1 đọc ra là: \nTên: " b1.getHoTen() + "\nTuổi: " b1.getTuoi());
    }
}
[IMG]

Bài tập về nhà::D
Class thẻ thư viện có các thuộc tính: mã thẻ, tên sinh viên, số sách mượn. Tạo ra 3 đối tượng thẻ thư viện, gán giá trị nhập vào từ bàn phím. Ghi lại thông tin 3 đối tượng này xuống file theo kiểu object rồi đọc file đó, đọc dữ liệu các đối tượng từ trong file vừa ghi, in ra màn hình!

1 blogger-facebook:

  1. thanks b, bài viết dễ hiểu lắm, cho mình hỏi là đọc đến hết file như thế nào vậy

    ReplyDelete

 
Top