Luồng (Streams) trong Java

1. Khái niệm luồng

Tất cả những     hoạt động  nhập/xuất  dữ  liệu (nhập dữ  liệu  từ bàn phím,    lấy dữ  liệu  từ  mạng về,   ghi  dữ  liệu  ra  đĩa, xuất  dữ liệu ra màn hình, máy in, …) đều được quy về một khái niệm gọi là luồng   (stream). Luồng là nơi có thể   “sản xuất”  và “tiêu thụ” thông tin. Luồng thường được hệ thống xuất nhập trong java gắn     kết       với       một      thiết     bị         vật lý. Tất  cả     các luồng đều có chung một nguyên tắc hoạt động ngay cả khi chúng được gắn kết với      các       thiết     bị         vật       lý khác nhau. Vìvậy cùng  một      lớp, phương thức xuất nhập có thể dùng chung cho các thiết bị vật lý khác nhau. Chẳng hạn cùng một phương thức có thể dùng để ghi dữ liệu ra console, đồng thời cũng có thể dùng để ghi dữ liệu xuống một file trên đĩa. Java hiện thực luồng bằng tập hợp các lớp phân cấp trong gói java.io.

Java định nghĩa hai kiểu luồ ng: byte và ký tự (phiên bản gốc chỉ     định     nghĩa    kiểu     luồng   byte, và sau          đó   luồng  ký     tự        được thêm vào trong các phiên bản về sau).

Luồng byte (hay luồ ng dựa trên byte) hỗ trợ việc xuất nhập dữ liệu trên byte, thường được dùng khi đọc ghi dữ liệu nhị phân.

Luồng ký tự được thiết kế hỗ trợ việc xuất nhập dữ liệu kiểu ký tự (Unicode). Trong một vài trường hợp luồ ng ký tự sử dụng hiệu quả hơn luồ ng byte, nhưng ở mức hệ thống thì tất cả những xuất nhập đều phải qui về byte. Luồng ký tự hỗ trợ hiệu quả chỉ đối với việc quản lý, xử lý các ký tự.

2. Luồng byte (Byte Streams)

Các luồng byte được định nghĩa dùng hai lớp phân cấp. Mức trên cùng là hai lớp trừu tượng InputStream và OutputStream. InputStream định nghĩa những đặc điểm chung cho những luồng nhập byte. OutputStream mô tả cách xử lý của các luồng xuất byte.

Các lớp con dẫn xuất từ hai lớp InputStream và OutputStream sẽ hỗ trợ     chi       tiết       tương   ứng      với  việc      đọc     ghi   dữ liệu trên những thiết bị khác nhau. Đừng choáng ngợp với hàng lo ạt rất nhiều các lớp khác nhau. Đừng quá lo lắng, mỗi khi bạn nắm vững, sử dụng thành thạo một luồ ng byte nào đó thì bạn dễ dàng làm việc với những luồng còn lại.

3. Luồng ký tự (Character Streams)

Các luồng ký tự được định nghĩa dùng hai lớp phân cấp. Mức trên cùng là hai lớp trừu tượng Reader và Writer. Lớp Reader dùng cho việc nhập dữ liệu của luồng, lớp Writer dùng cho việc xuất dữ liệu cua luồ ng. Những lớp dẫn xuất từ Reader và Writer thao tác trên các luồng ký tự Unicode.

4. Những luồng được định nghĩa trước (The Predefined Streams)

Tất cả các chương trình viết bằng java luôn tự động import gói java.lang. Gói này có định nghĩa lớp System, bao gồm một số đặc điểm của môi trường run-time, nó có ba biến luồ ng được định nghĩa trước là in, out và err, các biến này là các fields được khai báo static trong lớp System.

  • out: luồng xuất chuẩn, mặc định là console. System.out là một đối tượng kiểu PrintStream.
  • in: luồng nhập chuẩn, mặc định là bàn phím. System.in là một đối tượng kiểu InputStream.
  • err: luồ ng lỗi chuẩn, mặc định cũng là console. System.out cũng là một đối tượng kiểu PrintStream giống System.out.