Sau một thời gian dài học Java, có bao giờ bạn thắc mắc rằng khi làm việc với dữ liệu trong Java, có phương thức nào thể đọc và hiểu nội dung dữ liệu đã được lưu trong file đó một cách đơn giản hay không?
Câu trả lời là có, thậm chí là rất nhiều phương thức có thể làm điều đó dễ dàng.
BufferedReader chính là một trong những phương thức làm rất tốt điều đó.
Nếu là người mới bắt đầu, thì sau bài viết này có lẽ bạn sẽ thích sử dụng BufferedReader trong Java.
1. BufferedReader trong Java là gì?
BufferedReader trong Java
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
Để làm việc với BufferedReader trong Java chúng ta có nhiều phương thức:
-
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-niit\\file-content.txt
với nội dụng như sau:
"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)
3.1. Đọc File với BufferedReader và read()
Để đọc file với BufferedReader thì đầu tiên chúng ta sẽ nghĩ đến phương thức read(). Bây giờ, chúng ta sẽ sử dụng nó để đọc file text trên.
// Import package cần thiết
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class WithRead {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("F:\\content-niit\\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ữ.
3.2. Đọc File với BufferedReader và readline()
Tiếp theo, chúng ta sẽ sử dụng phương thức readline() để đọc từng dòng văn bản.
// Import package cần thiết
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 {
String url = "F:\\content-niit\\file-content.txt";
// Đọc dữ liệu theo từng 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ới 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:
Reader reader = new BufferedReader(new FileReader("F:\\content-niit\\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.
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 trong Java.
---
HỌC VIỆN ĐÀO TẠO CNTT NIIT - ICT HÀ NỘI
Dạy học Lập trình chất lượng cao (Since 2002). Học làm Lập trình viên. Hành động ngay!
Đc: Tầng 3, 25T2, N05, Nguyễn Thị Thập, Cầu Giấy, Hà Nội
SĐT: 02435574074 - 0914939543 - 0353655150
Email: hello@niithanoi.edu.vn
Fanpage: https://facebook.com/NIIT.ICT/
#niit #niithanoi #niiticthanoi #hoclaptrinh #khoahoclaptrinh #hoclaptrinhjava #hoclaptrinhphp #java #php #python