CodeGym /Các khóa học /JAVA 25 SELF /Làm quen với tệp và hình ảnh

Làm quen với tệp và hình ảnh

JAVA 25 SELF
Mức độ , Bài học
Có sẵn

1. Giới thiệu

Trong lập trình, hầu như lúc nào bạn cũng phải làm việc với tệp. Ví dụ ai cũng quen thuộc: lưu văn bản ghi chú, tiến độ trong trò chơi, sao chép một bức ảnh hoặc đọc thiết lập từ tệp cấu hình.

Trong Java có những công cụ hiện đại và tiện dụng: PathFiles thuộc gói java.nio.file. Chúng cho phép bạn chỉ với vài dòng mã mở tệp, đọc nội dung của nó, ghi văn bản hoặc thậm chí sao chép một hình ảnh.

Đường dẫn tới tệp (Path)

Một tệp luôn nằm đâu đó trên đĩa, và để truy cập nó bạn cần chỉ ra đường dẫn. Trong Java, có lớp Path cho việc này, và bạn có thể tạo đối tượng mới bằng phương thức Path.of().

Path path = Path.of("hello.txt"); // đường dẫn tương đối
Path absPath = Path.of("C:/Users/Me/image.png"); // đường dẫn tuyệt đối (Windows)

Giải thích:

  • Đường dẫn tương đối sẽ tìm tệp trong thư mục hiện tại của dự án (ví dụ, "hello.txt").
  • Đường dẫn tuyệt đối chỉ ra địa chỉ đầy đủ: ổ đĩa, các thư mục và tên tệp.

2. Làm việc với tệp văn bản

Theo quan điểm của Java, mọi tệp được chia thành 2 loại — văn bản và nhị phân. Nếu nội dung có thể được biểu diễn như văn bản mà con người đọc được — đó là tệp văn bản. Trong các trường hợp khác — đó chỉ là một tập hợp byte (tệp nhị phân).

Ghi văn bản vào tệp — writeString

Để ghi một chuỗi vào tệp, dùng phương thức writeString.

Path p = Path.of("hello.txt");
Files.writeString(p, "Xin chào, tệp!");

Điều gì đã xảy ra ở đây:

  1. tạo đối tượng Path trỏ đến "hello.txt";
  2. dùng phương thức writeString để ghi chuỗi vào đó;
  3. nếu tệp chưa tồn tại, nó sẽ được tạo tự động.

Bằng cách này bạn có thể dễ dàng lưu ghi chú hoặc thông điệp vào tệp văn bản.

Đọc văn bản từ tệp — readString

Phương thức readString cho phép tải toàn bộ tệp vào một chuỗi ngay lập tức.

Path p = Path.of("hello.txt");
String content = Files.readString(p);
System.out.println(content);

Bây giờ biến content chứa nội dung của tệp. Cách này tiện cho các tệp nhỏ: cấu hình, văn bản, tài liệu JSON.

3. Làm việc với tệp nhị phân

Không phải mọi tệp đều là văn bản. Hình ảnh, nhạc, tệp nén — đó là các tập hợp byte. Để làm việc với chúng có các phương thức writereadAllBytes.

Ghi byte vào tệp — write

Phương thức write() cho phép ghi vào tệp một mảng byte. Nó còn được gọi là bộ đệm (byte buffer).

byte[] data = {65, 66, 67, 68}; // các ký tự A B C D
Files.write(Path.of("letters.bin"), data);

Ở đây chúng ta đã ghi một mảng byte vào tệp. Nếu mở tệp như văn bản, bên trong sẽ là các chữ cái "ABCD".

Đọc byte — readAllBytes

Để lấy lại nội dung tệp dưới dạng mảng byte, sử dụng phương thức readAllBytes.

byte[] buffer = Files.readAllBytes(Path.of("letters.bin"));

// in mảng byte đã đọc ra màn hình
for (byte b : buffer) 
{
    System.out.print((char)b + " ");
}

Trên màn hình sẽ xuất hiện:

A B C D

Cách này được dùng để làm việc với mọi tệp nhị phân — hình ảnh, tài liệu, nhạc.

4. Các kịch bản phổ biến khi làm việc với tệp

Kịch bản phổ biến nhất khi làm với tệp có lẽ là sao chép tệp.

Sao chép tệp

Để sao chép một tệp, bạn có thể đơn giản đọc nó thành mảng byte rồi ghi ra tệp khác.

Path in = Path.of("logo.png");
Path out = Path.of("logo_copy.png");

byte[] bytes = Files.readAllBytes(in);
Files.write(out, bytes);

Bằng cách này bạn có thể sao chép ảnh, tài liệu và bất kỳ tệp nào khác mà không cần quan tâm đến định dạng của chúng.

Kiểm tra sự tồn tại và kích thước

Đôi khi bạn cần chắc chắn rằng tệp tồn tại và biết kích thước của nó. Có các phương thức existssize để làm việc này.

Path p = Path.of("hello.txt");
if (Files.exists(p)) 
{
    long size = Files.size(p);
    System.out.println("Tệp được tìm thấy, kích thước: " + size + " byte");
} 
else 
{
    System.out.println("Không tìm thấy tệp!");
}

Điều này hữu ích cho việc chẩn đoán: bạn sẽ biết chắc mình đang làm việc với đúng tệp hay không.

5. Ngoại lệ

Làm việc với tệp có thể gặp lỗi: không có tệp, không có quyền truy cập, đĩa đầy hoặc tệp đang bị chương trình khác sử dụng. Vì vậy bạn nên bao bọc thao tác với đĩa bằng try-catch, hoặc ném ngoại lệ ra ngoài bằng từ khóa throws.

try 
{
    String content = Files.readString(Path.of("hello.txt"));
    System.out.println(content);
} 
catch (IOException e) 
{
    System.out.println("Lỗi khi đọc: " + e.getMessage());
}

Như vậy, chương trình sẽ không “sập” mà thông báo gọn gàng cho người dùng biết điều gì đã xảy ra. Nếu cần, bạn có thể ném tiếp ngoại lệ IOException lên trên ngăn xếp lời gọi bằng phương thức với từ khóa throws.

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION