Java cung cấp một số phương pháp để đọc file. Mỗi phương pháp thích hợp cho việc đọc các loại file khác nhau trong các tình huống khác nhau. Một số tốt hơn cho đọc file dài, những cái khác tốt hơn cho đọc file ngắn, v.v.
Trong hướng dẫn này, chúng ta sẽ dùng các class Java sau để đọc file:
- BufferedReader
- Files
- Scanner
Trong suốt hướng dẫn, chúng ta dùng một file lưu trong thư mục src nơi đường dẫn đến file là src/file.txt.
Lưu vài dòng text vào file này trước khi tiến hành.
Lưu ý: Bạn phải xử lý đúng lỗi (error handling) khi dùng các triển khai này để tuân thủ best practice coding.
Đọc File Text Trong Java Với BufferedReader
Class BufferedReader đọc một character-input stream. Nó buffer (đệm) các ký tự trong buffer với kích thước mặc định 8 KB để làm cho quá trình đọc hiệu quả hơn. Nếu bạn muốn đọc file dòng per dòng (line by line), dùng BufferedReader là lựa chọn tốt.
BufferedReader hiệu quả trong đọc file lớn.
import java.io.*;
public class FileReaderWithBufferedReader {
public static void main(String[] args) throws IOException {
String file = "src/file.txt";
BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
String curLine;
while ((curLine = bufferedReader.readLine()) != null) {
// xử lý dòng như yêu cầu
System.out.println(curLine);
}
bufferedReader.close();
}
}
Phương thức readLine() trả về null khi đạt cuối file.
Lưu ý: Đừng quên đóng file khi đọc xong.
Đọc File UTF-8 Encoded Trong Java Với BufferedReader
Chúng ta có thể dùng class BufferedReader để đọc file UTF-8 encoded.
Lần này, chúng ta truyền một đối tượng InputStreamReader khi tạo instance BufferedReader.
import java.io.*;
public class EncodedFileReaderWithBufferedReader {
public static void main(String[] args) throws IOException {
String file = "src/fileUtf8.txt";
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));
String curLine;
while ((curLine = bufferedReader.readLine()) != null) {
// xử lý dòng như bạn yêu cầu
System.out.println(curLine);
}
}
}
Dùng Class Files Của Java Để Đọc File
Class Files của Java, giới thiệu trong Java 7 trong Java NIO, hoàn toàn gồm các static method thao tác trên file.
Dùng class Files, bạn có thể đọc toàn bộ nội dung file vào một mảng. Điều này làm cho nó trở thành lựa chọn tốt cho đọc file nhỏ.
Hãy xem cách dùng Files class trong cả hai kịch bản này.
Đọc File Nhỏ Trong Java Với Files Class
Phương thức readAllLines() của class Files cho phép đọc toàn bộ nội dung file và lưu mỗi dòng trong mảng dưới dạng string.
Bạn có thể dùng class Path để lấy đường dẫn đến file vì class Files chấp nhận đối tượng Path của file.
import java.io.IOException;
import java.nio.file.*;
import java.util.*;
public class SmallFileReaderWithFiles {
public static void main(String[] args) throws IOException {
String file = "src/file.txt";
Path path = Paths.get(file);
List lines = Files.readAllLines(path);
}
}
Bạn có thể dùng readAllBytes() để lấy dữ liệu lưu trong file vào byte array thay vì string array.
byte[] bytes = Files.readAllBytes(path);
Đọc File Lớn Trong Java Với Files Class
Nếu bạn muốn đọc file lớn với class Files, bạn có thể dùng phương thức newBufferedReader() để lấy instance của class BufferedReader và đọc file dòng per dòng dùng BufferedReader.
import java.io.*;
import java.nio.file.*;
public class LargeFileReaderWithFiles {
public static void main(String[] args) throws IOException {
String file = "src/file.txt";
Path path = Paths.get(file);
BufferedReader bufferedReader = Files.newBufferedReader(path);
String curLine;
while ((curLine = bufferedReader.readLine()) != null) {
System.out.println(curLine);
}
bufferedReader.close();
}
}
Đọc File Với Files.lines()
Java 8 giới thiệu phương thức mới cho class Files để đọc toàn bộ file vào một Stream của string.
import java.io.IOException;
import java.nio.file.*;
import java.util.stream.Stream;
public class FileReaderWithFilesLines {
public static void main(String[] args) throws IOException {
String file = "src/file.txt";
Path path = Paths.get(file);
Stream lines = Files.lines(path);
lines.forEach(s -> System.out.println(s));
lines.close();
}
}
Đọc File Text Trong Java Với Scanner
Class Scanner chia nhỏ nội dung file thành các phần dùng delimiter (phân tách) cho trước và đọc từng phần. Cách này phù hợp nhất cho đọc nội dung được phân tách bởi delimiter.
Ví dụ, class Scanner lý tưởng cho đọc list integer phân tách bởi whitespace hoặc list string phân tách bởi dấu phẩy.
Delimiter mặc định của class Scanner là whitespace. Nhưng bạn có thể đặt delimiter thành ký tự khác hoặc regular expression. Nó cũng có nhiều phương thức next như next(), nextInt(), nextLine(), và nextByte(), để chuyển nội dung thành các kiểu khác nhau.
import java.io.IOException;
import java.util.Scanner;
import java.io.File;
public class FileReaderWithScanner {
public static void main(String[] args) throws IOException {
String file = "src/file.txt";
Scanner scanner = new Scanner(new File(file));
scanner.useDelimiter(" ");
while(scanner.hasNext()) {
String next = scanner.next();
System.out.println(next);
}
scanner.close();
}
}
Trong ví dụ trên, chúng ta đặt delimiter là whitespace và dùng phương thức next() để đọc phần tiếp theo của nội dung được phân tách bởi whitespace.
Đọc Toàn Bộ File
Bạn có thể dùng class Scanner để đọc toàn bộ file một lần mà không chạy vòng lặp. Bạn phải truyền "\\Z" làm delimiter cho việc này.
scanner.useDelimiter("\\Z");
System.out.println(scanner.next());
scanner.close();
Lưu ý: Class Scanner không synchronized và do đó, không thread-safe.
Kết Luận
Như bạn thấy trong hướng dẫn này, Java cung cấp nhiều phương pháp bạn có thể chọn tùy theo bản chất của nhiệm vụ để đọc file text. Bạn có thể dùng BufferedReader để đọc file lớn dòng per dòng.
Nếu bạn muốn đọc file có nội dung được phân tách bởi delimiter, dùng class Scanner.
Cũng bạn có thể dùng Java NIO class Files để đọc cả file nhỏ và lớn.