Thao tác với kiểu dữ liệu Byte trong Java
Sau một thời gian dài làm việc với Java, có bao giờ bạn thắc mắc rằng khi làm việc với dữ liệu có sẵn, Java làm sao có thể đọc và hiểu nội dung dữ liệu đã được lưu trong file đó hay không? Câu trả lời là có, thậm chí là rất nhiều phương thức làm việc khác nhau.
BufferedReader với bạn có gì xa lạ không? Nếu là người mới bắt đầu, thì có lẽ - nhưng sau buổi hôm nay, bạn sẽ được làm quen với BufferedReader và biết đâu bạn sẽ thích.
1. BufferedReader trong Java là gì?
BufferedReader là một lớp Java để đọc văn bản từ luồng đầu vào (như tệp) bằng cách đệm và đọc liền mạch các ký tự, mảng hoặc dòng. Nói chung, mỗi yêu cầu đọc được tạo bởi Reader sẽ khiến yêu cầu đọc tương ứng được tạo từ ký tự hoặc luồng byte bên dưới.
Do đó, nên bọc BufferedReader xung quanh bất kỳ Reader nào có phương thức read(), chẳng hạn như java FileReaders và InputStreamReaders. Một cách sử dụng thông thường sẽ liên quan đến việc chuyển đường dẫn tệp tới BufferedReader.
2. Các phương thức BufferedReader trong Java
- void close() : Đóng luồng và giải phóng bất kỳ tài nguyên hệ thống nào được liên kết với nó
- void mark(int readAheadLimit) : Đánh dấu vị trí hiện tại trong luồng. Các lời gọi tiếp theo đến
reset()sẽ cố gắng định vị lại luồng đến điểm này. - boolean markSupported() : Nó được sử dụng để kiểm tra input stream có hỗ trợ các phương thức mark() và
reset()không. - int read() : Đọc một ký tự duy nhất.
- int read(char[] cbuf, int off, int len) : Đọc các phần tử của một mảng.
Phương thức này thực hiện cùng với phương thức Reader tương ứng của lớp Reader. Để thuận tiện hơn, nó cố gắng đọc càng nhiều ký tự càng tốt bằng cách gọi liên tục phương thức đọc của luồng bên dưới. Việc đọc này tiếp tục cho đến khi một trong các điều kiện sau trở thành đúng:
- Số lượng ký tự được chỉ định đã được đọc,
- Phương thức đọc của luồng cơ bản trả về
-1, biểu thị phần cuối của tệp hoặc - Phương thức sẵn sàng của luồng cơ bản trả về false, chỉ ra rằng các yêu cầu đầu vào tiếp theo sẽ chặn.
Nếu lần đọc đầu tiên trên luồng cơ bản trả về -1 để biểu thị phần cuối của tệp thì phương thức này trả về -1. Nếu không, phương thức này trả về số lượng ký tự thực sự đọc.
- String readLine() : Nó được sử dụng để đọc một dòng văn bản.
- boolean ready() : Cho biết liệu luồng này đã sẵn sàng để được đọc.
- void reset() : Nó định vị lại stream tại vị trí mà phương thức đánh dấu lần cuối được gọi vào input stream này.
- long skip(long n) : Bỏ qua kí tự nào đó.
3. Cách làm việc với BufferedReader trong Java
Khi sử dụng class BufferedReader trong Java để đọc nội dung một file text thì chúng ta có hai cách khác nhau đó là sử dụng phương thức readLine() hoặc read() của class này.
Trong bài viết này chúng ta sẽ tìm hiểu cách làm chi tiết của từng phương pháp với việc áp dụng vào đọc một file từ máy tính. Thư mục mình lưu file nguồn chính là: F:\\content-demo\\file-content.txt với nội dụng như sau:
1
2
3
4
5
6
"Tôi muốn tắt nắng đi
Cho màu đừng nhạt mất
Tôi muốn buộc gió lại
Cho hương đừng bay đi"
(Vội vàng - Xuân Diệu)
- Đọc File với BufferedReader và read() ```java import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException;
public class WithRead { public static void main(String[] args) throws IOException {
1
2
3
4
5
6
7
8
9
10
FileReader fr = new FileReader("F:\\content-demo\\file-content.txt");
BufferedReader br = new BufferedReader(fr);
int i;
while ((i = br.read()) != -1) {
System.out.print((char) i);
}
br.close();
fr.close();
} } ```
Khi gọi br.read(), Java sẽ trả về từng các số mã hoá của từng ký tự thay vì nội dung cả dòng như cách sử dụng redline(). Chúng ta nên sử dụng vòng lặp while để đọc ra từng số mã hoá ký tự này và sau đó chuyển hoá về dạng ký tự chữ.
- Đọc File với BufferedReader và readline() ```java import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.util.logging.Level; import java.util.logging.Logger;
public class WithReadline { public static void main(String args[]) throws IOException {
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
String url = "F:\\content-demo\\file-content.txt";
// đọc dữ liệu theo dòng với BufferedReader
FileInputStream fileInputStream = null;
BufferedReader bufferedReader = null;
try {
fileInputStream = new FileInputStream(url);
bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));
String line = bufferedReader.readLine();
while (line != null) {
System.out.println(line);
line = bufferedReader.readLine();
}
} catch (FileNotFoundException ex) {
Logger.getLogger(ReadFileWithBufferedReader.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(ReadFileWithBufferedReader.class.getName()).log(Level.SEVERE, null, ex);
} finally {
try {
bufferedReader.close();
fileInputStream.close();
} catch (IOException ex) {
Logger.getLogger(ReadFileWithBufferedReader.class.getName()).log(Level.SEVERE, null, ex);
}
}
} } ```
Hai phương pháp đọc File trên hiện đang là hai phương pháp thông dụng nhất của lớp BufferedReader. Bên cạnh đó, BufferedReader còn hỗ trợ làm việc với File chứa mảng hay kí tự và thậm chí là giớ hạn luôn cả số kí tự nữa.
Hãy thử thay đôi nội dụng file theo mục đích cần đọc và thử đoạn code mẫu sau:
1
2
3
4
5
6
7
8
9
Reader reader = new BufferedReader(new FileReader("F:\\content-demo\\file-content.txt"));
char[] theChars = new char[128];
int charsRead = reader.read(theChars, 0, theChars.length);
while(charsRead != -1) {
System.out.println(new String(theChars, 0, charsRead));
charsRead = reader.read(theChars, 0, theChars.length);
}
Phương thức read(char [], offset, length) trả về số lượng ký tự được đọc vào mảng char hoặc -1 nếu không có thêm ký tự nào để đọc trong BufferedReader.
Lời kết
Bên trên chỉ là một ít tính năng cơ bản của lớp BufferedReader mang lại mà thôi. Để làm việc và sử dụng hết các tính năng của nó bạn cần một thời gian dài để học cũng như có những đoạn code thực nghiệm mới thì mới khai phá được những gì tinh tú nhất của BufferedReader.
BufferedReader chẳng khác nào là bản nâng cấp tuyệt vời từ Scanner cả. Bạn không cần phải nhập và làm việc với dữ liệu trên các màn hình console nữa. Hãy dành một chút thời gian quý báo để tìm hiểu thật kỹ về BufferedReader, khi làm việc trong môi trường không phải là học căn bản nữa bạn sẽ thấy được tầm quan trọng của BufferedReader.
Với hàng khối dữ liệu cần xử lí được lưu trong các file có sẵn, bạn sẽ không bỡ ngỡ và có ngay cho mình một giải pháp đơn giản mà hiệu quả, không thứ gì khác chỉ có thể là BufferedReader.
Bài viết mang tính chất “ghi chú, lưu trữ, chia sẻ và phi lợi nhuận”.
Nếu bạn thấy hữu ích, đừng quên chia sẻ với bạn bè và đồng nghiệp của mình nhé!
Happy coding! 😎 👍🏻 🚀 🔥