java.io.RandomAccessFile cho phép đọc/ghi tại vị trí bất kỳ trong file (random access), khác với stream tuần tự. Dùng con trỏ file pointer (getFilePointer(), seek()).
Đọc file txt với readLine()
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
public class RandomAccessFileExample {
public static void main(String args[]) throws IOException {
String filePath = "D://input.txt";
File file = new File(filePath);
StringBuffer buffer = new StringBuffer();
// "rw" = read-write mode
RandomAccessFile raFile = new RandomAccessFile(file, "rw");
// Đọc từng dòng cho đến hết file
while (raFile.getFilePointer() < raFile.length()) {
buffer.append(raFile.readLine()).append(System.lineSeparator());
}
String contents = buffer.toString();
System.out.println("Nội dung file:\n" + contents);
raFile.close();
}
}
Kết quả
Nội dung file:
Tutorials Point originated from the idea that there exists a class of readers...
Enjoy the free content
Các mode mở file
| Mode | Ý nghĩa |
"r" | Read-only |
"rw" | Read-write |
"rws" | Read-write + sync metadata (chậm) |
"rwd" | Read-write + sync data (chậm) |
Ưu điểm RandomAccessFile
- Đọc/ghi ngẫu nhiên:
seek(pos) nhảy đến byte bất kỳ.
- Hỗ trợ cả read và write trong 1 object.
- Phù hợp: file lớn, database nhúng, tìm kiếm nhị phân (binary search) trong file đã sort.
So sánh với Scanner/BufferedReader
| Đặc điểm | RandomAccessFile | Scanner/BufferedReader |
| Truy cập ngẫu nhiên | Có (seek) | Không (sequential) |
| Ghi file | Có | Không (cần FileWriter) |
| Đọc dòng | readLine() | nextLine()/readLine() |
| Hiệu suất file lớn | Tốt (nhảy trực tiếp) | Phải đọc tuần tự |