Đọ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 (import dữ liệu từ keyboard, đọc dữ liệu từ file, ghi dữ liệu lên
màn hình, ghi ra file, ghi ra tô, 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ó 2 kiểu luồng trong Java

đọc và ghi file trong java

Thiết kế Input Stream (Luồng import dữ liệu)

đọc và ghi file trong java

Thiết kế 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 giải quyết dữ liệu

  • Bước 1: Tạo đối tượng luồng và link 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.

Giải quyết 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ư ռhậ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ố mẹo giải quyết dữ liệu nhị phân của class DataInputStream

Một số mẹo giải quyết dữ liệu nhị phân của class DataOutputStream

Chẳng hạn 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à link 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();
  } 
 }
} 

Chẳng hạn 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à link 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 ռ = dis.readInt(); 
   double ɱ = dis.readDouble();
   //Bước 3: Đóng luồng
   fis.close();
   dis.close();
   //Hiển thị bài viết đọc từ file
   System.out.println("Số nguyên: " + ռ);
   System.out.println("Số thực: " + ɱ);
  } catch (IOException ex) {
    ex.printStackTrace();
  } 
 }
}

Chẳng hạn 3: Đọc và ghi dữ liệu kiểu object

Xem Thêm  Java if ... else (Với Ví dụ) - nếu khác nếu khác nếu khác nếu khác java

Tạo lớp Stock và lớp này phải setup 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à link 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à link 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);
 }
 }
}

Giải quyết nhập xuất dữ liệu bằng luồng character

Luồng byte rất khỏe khoắn và linh động. Bên cạnh đó nếu bạn mong 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 thế của luồng character là nó thao tác trực tiếp trên ký tự Unicode.

Xem Thêm  Hướng dẫn cơ bản về kéo và thả JavaScript theo ví dụ - kéo hình ảnh bên trong div javascript

Toàn bộ các luồng character đều được kế thừa từ 2 lớp Reader và Writer

Chẳng hạn 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à link nguồn dữ liệu
     File ƒ = new File("d:/mydata3.txt");
     FileWriter fw = new FileWriter(ƒ);
     //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);
 }
 }
}

Chẳng hạn 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à link nguồn dữ liệu
     File ƒ = new File("d:/mydata3.txt");
     FileReader fr = new FileReader(ƒ);
     //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);
  }
 }
}

Đọc và ghi file trong java – Thực hành

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 tính chất mã nhân sự, họ tên, tuổi và lương.

  • Viết setter, getter, constructor và toString.
  • Viết mẹo cho phép nhập thông tin cho 3 nhân sự từ keyboard. Sử dụng FileWriter để ghi thông tin vào nhanvien.txt.
  • Viết mẹo để đọc bài viết 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 giải quyết sau

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

Viết một bình luận