Đọ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ì?
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á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:
Kiến trúc cơ bản của Input Stream (Luồng nhập dữ liệu)
Đọc và ghi file trong java – Kiến trúc cơ bản của Output Stream (Luồng xuất dữ liệu)
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)
Một số phương thức xử lý dữ liệu nhị phân của class DataInputStream
Trong đó, một số phương thức xử lý dữ liệu nhị phân của class DataOutputStream như sau:
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