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ừ readerread(char[] array)
đọc các ký tự từ reader và lưu trữ các ký tự này trong mảng arrayread(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 writerwrite(char[] array)
ghi các ký tự trong mảng array vào writerwrite(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.