Đọ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ó 2 kiểu luồng trong Java
Kiến trúc Input Stream (Luồng nhập dữ liệu)
Kiến trúc Output Stream (Luồng xuất dữ liệu)
Đọ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)
Một số phương thức xử lý dữ liệu nhị phân của class DataInputStream
Một số phương thức xử lý dữ liệu nhị phân của class DataOutputStream
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);
}
}
}
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);
}
}
}
Đọ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 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.