1. Giới thiệu về Thư mục và Tệp tin
Trong Java, làm việc với thư mục và tệp tin được hỗ trợ bởi lớp File
. Lớp này giúp kiểm tra sự tồn tại, tạo mới, xóa và lấy thông tin về các tệp tin hoặc thư mục.
Ví dụ: Kiểm tra xem một tệp tin tồn tại hay không và tạo mới nếu chưa tồn tại.
import java.io.File;
import java.io.IOException;
public class QuanLyFile {
public static void main(String[] args) {
File file = new File(“sinhvien.txt”);
try {
if (file.exists()) {
System.out.println(“Tệp tin đã tồn tại: ” + file.getAbsolutePath());
} else {
if (file.createNewFile()) {
System.out.println(“Tạo tệp tin mới thành công: ” + file.getAbsolutePath());
} else {
System.out.println(“Không thể tạo tệp tin.”);
}
}
} catch (IOException e) {
System.out.println(“Lỗi khi làm việc với tệp tin: ” + e.getMessage());
}
}
}
2. Xử lý Dữ liệu Đầu vào và Đầu ra
Java cung cấp các lớp như Scanner
, BufferedReader
, và PrintWriter
để xử lý dữ liệu nhập từ bàn phím hoặc xuất ra màn hình/tệp tin.
Ví dụ: Nhập thông tin sinh viên từ bàn phím và lưu vào danh sách.
import java.util.ArrayList;
import java.util.Scanner;
public class QuanLySinhVien {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
ArrayList danhSachSinhVien = new ArrayList<>();
System.out.println(“Nhập số lượng sinh viên: “);
int soLuong = scanner.nextInt();
scanner.nextLine(); // Đọc bỏ dòng trống
for (int i = 0; i < soLuong; i++) {
System.out.println(“Nhập tên sinh viên thứ ” + (i + 1) + “: “);
String tenSinhVien = scanner.nextLine();
danhSachSinhVien.add(tenSinhVien);
}
System.out.println(“Danh sách sinh viên: “);
for (String sv : danhSachSinhVien) {
System.out.println(“- ” + sv);
}
}
}
3. Làm việc với Tệp tin
Sử dụng các lớp FileWriter
và FileReader
, chúng ta có thể ghi và đọc dữ liệu từ tệp tin.
Ví dụ: Ghi danh sách sinh viên vào tệp tin sinhvien.txt
và đọc lại nội dung tệp.
import java.io.*;
import java.util.ArrayList;
public class QuanLyDiem {
public static void main(String[] args) {
ArrayList sinhVien = new ArrayList<>();
sinhVien.add(“SV001 – Nguyễn Văn A – 8.5”);
sinhVien.add(“SV002 – Trần Thị B – 7.0”);
sinhVien.add(“SV003 – Lê Văn C – 9.2”);
// Ghi dữ liệu vào tệp tin
try (FileWriter writer = new FileWriter(“sinhvien.txt”)) {
for (String sv : sinhVien) {
writer.write(sv + “\n”);
}
System.out.println(“Ghi dữ liệu thành công!”);
} catch (IOException e) {
System.out.println(“Lỗi khi ghi tệp tin: ” + e.getMessage());
}
// Đọc dữ liệu từ tệp tin
try (BufferedReader reader = new BufferedReader(new FileReader(“sinhvien.txt”))) {
String line;
System.out.println(“Nội dung tệp tin:”);
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
System.out.println(“Lỗi khi đọc tệp tin: ” + e.getMessage());
}
}
}
4. Xử lí Exception trong Java
Các lỗi như tệp không tồn tại, lỗi đọc/ghi là rất phổ biến. Java cung cấp cơ chế xử lý ngoại lệ (try-catch-finally
) để xử lý các lỗi này.
Ví dụ: Kiểm tra lỗi khi ghi vào tệp.
import java.io.FileWriter;
import java.io.IOException;
public class ExceptionExample {
public static void main(String[] args) {
try (FileWriter writer = new FileWriter(“readonly.txt”)) {
writer.write(“Ghi dữ liệu mẫu.”);
} catch (IOException e) {
System.out.println(“Không thể ghi dữ liệu: ” + e.getMessage());
}
}
}
5. Luồng Dữ liệu
Luồng dữ liệu (Streams) trong Java được chia thành hai loại chính:
- Byte Streams: Làm việc với dữ liệu nhị phân (sử dụng
InputStream
vàOutputStream
). - Character Streams: Làm việc với dữ liệu văn bản (sử dụng
Reader
vàWriter
).
Ví dụ: Sao chép nội dung từ một tệp tin sang tệp khác.
import java.io.*;
public class SaoChepTepTin {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream(“sinhvien.txt”);
FileOutputStream fos = new FileOutputStream(“sinhvien_copy.txt”)) {
int byteData;
while ((byteData = fis.read()) != -1) {
fos.write(byteData);
}
System.out.println(“Sao chép tệp tin thành công!”);
} catch (IOException e) {
System.out.println(“Lỗi sao chép tệp tin: ” + e.getMessage());
}
}
}
CÂU HỎI VÀ BÀI TẬP
1. Lớp File
trong Java được sử dụng để làm gì? Nêu một số phương thức cơ bản của lớp này và cách sử dụng chúng.
2. Giải thích cơ chế xử lý ngoại lệ trong Java. Tại sao việc xử lý ngoại lệ lại quan trọng khi làm việc với tệp tin và luồng dữ liệu?
3. Viết một chương trình Java để thực hiện các chức năng sau:
- Nhập thông tin sinh viên từ bàn phím (bao gồm mã sinh viên, họ tên, điểm trung bình).
- Ghi danh sách sinh viên vào tệp tin
sinhvien.txt
. - Đọc nội dung tệp
sinhvien.txt
và hiển thị danh sách sinh viên ra màn hình.