Hotline: 0919 365 363; Email: daotao@r2s.edu.vn

Blog

Đọc và ghi file trong java: Hướng dẫn A-Z

Đọc và ghi file trong java
Kiến thức hữu ích

Đọc và ghi file trong java: Hướng dẫn A-Z

Đọc và ghi file trong java là một hoạt động không còn xa lạ mà khi học, làm lập trình bạn cần biết.

Vậy đọc, ghi file chính xác là gì? Có những loại dữ liệu nào được cho phép? Hãy cùng tìm hiểu trong bài viết bên dưới của R2S nhé!

Đọc và ghi file trong java là gì? 

Đọc và ghi file trong java
Đọc và ghi file là gì? 

Trong Java, đọc và ghi dữ liệu đều là các hoạt động nhập/xuất dữ liệu, bao gồm các việc sau:

  • 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 hoặc ghi ra máy in.

Các hoạt động này đều được gọi là luồng (stream) trong Java.

Đọc và ghi file trong java là gì? 

Các loại luồng dữ liệu trong Java

Hiện nay, có 2 loại luồng dữ liệu chính mà bạn cần biết, bao gồm:

Các loại luồng dữ liệu trong Java
Các loại luồng dữ liệu trong Java

Kiến trúc cơ bản của Input Stream (Luồng nhập dữ liệu)

Kiến trúc cơ bản của Input Stream
Kiến trúc cơ bản của Input Stream

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

Kiến trúc cơ bản của Input Stream
Kiến trúc cơ bản của Input Stream

Hướng dẫn cách thao tác xử lý đọc và ghi file trong java

Quy trình cơ bản sẽ gồm 4 bước chính:

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

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

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

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

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

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

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

Trong đó, một số phương thức xử lý dữ liệu nhị phân của class DataOutputStream như sau:

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

Ví dụ minh họa về đọc và ghi file

Ví dụ 1: Hãy 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ụ thứ 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: Thực hiện đọc và ghi file trong Java kiểu object

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

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;
 }
}

Quy trình 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);
 }
 }
}

Quy trình 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);
 }
 }
}

Xử lý nhập xuất dữ liệu bằng luồng character

Luồng byte là một công cụ mạnh mẽ và linh hoạt trong Java. Tuy nhiên, nếu bạn muốn lưu trữ các file chứa văn bản Unicode, thì luồng character sẽ là lựa chọn tối ưu nhất. 

Với ưu điểm thao tác trực tiếp với 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ụ minh họa đọc và ghi file trong java

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);
  }
 }
}

Một số bài tập thực hành

Sau khi hiểu được nhứng lý thuyết và cú pháp trên, bạn có thể thực hành tạo package tên file và thực hiện các yêu cầu như sau:

Bài thực hành số 1

Yêu cầu tạo một lớp NhanVien với các thuộc tính là mã nhân viên, họ tên, tuổi và lương. Đồng thời, cần viết setter, getter, constructor và toString cho lớp này. 

Tiếp theo, cần 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, sau đó sử dụng FileWriter để ghi thông tin vào file nhanvien.txt. 

Cuối cùng, cần 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 

Yêu cầu tạo một lớp mới và thực hiện các xử lý là viết phương thức để tạo một mảng gồm 3 đối tượng nhân viên. Sau đó tiến hành nhập thông tin cho các nhân viên và sử dụng ObjectOutputStream để ghi mảng đối tượng nhân viên vào file nhanvien.bin. 

Cuối cùng, cần viết phương thức để đọc file nhanvien.bin và in mảng nhân viên ra màn hình.

Kết luận

Trong Java, việc đọc và ghi file là một phần quan trọng của chương trình. Để thực hiện việc này, bạn cần phải biết sử dụng các luồng byte, luồng character cho phù hợp với từng loại dữ liệu.

R2S chúc bạn học và thực hành phần này thật vui và hiệu quả!

Bài viết gốc được đăng tại: giasutinhoc.vn

Alert: You are not allowed to copy content or view source !!