[Java IO - Từ tổng quan tới chi tiết] Bài 0 : Giới thiệu

Chào các bạn! Có lẽ đã có quá nhiều những bài viết hướng dẫn các bạn làm việc với file trong Java. Thế nhưng đừng vội bỏ qua chuỗi bài viết này!

Nếu các bạn là những người mới bắt đầu làm quen với Java, hay mới chỉ tìm hiểu Java IO qua những ví dụ rời rạc, thì bài viết này của mình được tạo ra chính bởi mong muốn cho các bạn 1 cái nhìn tổng quan và rồi sau đó đi vào chi tiết nhất có thể, để các bạn có thể dễ hình dung hơn, dễ nắm bắt hơn, cũng như hiểu sâu hơn về Java IO. Từ đó, JavaIO sẽ trở nên thật dễ dàng 😃

Trong bài viết này, chúng ta sẽ cover các API của vào - ra trong Java ( hay Java IO). Chúng ta sẽ học cách để truy cập vào file hay thư mục và làm sao để đọc, ghi file. Chúng ta cũng đi tìm hiểu sâu hơn về từng lớp trong cây phân cấp trong Java IO để hiểu xem chúng làm gì và vì sao nó được sinh ra, nó mang lại ưu và có nhược điểm gì. Bài viết này cũng sẽ cho các bạn thấy cơ chế serialization đối tượng (serialization là gì?), thứ mà sẽ giúp bạn lưu trữ đối tượng một cách thật dễ dàng, dễ như cách mà bạn làm với dữ liệu chữ hay số vậy. Mình cũng cung cấp cho bạn source code demo tương ứng để cho các bạn tiện theo dõi và thực hành.

Trong quá trình đọc series về JavaIO này của mình, nếu có bất cứ thắc mắc gì liên quan, vui lòng liên hệ mình theo các địa chỉ

Đồng thời, nếu có điểm gì sai sót, mong các bạn bớt chút thời gian feedback lại, để bài viết có thể được đầy đủ hơn, hoàn thiện hơn, giúp các mới về sau có được những hướng dẫn đầy đủ, chính xác nhưng lại dễ hiểu nhất có thể nhé. Bởi vì khi viết series này, mình cũng chỉ mới tìm hiểu lại về JavaIO thôi 😄

I. Sơ lược về Java IO.

Java IO (gói java.io) là tập hợp của các lớp và interface mà ta có thể sử dụng để thực hiện hầu như mọi thao tác vào - ra thông qua ứng dụng java.

1. Stream (luồng) là gì?

Trong Java API, một đối tượng từ đó chúng ta đọc được một dãy bytes được gọi là input stream (luồng vào). Một đối tượng để chúng ta có thể ghi một dãy bytes được gọi là output stream (luồng ra). Các nguồn và đích đến của các chuỗi byte này có thể hoặc thường là các file, nhưng chúng cũng có thể là các kết nối mạng (network connection) thậm chí là các khối (block) của bộ nhớ. Các lớp trừu tượng InputStreamOutputStream hình thành cơ sở cho cây phân cấp của các lớp vào ra (IO classes)

Byte-oriented streams (Hay luồng hướng byte / luồng hướng tới việc xử lý dạng byte) là không thuận lợi cho việc xử lý thông tin được lưu dưới dạng Unicode (nhắc lại rằng Unicode sử dụng nhiều bytes cho mỗi một ký tự). Do đó, một cây phân cấp tách biệt cung cấp các lớp cho việc xử lý ký tự Unicode được sinh ra, các lớp này được kế thừa từ các lớp trừu tượng ReaderWriter. Các lớp này có các thao tác đọc ghi được dựa trên đơn vị 2-bytes mã Unicode thay vì dự trên 1 byte ký tự.

2. Cây phân cấp trong JavaIO

Xem chi tiết thêm tại https://docs.oracle.com/javase/7/docs/api/java/io/package-tree.html

Hình 1: Cây phân cấp trong Java IO top-level

Hình 2: Cây phân cấp trong Java IO của byte-oriented stream

Hình 3: Cây phân cấp trong Java IO của character-oriented stream (Cái cuối là PrintWriter nhé. Mình sẽ đổi hình sau)

Series Java IO - Từ tổng quan tới chi tiết bao gồm các bài: