Java: Character Stream

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Nền tảng Java lưu trữ các giá trị ký tự sử dụng định dạng Unicode. Ký tự dòng I/O sẽ tự động dịch định dạng nội bộ thành và từ các bộ ký tự của địa phương. Đối với miền địa phương Tây, các ký tự nội bộ thường là một tập con của bảng mã ASCII 8-bit.

Đối với hầu hết các ứng dụng, I/O với character stream phức tạp hơn I/O với byte stream. Input và output được thực hiện với các lớp stream tự động dịch thành và từ các bộ ký tự của địa phương. Một chương trình có sử dụng các character stream vị trí của byte stream tự động điều chỉnh thành tập các ký tự địa phương và sẵn sàng cho quốc tế hóa - tất cả mà không cần nhiều nỗ lực từ các lập trình viên.

Nếu quốc tế hóa không phải là một ưu tiên thì ta chỉ có thể sử dụng các lớp character stream mà không cần chú ý nhiều đến các vấn đề về bộ ký tự. Còn nếu quốc tế hóa trở thành một ưu tiên thì chương trình của ta có thể được điều chỉnh mà không cần dung lượng lớn.

Cách dùng Streams Character

Tất cả các lớp character stream có nguồn gốc từ Reader và Writer. Cùng với byte stream, ta có các lớp character stream chuyên về I/O file là FileReader và FileWriter. Ví dụ dưới đây minh họa các lớp này thông qua định nghĩa một lớp có tên CopyCharacters.

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class CopyCharacters {
  public static void main(String[] args) throws IOException {

    FileReader inputStream = null;
    FileWriter outputStream = null;

    try {
      inputStream = new FileReader("input.txt");
      outputStream = new FileWriter("characteroutput.txt");

      int c;
      while ((c = inputStream.read()) != -1) {
        outputStream.write(c);
      }
    } finally {
      if (inputStream != null) {
        inputStream.close();
      }
      if (outputStream != null) {
        outputStream.close();
      }
    }
  }
}

Lớp CopyCharacters rất giống với CopyBytes. Sự khác biệt quan trọng nhất là CopyCharacters sử dụng FileReader và FileWriter cho đầu vào và đầu ra trong khi CopyBytes sử dụng FileInputStream FileOutputStream. Chú ý rằng cả CopyBytes và CopyCharacters sử dụng một biến int để đọc và ghi. Tuy nhiên, trong CopyCharacters, biến int lưu một giá trị kiểu ký tự với kích thước 16 bit, còn ở CopyBytes, biến int chứa giá trị là một byte có kích thước 8 bit.

Character Stream sử dụng Byte Stream

Character stream được coi là "wrappers" ("bao ngoài") byte stream. Các character stream sử dụng các byte stream để thực hiện các thao tác I/O vật lý trong quá trình xử lý dịch giữa các ký tự và byte. Ví dụ như FileReader sử dụng FileInputStream , trong khi FileWriter sử dụng FileOutputStream.

Có hai stream được coi là "cầu nối" cho việc dịch byte thành ký tự và ngược lại, đó là InputStreamReader và OutputStreamWriter. Chúng được sử dung để tạo ra các character stream khi không có sẵn lớp character stream nào đáp ứng được nhu cầu của ta. Các bài viết socket lessionnetworking trail cho ta thấy cách tạo ra các character stream từ các byte stream được cung cấp bởi các lớp socket.

Line-Oriented I/O

I/O character thường xảy ra ở các đơn vị lớn hơn các ký tự đơn. Đơn vị phổ biến ở đây dòng (line), đó là một chuỗi ký tự với kết thúc là ký tự kết thúc chuỗi, ký tự này có thể là một chuỗi carriage-return/line-feed"\r\n" ), một carriage-return"\r" ), hoặc một line-feed"\n" ). Việc hỗ trợ tất cả các ký tự này có thể cho phép các chương trình đọc các tập tin văn bản được tạo ra trên bất kỳ hệ điều hành nào.

Bây giờ ta thay đổi lớp CopyCharacters thông qua việc sử dụng I/O line-oriented. Để làm điều này, ta phải sử dụng hai lớp là BufferedReader và PrintWriter (ta sẽ tìm hiểu sâu hơn các lớp này thông qua các bài viết về Buffered I/O và Formatting).

Lớp CopyLines dưới đây sẽ gọi BufferedReader.readLine và PrintWriter.println nhập liệu và hiển thị mỗi dòng tại một thời điểm.

import java.io.FileReader;
import java.io.FileWriter;
import java.io.BufferedReader;
import java.io.PrintWriter;
import java.io.IOException;

public class CopyLines {
  public static void main(String[] args) throws IOException {

    BufferedReader inputStream = null;
    PrintWriter outputStream = null;

    try {
      inputStream = new BufferedReader(new FileReader("input.txt"));
      outputStream = new PrintWriter(new FileWriter("characteroutput.txt"));

      String str;
      while ((str = inputStream.readLine()) != null) {
        outputStream.println(str);
      }
    } finally {
      if (inputStream != null) {
        inputStream.close();
      }
      if (outputStream != null) {
        outputStream.close();
      }
    }
  }
}

Lời gọi readLine sẽ trả về một dòng văn bản, println sẽ hiển thị kết quả, trong đó nó sẽ đưa thêm ký tự kết thúc dòng tùy thuộc vào hệ điều hành hiện tại, điều này có nghĩa rằng ký tự kết thúc dòng có thể không giống với ký kết thúc dòng trong tập tin đầu vào.

Có rất nhiều cách để cấu trúc văn bản vào và ra ngoài cách sử dụng các ký tự và các dòng, xin xem thêm bài viết Quét và Định dạng.

» Tiếp: Buffered Stream
« Trước: Byte Stream
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!