Đọc, Ghi đối Tượng Vào File Trong Java - Doan Luan's Blog

Java cung cấp cho bạn khả năng ghi toàn bộ đối tượng xuống một tập tin (đối tượng có thể đang ở trong một trạng thái nào đó). Sau đó bạn có thể đem tập tin chứa đối tượng đi khắp nơi nếu cần thì khôi phục đối tượng về trạng thái ban đầu, đưa đối tượng vào bộ nhớ sử dụng y như tình trạng trước khi nó được lưu xuống đĩa. Các đối tượng có khả năng này gọi là tuần tự hóa (serialzable). Lý do có thuật ngữ trên xuất phát từ việc lưu đối tượng trên đĩa, dữ liệu lưu trên tập tin là loại dữ liệu tuần tự. Đối tượng trong bộ nhớ có thể quan hệ chằng chịt với nhau nhưng khi được ghi xuống tập tin thì bắt buộc phải trải phẳng đối tượng theo thứ tự.

Trong Java đối tượng muốn có khả năng ghi và lưu dữ liệu thành tập tin phải cài đặt giao tiếp (interface) java.io.Serializable.Lớp giao tiếp này chỉ là một lớp rỗng thực hiện chức năng đánh dấu khả năng tuần tự hóa của đối tượng mà thôi. Việc đọc ghi các đối tượng không phải lúc nào cũng đơn giản, có những đối tượng bao hàm cả các đối tượng khác thì sao? Bạn không cần phải lo điều đó.Một khi đối tượng đã có khả năng tuần tự hóa và yêu cầu Java in thành tập tin, Java sẽ “túm” lấy tất cả các đối tượng con chứa bên trong đối tượng cần lưu đưa luôn xuống đĩa. Quá trình khôi phục đối tượng luôn bảo đảm rằng trạng thái và nội dung của đối tượng trước khi lưu được khôi phục nguyên vẹn. Đối tượng có thể trở về hoạt động bình thường sau khi khôi phục.

Dưới đây là ví dụ

Ta có lớp HocSinh

import java.io.Serializable; public class HocSinh implements Serializable { private String mahs; private int tenhs; private float diem; private String ghichu; //Các hàm getter và setter public String getMaHS() { return mahs; } public void setMaHS(String maHS) { this.mahs = maHS; } public String getTenHS() { return tenhs; } public void setTenHS(String tenHS) { this.tenhs = tenHS; } public String getDiem() { return diem; } public void setDiem(String Diem) { this.diem = Diem; } public String getGhiChu() { return ghichu; } public void setGhiChu(String ghiChu) { this.ghichu = ghiChu; } // Phương thức khởi tạo không có tham số public HocSinh() { this("", "", 0, ""); } // Phương thức khởi tạo có tham số public void HocSinh(String maHS, String tenHS, float Diem, String ghiChu) { this.mahs = maHS; this.tenhs = tenHS; this.diem = Diem; this.ghichu = ghiChu; } }

Lớp XuLyFile như sau:

import java.io.*; public class XuLyFile{ //Dùng DataOutputStream để ghi File public void saveToFilebyData(HocSinh[] hocsinh,String filename) { DataOutputStream dos = null; try { dos = new DataOutputStream( new FileOutputStream(filename)); dos.writeInt(hocsinh.length); for (HocSinh hs : hocsinh) {// Duyệt 1 mảng đối tượng dos.writeUTF(hs.getMaHS()); dos.writeUTF(hs.getTenHS()); dos.writeFloat(hs.getDiem()); dos.writeUTF(hs.getGhiChu()); } dos.close(); } catch (IOException e) { e.printStackTrace(); } } //Dùng DataInputStream để đọc File public HocSinh[] loadFromFilebyData(String filename) { HocSinh[] hocsinh = null; DataInputStream dis = null; try { dis = new DataInputStream( new FileInputStream(filename)); int count = dis.readInt(); emps = new HocSinh[count]; for (int i = 0; i < count; i++) { String mahs = dis.readUTF(); String tenhs = dis.readUTF(); Float diem = dis.readFloat(); String ghichu = dis.readUTF(); hocsinh[i] = new HocSinh(mahs, tenhs, diem, ghichu); } dis.close(); } catch (IOException e) { e.printStackTrace(); } return hocsinh; } // Lưu theo kiểu đối tượng public void saveToFilebyObject(HocSinh[] hocsinh,String filename) { try { ObjectOutputStream oos = new ObjectOutputStream( new FileOutputStream(filename)); oos.writeInt(hocsinh.length); for (int i = 0; i < hocsinh.length; i++) { oos.writeObject(hocsinh[i]); } oos.close(); } catch (IOException ex) { ex.printStackTrace(); } } // Đọc theo kiểu đối tượng public HocSinh[] loadFromFilebyObject(String filename) { HocSinh[] hocsinh = null; try { ObjectInputStream ois = new ObjectInputStream( new FileInputStream(filename)); int count = ois.readInt(); hocsinh = new HocSinh[count]; for (int i = 0; i < count; i++) { hocsinh[i] = (HocSinh) ois.readObject(); } ois.close(); } catch (IOException ex) { ex.printStackTrace(); } catch (ClassNotFoundException ex) { ex.printStackTrace(); // Bắt lỗi hocsinh[i] = (HocSinh)ois.readObject(); } return hocsinh; } //Dùng PrintWriter để ghi vào File public void saveToFilebyPrint(HocSinh[] hocsinh, String filename) { try { PrintWriter pw = new PrintWriter(filename); pw.println(hocsinh.length); for (HocSinh hs : hocsinh) { pw.println(hs.getMaHS() + "\t" + hs.getTenHS() + "\t" + e.getDiem() + "\t" + e.getGhiChu() + "\t"); } pw.close(); } catch (FileNotFoundException ex) { ex.printStackTrace(); } } //Dùng BufferedReader để đọc từ file public HocSinh[] loadFromFilebyBuffer(String filename) { HocSinh[] hocsinh = null; try { BufferedReader br = new BufferedReader( new FileReader(filename)); int count = Integer.parseInt(br.readLine()); hocsinh = new HocSinh[count]; for (int i = 0; i < count; i++) { String[] tempHS = br.readLine().split("\t"); //đọc 1 dòng, gặp ký tự '\t' thì cắt xâu, tạo thành 1 mảng xâu hocsinh[i] = new HocSinh(tempHS[0], tempHS[1],Float.parseFloat(tempHS[2]), tempHS[3]); } br.close(); } catch (IOException ex) { ex.printStackTrace(); } return hocsinh; } }

Lớp Main để chạy chương trình như sau:

public class Main { public static void main(String[] args) { HocSinh[] hocsinh = new HocSinh[3]; hocsinh[0] = new HocSinh("HS01", "Tran Anh Duy", 5, "hoc luc trung binh"); hocsinh[1] = new HocSinh("HS02", "Pham Van Khai", 7, "hoc luc kha"); hocsinh[2] = new HocSinh("HS03", "Le Phuoc Tho", 9, "hoc luc gioi"); //Ghi vào File XuLyFile xuly = new XuLyFile(); xuly.saveToFilebyData(hocsinh,"HocSinhData.txt"); xuly.saveToFilebyObject(hocsinh,"HocSinhObject.txt"); xuly.saveToFilebyPrint(hocsinh,"HocSinhBuffer.txt"); //Đọc từ File HocSinh[] hsLoad = null; hsLoad = xuly.loadFromFilebyData("HocSinhData.txt"); for (HocSinh hs : hsLoad) { // Duyệt mảng đối tượng System.out.println(hs.getMaHS() + " , " + hs.getTenHS() + " , " + hs.getDiem() + " , " + hs.getGhiChu()); } System.out.println("---------------------"); hsLoad = xuly.loadFromFilebyObject("HocSinhObject.TXT"); for (HocSinh hs : hsLoad) { System.out.println(hs.getMaHS() + " , " + hs.getTenHS() + " , " + hs.getDiem() + " , " + hs.getGhiChu()); } System.out.println("---------------------"); hsLoad = xuly.loadFromFilebyBuffer("HocSinhBuffer.TXT"); for (HocSinh hs : hsLoad) { System.out.println(hs.getMaHS() + " , " + hs.getTenHS() + " , " + hs.getDiem() + " , " + hs.getGhiChu()); } } }

Share this:

  • X
  • Facebook
Like Loading...

Related

Từ khóa » Ghi đối Tượng Ra File Trong Java