Nếu file CSV được lưu và đọc không đúng định dạng (như toàn tiếng Trung) hoặc gặp phải các vấn đề về mã hóa ký tự, có thể là do encoding không đúng khi ghi và đọc file. Để đảm bảo dữ liệu được ghi và đọc chính xác, bạn có thể chỉ định rõ mã hóa khi tạo FileWriter
và Scanner
.
Dưới đây là cách sửa đổi mã nguồn để sử dụng mã hóa UTF-8:
Cập nhật mã nguồn với mã hóa UTF-8
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
class DongVat {
private String ten; // Tên động vật
private double canNang; // Cân nặng
private double chieuCao; // Chiều cao
// Constructor
public DongVat(String ten, double canNang, double chieuCao) {
this.ten = ten;
this.canNang = canNang;
this.chieuCao = chieuCao;
}
// Getter cho tên động vật
public String getTen() {
return ten;
}
// Getter cho cân nặng
public double getCanNang() {
return canNang;
}
// Getter cho chiều cao
public double getChieuCao() {
return chieuCao;
}
@Override
public String toString() {
return ten + ", " + canNang + " kg, " + chieuCao + " m";
}
}
public class HocFile {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
List<DongVat> danhSachDongVat = new ArrayList<>();
// Đọc và khởi tạo đối tượng từ file CSV nếu có
danhSachDongVat = readDongVatFromCSV();
// Hiển thị danh sách động vật đã nạp
System.out.println("Danh sách động vật đã nạp từ file CSV:");
for (DongVat dv : danhSachDongVat) {
System.out.println(dv);
}
System.out.print("Nhập số lượng động vật mới: ");
int soLuong = scanner.nextInt();
scanner.nextLine(); // Xóa bỏ newline
for (int i = 0; i < soLuong; i++) {
System.out.print("Nhập tên động vật thứ " + (i + 1) + ": ");
String ten = scanner.nextLine();
double canNang = 0;
while (true) {
try {
System.out.print("Nhập cân nặng (kg) cho " + ten + ": ");
canNang = Double.parseDouble(scanner.nextLine());
break;
} catch (NumberFormatException e) {
System.out.println("Cân nặng không hợp lệ. Vui lòng nhập lại.");
}
}
double chieuCao = 0;
while (true) {
try {
System.out.print("Nhập chiều cao (m) cho " + ten + ": ");
chieuCao = Double.parseDouble(scanner.nextLine());
break;
} catch (NumberFormatException e) {
System.out.println("Chiều cao không hợp lệ. Vui lòng nhập lại.");
}
}
// Thêm động vật mới vào danh sách
danhSachDongVat.add(new DongVat(ten, canNang, chieuCao));
}
// Ghi thông tin động vật vào file CSV
saveDongVatToCSV(danhSachDongVat);
scanner.close();
}
public static void saveDongVatToCSV(List<DongVat> danhSachDongVat) {
String userHome = System.getProperty("user.home");
String desktopPath = userHome + File.separator + "Desktop";
File csvFile = new File(desktopPath, "input.csv");
try {
if (csvFile.createNewFile()) {
System.out.println("Tạo mới file input.csv.");
} else {
System.out.println("File input.csv đã tồn tại.");
}
} catch (IOException e) {
e.printStackTrace();
return;
}
// Ghi thông tin động vật vào file CSV với mã hóa UTF-8
try (Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(csvFile), StandardCharsets.UTF_8))) {
writer.write("Tên, Cân nặng (kg), Chiều cao (m)\n");
for (DongVat dv : danhSachDongVat) {
writer.write(dv.getTen() + ", " + dv.getCanNang() + ", " + dv.getChieuCao() + "\n");
}
System.out.println("Ghi vào file thành công.");
} catch (IOException e) {
e.printStackTrace();
}
}
public static List<DongVat> readDongVatFromCSV() {
List<DongVat> danhSachDongVat = new ArrayList<>();
String userHome = System.getProperty("user.home");
String desktopPath = userHome + File.separator + "Desktop";
File csvFile = new File(desktopPath, "input.csv");
// Kiểm tra xem file có tồn tại và đọc dữ liệu
if (!csvFile.exists()) {
System.out.println("File input.csv không tồn tại.");
return danhSachDongVat; // Trả về danh sách rỗng nếu không có file
}
// Đọc file CSV với mã hóa UTF-8
try (Scanner fileScanner = new Scanner(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8))) {
// Bỏ qua tiêu đề
if (fileScanner.hasNextLine()) {
fileScanner.nextLine();
}
while (fileScanner.hasNextLine()) {
String line = fileScanner.nextLine();
String[] data = line.split(", ");
if (data.length == 3) {
String ten = data[0];
double canNang = Double.parseDouble(data[1]);
double chieuCao = Double.parseDouble(data[2]);
danhSachDongVat.add(new DongVat(ten, canNang, chieuCao));
}
}
} catch (IOException e) {
e.printStackTrace();
}
return danhSachDongVat; // Trả về danh sách động vật đã nạp
}
}
Giải thích các thay đổi
- Ghi file với mã hóa UTF-8:
- Sử dụng
OutputStreamWriter
kết hợp vớiFileOutputStream
và chỉ định mã hóaStandardCharsets.UTF_8
để ghi file. Điều này giúp đảm bảo rằng tất cả các ký tự (bao gồm cả tiếng Việt) được ghi đúng định dạng.
- Đọc file với mã hóa UTF-8:
- Sử dụng
InputStreamReader
kết hợp vớiFileInputStream
và chỉ định mã hóaStandardCharsets.UTF_8
để đọc file. Điều này đảm bảo rằng dữ liệu được đọc chính xác mà không bị lỗi mã hóa.
Kết luận
Với những thay đổi này, bạn sẽ không gặp phải vấn đề về mã hóa khi lưu và đọc dữ liệu từ file CSV. Nếu vẫn gặp lỗi hoặc có câu hỏi nào khác, hãy cho tôi biết!