20 bài thay đổi mindset tư duy người học

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 FileWriterScanner.

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

  1. Ghi file với mã hóa UTF-8:
  • Sử dụng OutputStreamWriter kết hợp với FileOutputStream và chỉ định mã hóa StandardCharsets.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.
  1. Đọc file với mã hóa UTF-8:
  • Sử dụng InputStreamReader kết hợp với FileInputStream và chỉ định mã hóa StandardCharsets.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!

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *