Trong bài viết này, chúng ta sẽ tìm hiểu về lớp InputStreamReader và OutputStreamWriter trong Java và các phương thức cùng với các ví dụ dẫn chứng.
Lớp InputStreamReader
Lớp InputStreamReader của gói java.io có thể được sử dụng để chuyển đổi dữ liệu dạng byte thành dữ liệu ở dạng các ký tự. Nó kế thừa lớp trừu tượng Reader.
Lớp InputStreamReader hoạt động hiệu quả với các luồng đầu vào khác. Nó còn được gọi là cầu nối giữa các luồng byte và các luồng ký tự. Điều này là do InputStreamReader đọc các byte từ luồng đầu vào dưới dạng ký tự.
Ví dụ: Một số ký tự đòi hỏi số lượng là 2 byte để được lưu trữ trong bộ nhớ. Để đọc dữ liệu đó, chúng ta có thể sử dụng InputStreamReader để đọc 2 byte cùng lúc và chuyển đổi thành các ký tự tương ứng.
Tạo một InputStreamReader
Để tạo InputStreamReader, trước tiên chúng ta phải thêm gói package java.io.InputStreamReader. Sau khi thêm, sau đây là cách chúng ta có thể tạo InputStreamReader.
1 2 |
FileInputStream file = new FileInputStream(String path); InputStreamReader input = new InputStreamReader(file); |
Trong ví dụ trên, chúng ta đã tạo một InputStreamReader tên là input cùng với FileInputStream có tên là file. Tại đây, dữ liệu trong tệp được lưu trữ bằng một số kiểu mã hóa ký tự mặc định. Tuy nhiên, chúng ta cũng có thể chỉ định loại mã hóa ký tự (UTF8 hoặc UTF16) trong tệp.
1 |
InputStreamReader input = new InputStreamReader(file, Charset cs); |
Ở đây, chúng ta đã sử dụng lớp Charset để chỉ định kiểu mã hóa ký tự trong tệp.
Các phương thức của InputStreamReader
Lớp InputStreamReader cung cấp các triển khai cho các phương thức khác nhau có trong lớp Reader.
1. Phương thức read()
- Phương thức read(): Đọc một ký tự.
- Phương thức read(char [] array): Đọc các ký tự và lưu trữ trong mảng được chỉ định.
- Phương thức read(char [] array, int start, int length): Đọc số lượng ký tự bằng giá trị của length và lưu trữ trong mảng được chỉ định bắt đầu từ giá trị của start.
Ví dụ: Giả sử chúng ta có một tệp tên tek4.txt với nội dung như sau.
1 |
Lap trinh Java |
Chúng ta sẽ thực hiện đọc nội dung bên trong nó bằng đoạn mã như sau.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import java.io.InputStreamReader; import java.io.FileInputStream; class Main { public static void main(String[] args) { char[] du_lieu = new char[100]; try { FileInputStream file = new FileInputStream("tek4.txt"); InputStreamReader input = new InputStreamReader(file); input.read(du_lieu); System.out.println(du_lieu); input.close(); } catch(Exception e) { e.getStackTrace(); } } } |
Kết quả:
1 |
Lap trinh Java |
Trong ví dụ trên, chúng ta đã tạo InputStreamReader bằng luồng nhập đầu vào từ tệp. InputStreamReader được liên kết với tệp tek4.txt.
1 2 |
FileInputStream file = new FileInputStream("tek4.txt"); InputStreamReader input = new InputStreamReader(file); |
Để đọc các ký tự từ tệp, chúng ta đã sử dụng phương thức read().input.read(du_lieu);
2. Phương thức getEncoding()
Phương thức getEncoding() có thể được sử dụng để lấy kiểu mã hóa được sử dụng để lưu trữ dữ liệu trong luồng đầu vào.
Ví dụ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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("tek4.txt"); InputStreamReader a = new InputStreamReader(file, Charset.forName("UTF8")); System.out.println(a.getEncoding()); a.close(); } catch(Exception e) { e.getStackTrace(); } } } |
Kết quả:
1 |
UTF8 |
Trong ví dụ trên, chúng ta đã tạo InputStreamReader tên là a và có chỉ định kiểu mã hóa ký tự là UTF8. Do đó, phương thức getEncoding() trả về kiểu mã hóa ký tự được chỉ định.
Chú ý: Chúng ta đã sử dụng phương thức Charset.forName() để chỉ định kiểu mã hóa ký tự.
3. Phương thức close()
Để đóng InputStreamReader, chúng ta có thể sử dụng phương thức close(). Khi phương thức close() được gọi, chúng ta không thể sử dụng InputStreamReader để đọc dữ liệu.
4. Các phương thức khác
Phương thức | Mô tả |
ready() | Kiểm tra xem có thể đọc dữ liệu hay không |
mark() | Đánh dấu vị trí mà dữ liệu được đọc tới |
reset() | Trả về quyền kiểm soát tại điểm được đánh dấu |
Lớp OutputStreamWriter
Lớp OutputStreamWriter của gói java.io có thể được sử dụng để chuyển đổi dữ liệu ở dạng ký tự thành dữ liệu ở dạng byte. Nó kế thừa lớp trừu tượng Writer.
Lớp OutputStreamWriter hoạt động với các luồng đầu ra khác. Nó còn được gọi là cầu nối giữa các luồng byte và các luồng ký tự. Điều này là do OutputStreamWriter chuyển đổi các ký tự thành dạng byte.
Ví dụ, một số ký tự yêu cầu 2 byte được lưu trữ trong bộ nhớ. Để ghi dữ liệu như vậy, chúng ta có thể sử dụng OutputStreamWriter để chuyển đổi ký tự thành các byte tương ứng và lưu trữ các byte lại với nhau.
Tạo một OutputStreamWriter
Để tạo một OutputStreamWriter, trước tiên chúng ta phải thêm gói package java.io.OutputStreamWriter. Sau khi chúng ta thêm, sau đây là cách chúng ta có thể tạo nó.
1 2 |
FileOutputStream file = new FileOutputStream(String path); OutputStreamWriter output = new OutputStreamWriter(file); |
Trong ví dụ trên, chúng ta đã tạo một OutputStreamWriter có tên là output cùng với FileOutputStream có tên là file. Ở đây, chúng ta đang sử dụng kiểu mã hóa ký tự mặc định để ghi ký tự vào luồng in đầu ra. Tuy nhiên, chúng ta có thể chỉ định kiểu mã hóa ký tự (UTF8 hoặc UTF16) được sử dụng để ghi dữ liệu.
1 |
OutputStreamWriter output = new OutputStreamWriter(file, Charset cs); |
Ở đây, chúng ta đã sử dụng lớp Charset để chỉ định kiểu mã hóa ký tự.
Các phương thức của OutputStreamWriter
Lớp OutputStreamWriter cung cấp các triển khai cho các phương thức khác nhau có trong lớp Writer.
1. Phương thức write()
- Phương thức write(): Ghi một ký tự.
- Phương thức write(char [] array): Ghi các ký tự từ mảng được chỉ định.
- Phương thức write(String data): Ghi chuỗi được chỉ định.
Ví dụ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import java.io.FileOutputStream; import java.io.OutputStreamWriter; public class Main { public static void main(String args[]) { String du_lieu = "Lap trinh Java co ban"; try { FileOutputStream file = new FileOutputStream("tek4.txt"); OutputStreamWriter output = new OutputStreamWriter(file); output.write(du_lieu); output.close(); } catch (Exception e) { e.getStackTrace(); } } } |
Kết quả trong tệp tek4.txt như sau:
1 |
Lap trinh Java co ban |
Trong ví dụ trên, chúng ta đã tạo một OutputStreamWriter bằng luồng in đầu ra cho tệp. Trình đọc luồng đầu ra được liên kết với tệp tek4.txt.
1 2 |
FileOutputStream file = new FileOutputStream("tek4.txt"); OutputStreamWriter output = new OutputStreamWriter(file); |
Để ghi dữ liệu vào tệp, chúng ta đã sử dụng phương thức write(). Tại đây, sau khi chúng ta chạy chương trình, tệp tek4.txt sẽ chứa nội dung sau.
1 |
Lap trinh Java co ban |
2. Phương thức getEncoding()
Phương thức getEncoding() có thể được sử dụng để lấy kiểu mã hóa được sử dụng để ghi dữ liệu vào luồng đầu ra.
Ví dụ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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("tek4.txt"); OutputStreamWriter output = new OutputStreamWriter(file, Charset.forName("UTF8")); System.out.println(output.getEncoding()); output.close(); } catch(Exception e) { e.getStackTrace(); } } } |
Kết quả:
1 |
UTF8 |
Trong ví dụ trên, chúng ta đã tạo trình ghi luồng đầu ra có tên là output và chỉ định mã hóa ký tự, UTF8. Do đó, phương thức getEncoding() trả về mã hóa ký tự được chỉ định.
Chú ý: Chúng ta đã sử dụng phương thức Charset.forName() để chỉ định kiểu mã hóa ký tự.
3. Phương thức close()
Để OutputStreamWriter, chúng ta có thể sử dụng phương thức close(). Khi phương thức này được gọi, chúng ta sẽ không thể ghi dữ liệu.
4. Các phương thức khác
Phương thức | Mô tả |
flush() | Ép buộc ghi tất cả dữ liệu hiện có trong Writer vào trong điểm đích. |
append() | Chèn ký tự được chỉ định vào trong Writer. |
Trên đây là khái niệm và ví dụ cơ bản về lớp InputStreamReader và OutputStreamWriter trong Java. Hy vọng mọi người có thể áp dụng vào trong chương trình của mình. Mọi người hãy tiếp tục theo dõi các bài tiếp theo và cập nhật các bài mới nhất trên tek4 nhé!
P/s: Cảm ơn mọi người!