Đọc và ghi file trong java (Bài 5)

Đọc và ghi file trong java là các hoạt động nhập/xuất dữ liệu (nhập dữ liệu từ bàn phím, đọc dữ liệu từ file, ghi dữ liệu lên màn hình, ghi ra file, ghi ra đĩa, ghi ra máy in…) đều được gọi là luồng (stream).

Đọc và ghi file trong java – Các loại luồng dữ liệu

đọc và ghi file trong java

Đọc và ghi file trong java – Có 2 kiểu luồng trong Java

đọc và ghi file trong java

Đọc và ghi file trong java – Kiến trúc Input Stream (Luồng nhập dữ liệu)

đọc và ghi file trong java

Đọc và ghi file trong java – Kiến trúc Output Stream (Luồng xuất dữ liệu)

đọc và ghi file trong java

đọc và ghi file trong java

Đọc và ghi file trong java – Các thao tác xử lý dữ liệu

  • Bước 1: Tạo đối tượng luồng và liên kết với nguồn dữ liệu.
  • Bước 2: Thao tác dữ liệu (đọc hoặc ghi hoặc cả hai).
  • Bước 3: Đóng luồng.

Xử lý nhập xuất dữ liệu sử dụng luồng byte

Sử dụng luồng byte trong các trường hợp như nhập xuất kiểu dữ liệu nguyên thủy (như kiểu int, float, double, boolean), nhập xuất kiểu dữ liệu kiểu đối tượng (object)

Đọc và ghi dữ liệu nhị phân (binary data)

đọc và ghi file trong java

Một số phương thức xử lý dữ liệu nhị phân của class DataInputStream

đọc và ghi file trong java

Một số phương thức xử lý dữ liệu nhị phân của class DataOutputStream

đọc và ghi file trong java

Ví dụ 1: Ghi dữ liệu vào d:/mydata.bin với DataOutputStream

package file_handling;

import java.io.DataOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 *
 * @author giasutinhoc.vn
 */
public class DataOutputExample {
 public static void main(String[] args) { 
  try {
   //Bước 1: Tạo đối tượng luồng và liên kết nguồn dữ liệu
   FileOutputStream fos = new FileOutputStream("d:/file/mydata.bin");
   DataOutputStream dos = new DataOutputStream(fos);

   //Bước 2: Ghi dữ liệu
   dos.writeInt(100);
   dos.writeDouble(9.5);

   //Bước 3: Đóng luồng
   fos.close();
   dos.close();
   System.out.println("Done!");
  } catch (IOException ex) {
    ex.printStackTrace();
  } 
 }
} 

Ví dụ 2: Đọc dữ liệu chứa trong tập tin d:/mydata.bin với DataInputStream

package file_handling;

import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 *
 * @author giasutinhoc.vn
 */
public class DataInputExample {
 public static void main(String[] args) {
  try {
   //Bước 1: Tạo đối tượng luồng và liên kết nguồn dữ liệu
   FileInputStream fis = new FileInputStream("d:/file/mydata.bin");
   DataInputStream dis = new DataInputStream(fis);

   //Bước 2: Đọc dữ liệu
   int n = dis.readInt(); 
   double m = dis.readDouble();

   //Bước 3: Đóng luồng
   fis.close();
   dis.close();

   //Hiển thị nội dung đọc từ file
   System.out.println("Số nguyên: " + n);
   System.out.println("Số thực: " + m);
  } catch (IOException ex) {
    ex.printStackTrace();
  } 
 }
}

Ví dụ 3: Đọc và ghi dữ liệu kiểu object

Tạo lớp Stock và lớp này phải cài đặt giao diện Serializable

package file;

import java.io.Serializable;

/**
 *
 * @author giasutinhoc.vn
 */
public class Stock implements Serializable{
 private int id;
 private String desc;
 private double price;
 private int quantity;

 public Stock(int id, String desc, double price, int quantity) {
   this.id = id;
   this.desc = desc;
   this.price = price;
   this.quantity = quantity;
 }

 @Override
 public String toString() {
    return id + "-" + desc + "-" + price + "-" + quantity;
 } 
}

Tạo lớp ObjectOutputExample dùng để ghi dữ liệu kiểu object

package file;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

/**
 *
 * @author giasutinhoc.vn
 */
public class ObjectOutputExample {
 public static void main(String[] args) { 
  try {
    //Bước 1: Tạo đối tượng luồng và liên kết nguồn dữ liệu
    FileOutputStream fos = new FileOutputStream("d:/mydata2.bin");
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    //Khai báo mảng
    Stock s[] = {
     new Stock(1, "CD ROM", 100, 2)
    ,new Stock(2, "CPU", 500, 2)
    ,new Stock(3, "HP Scanner", 75, 1)
    };
   //Bước 2: Ghi mảng đối tượng vào file
   oos.writeObject(s);

   //Bước 3: Đóng luồng
   fos.close();
   oos.close();
 } catch (IOException ex) {
   System.out.println("Loi ghi file: "+ex);
 }
 }
}

Tạo lớp ObjectInputExample dùng để đọc dữ liệu kiểu object

package file;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.ObjectInputStream;

/**
 *
 * @author giasutinhoc.vn
 */
public class ObjectInputExample {
 public static void main(String[] args) {  
  try {
    //Bước 1: Tạo đối tượng luồng và liên kết nguồn dữ liệu
    FileInputStream fis = new FileInputStream("d:/mydata2.bin");
    ObjectInputStream ois = new ObjectInputStream(fis);

    //Bước 2: Đọc dữ liệu
    Stock sArr[] = (Stock[]) ois.readObject();
    for(Stock s : sArr){
      System.out.println(s.toString());
    }

    //Bước 3: Đóng luồng
    fis.close();
    ois.close();
  } catch (Exception ex) {
    System.out.println("Loi doc file: "+ex);
 }
 }
}

Đọc và ghi file trong java – Xử lý nhập xuất dữ liệu bằng luồng character

Luồng byte rất mạnh mẽ và linh hoạt. Tuy nhiên nếu bạn muốn lưu trữ file chứa văn bản Unicode thì luồng character là lựa chọn tốt nhất vì ưu điểm của luồng character là nó thao tác trực tiếp trên ký tự Unicode.

Tất cả các luồng character đều được kế thừa từ 2 lớp Reader và Writer

Ví dụ 1: Ghi dữ liệu với FileWriter

package file_handling;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

/**
 *
 * @author giasutinhoc.vn
 */
public class FileWriterExample {
 public static void main(String[] args) {   
   try {
     //Bước 1: Tạo đối tượng luồng và liên kết nguồn dữ liệu
     File f = new File("d:/mydata3.txt");
     FileWriter fw = new FileWriter(f);

     //Bước 2: Ghi dữ liệu
     fw.write("Ghi dữ liệu bằng luồng character");

     //Bước 3: Đóng luồng
     fw.close(); 
   } catch (IOException ex) {
     System.out.println("Loi ghi file: " + ex);
 }
 }
}

Ví dụ 2: Đọc dữ liệu với FileReader

package file_handling;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;

/**
 *
 * @author giasutinhoc.vn
 */
public class FileReaderExample {
 public static void main(String[] args) {   
   try {
     //Bước 1: Tạo đối tượng luồng và liên kết nguồn dữ liệu
     File f = new File("d:/mydata3.txt");
     FileReader fr = new FileReader(f);

     //Bước 2: Đọc dữ liệu
     BufferedReader br = new BufferedReader(fr);
     String line;
     while ((line = br.readLine()) != null){
       System.out.println(line);
     }

     //Bước 3: Đóng luồng
     fr.close();
     br.close(); 
    } catch (Exception ex) {
      System.out.println("Loi doc file: "+ex);
  }
 }
}

Bài tập thực hành đọc và ghi file trong java

Tạo package tên file và thực hiện các yêu cầu bên dưới

Bài thực hành số 1: Tạo lớp NhanVien có các thuộc tính mã nhân viên, họ tên, tuổi và lương.

  • Viết setter, getter, constructor và toString.
  • Viết phương thức cho phép nhập thông tin cho 3 nhân viên từ bàn phím. Sử dụng FileWriter để ghi thông tin vào nhanvien.txt.
  • Viết phương thức để đọc nội dung file nhanvien.txt và in những gì đọc được từ file ra màn hình.

Bài thực hành số 2: Tạo lớp mới và thực hiện các xử lý sau

  • Viết phương thức tạo mảng 3 nhân viên, nhập thông tin cho các nhân viên, sử dụng ObjectOutputStream để ghi mảng đối tượng nhân viên vào file nhanvien.bin
  • Viết phương thức để đọc file nhanvien.bin và in mảng nhân viên ra màn hình.

Xem giáo trình môn lập trình java