Lớp InputStreamReader và OutputStreamWriter trong Java

Đây là bài 53/62 bài của series môn học Ngôn ngữ lập trình Java

1. Lớp InputStreamReader trong Java

Lớp InputStreamReader nằm trong package java.io được sử dụng để chuyển đổi dữ liệu dạng byte thành dữ liệu dạng ký tự trong input stream khi đọc dữ liệu từ nơi lưu trữ (data source). Lớp InputStreamReader kế thừa từ lớp trừu tượng abstract Reader.

Lớp InputStreamReader làm việc với các input stream khác. Nó hoạt động giống như cầu nối giữa dòng byte (byte stream) và dòng ký tự (character stream). Lớp InputStreamReader sẽ đọc các byte trong input stream và biến đổi chúng thành dạng ký tự.

Tạo ra một InputStreamReader

Để sử dụng InputStreamReader, chúng ta cần import java.io.InputStreamReader.

//Tạo một InputStream
FileInputStream file = new FileInputStream(String path);

//Tạo một InputStreamReader
InputStreamReader input = new InputStreamReader(file);

Trong ví dụ trên, chúng ta đã tạo một đối tượng InputStreamReader tên là input với một đối tượng FileInputStream tên là file.

Các dữ liệu trong file được lưu trữ bởi loại mã hóa ký tự mặc định (default character encoding) của file đó. Chúng ta có thể chỉ rõ character encoding (ví dụ UTF8 hoặc UTF16) cho các ký tự đọc được từ file.

//Tạo InputStreamReader với character encoding
InputStreamReader input = new InputStreamReader(file, Charset cs);

Tham số Charset cs giúp chỉ rõ character encoding cho các ký tự đọc được từ file.

Các phương thức của InputStreamReader

Phương thức read()

  • read() đọc một ký tự từ reader
  • read(char[] array) đọc các ký tự từ reader và lưu trữ các ký tự này trong mảng array
  • read(char[] array, int start, int length) đọc length ký tự từ reader và lưu trữ các ký tự này vào mảng array bắt đầu từ vị trí start của mảng array

Giả sử, chúng ta có 1 file input.txt nằm trong phân vùng D với nội dung bên dưới.

This is a line of text inside the file.

Chúng ta có thể sử dụng InputStreamReader để đọc dữ liệu từ file trên.

import java.io.InputStreamReader;
import java.io.FileInputStream;
class Main {
  public static void main(String[] args) {
    //Tạo array của các ký tự
    char[] array = new char[100];
    try {
      //Ttaoj một FileInputStream
      FileInputStream file = new FileInputStream("D:\\input.txt");
      //Tạo một InputStreamReader
      InputStreamReader input = new InputStreamReader(file);
      //Đọc các ký tự từ file
      input.read(array);
      System.out.println("Data in the stream:");
      System.out.println(array);
      //Đóng reader
      input.close();
    }
    catch(Exception e) {
      e.getStackTrace();
    }
  }
}
Kết quả
Data in the stream:
This is a line of text inside the file.

Phương thức getEncoding()

Hàm getEncoding() giúp lấy loại mã hóa ký tự (character encoding) lưu trữ dữ liệu trong input stream.

import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.io.FileInputStream;
class Main {
  public static void main(String[] args) {
    try {
      FileInputStream file = new FileInputStream("D:\\input.txt");
      InputStreamReader input1 = new InputStreamReader(file);
      //Tạo một InputStreamReader với character encoding
      InputStreamReader input2 = new InputStreamReader(file, Charset.forName("US-ASCII"));
      //Trả về character encoding của input stream
      System.out.println("Character encoding of input1: " + input1.getEncoding());
      System.out.println("Character encoding of input2: " + input2.getEncoding());
      //Đóng reader
      input1.close();
      input2.close();
    }
    catch(Exception e) {
      System.err.println(e.getStackTrace());
    }
  }
}
Kết quả
Character encoding of input1: UTF8
Character encoding of input2: ASCII

Lưu ý: Hàm Charset.forName() giúp chỉ rõ character encoding với tên của các loại character encoding. Trong Java, có hỗ trợ một số loại character encoding như US-ASCII, ISO-8859-1, UTF-8, UTF-16BE, UTF-16LE, UTF-16. Các bạn có thể tham khảo thêm các character encoding trong Java với Java Charset.

Phương thức close()

Sử dụng phương thức close() để đóng input stream reader khi không cần dùng để đọc dữ liệu nữa.

2. Lớp OutputStreamWriter trong Java

Lớp OutputStreamWriter nằm trong package java.io được sử dụng để chuyển đổi dữ liệu dạng ký tự thành các byte để ghi vào nơi lưu trữ (data destination). Lớp OutputStreamWriter kế thừa từ lớp abstract Writer.

Lớp OutputStreamWriter làm việc với các output stream khác. Nó hoạt động như cầu nối giữa dòng byte (byte stream) và dòng ký tự (character stream). Lớp OutputStreamWriter sẽ chuyển đổi các ký tự thành byte để lưu trữ.

Tạo một OutputStreamWriter

Để sử dụng OutputStreamWriter, chúng ta cần import java.io.OutputStreamWriter.

//Tạo một đối tượng OutputStream
FileOutputStream file = new FileOutputStream(String path);

//Tạo một đối tượng OutputStreamWriter
OutputStreamWriter output = new OutputStreamWriter(file);

Trong ví dụ trên, chúng ta đã tạo ra một đối tượng OutputStreamWriter tên là output với một đối tượng FileOutputStream tên là file.

Thông thường, chúng ta sử dụng loại mã hóa ký tự mặc định (default character encoding) để ghi các ký tự vào output stream. Chúng ta có thể chỉ rõ loại mã hóa ký tự (ví dụ UTF8 hoặc UTF16) được sử dụng để ghi dữ liệu vào output stream.

//Tạo một OutputStreamWriter với character encoding
OutputStreamWriter output = new OutputStreamWriter(file, Charset cs);

Tham số Charset cs giúp chỉ rõ character encoding cho các ký tự đọc được từ file.

Các phương thức của OutputStreamWriter

Phương thức write()

  • write() ghi một ký tự vào writer
  • write(char[] array) ghi các ký tự trong mảng array vào writer
  • write(String data) ghi chuỗi String data vào writer
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
public class Main {
  public static void main(String args[]) {
    String data = "This is a line of text inside the file.";
    try {
      //Tạo một FileOutputStream
      FileOutputStream file = new FileOutputStream("D:\\output.txt");
      //Tạo một OutputStreamWriter
      OutputStreamWriter output = new OutputStreamWriter(file);
      //Ghi string vào file
      output.write(data);
      //Đóng writer
      output.close();
    }
    catch (Exception e) {
      System.err.println(e.getStackTrace());
    }
  }
}

Chương trình trên giúp ghi dữ liệu của chuỗi String data = "This is a line of text inside the file."; vào file D:\\output.txt.

Phương thức getEncoding()

Hàm getEncoding() được sử dụng để lấy loại mã hóa ký tự (character encoding) dùng để ghi dữ liệu vào output stream.

import java.io.OutputStreamWriter;
import java.nio.charset.Charset;
import java.io.FileOutputStream;
class Main {
  public static void main(String[] args) {
    try {
      FileOutputStream file = new FileOutputStream("D:\\output.txt");
      //Tạo output stream reader với default character encoding
      OutputStreamWriter output1 = new OutputStreamWriter(file);
      //Tạo output stream reader với character encoding
      OutputStreamWriter output2 = new OutputStreamWriter(file, Charset.forName("US-ASCII"));
      //Trả về character encoding của output stream
      System.out.println("Character encoding of output1: " + output1.getEncoding());
      System.out.println("Character encoding of output2: " + output2.getEncoding());
      //Đóng reader
      output1.close();
      output2.close();
    }
    catch(Exception e) {
      System.err.println(e.getStackTrace());
    }
  }
}

Kết quả

Character encoding of output1: UTF8
Character encoding of output2: ASCII

Các bạn nên sử dụng hàm close() để đóng OutputStreamWriter khi không cần sử dụng để ghi dữ liệu nữa.

5/5 - (5 bình chọn)
Bài trước và bài sau trong môn học<< Lớp Reader và Writer trong JavaLớp FileReader và FileWriter trong Java >>
Chia sẻ trên mạng xã hội:

Trả lời

Lưu ý:

1) Vui lòng bình luận bằng tiếng Việt có dấu.

2) Khuyến khích sử dụng tên thật và địa chỉ email chính xác.

3) Mọi bình luận trái quy định sẽ bị xóa bỏ.