Đọ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
Thiết kế Input Stream (Luồng import dữ liệu)
Thiết kế Output Stream (Luồng xuất dữ liệu)
Đọ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)
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
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.
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.