Java: Tập tin truy cập ngẫu nhiên
Giải phóng thời gian, khai phóng năng lực
File truy cập ngẫu nhiên cho phép tính không cần tuần tự trong việc truy cập vào nội dung của một tập tin. Để truy cập vào một tập tin ngẫu nhiên, bạn mở tập tin, tìm kiếm một vị trí cụ thể, và đọc từ hay ghi vào tập tin đó.
Chức năng này là có thể thực hiện được với giao diện SeekableByteChannel
. Giao diện SeekableByteChannel
mở rộng kênh I/O với các khái niệm về vị trí hiện tại. Các phương thức cho phép bạn thiết lập hoặc truy vấn các vị trí, và sau đó bạn có thể đọc dữ liệu từ, hoặc ghi dữ liệu vào vị trí đó. Các API bao gồm một số ít phương thức dễ sử dụng như sau:
position
- Trả về vị trí hiện tại của kênhposition(long)
- Thiết lập vị trí của kênhread(ByteBuffer)
- Đọc byte vào bộ đệm từ kênhwrite(ByteBuffer)
- Ghi byte từ bộ đệm vào kênhtruncate(long)
- Cắt các file (hoặc đầu vào khác) kết nối với kênh
Đọc và ghi tập tin với kênh I/O cho thấy phương thức Path.newByteChannel
trả về một thể hiện của SeekableByteChannel
. Trên hệ thống tập tin mặc định, bạn có thể sử dụng kênh đó như thế, hoặc bạn có thể ép nó thành một FileChannel
để có thể truy cập vào các tính năng tiên tiến hơn, chẳng hạn như lập bản đồ một khu vực của các tập tin trực tiếp vào bộ nhớ truy cập nhanh hơn, khóa một khu vực của tập tin, hoặc đọc và viết byte từ một vị trí tuyệt đối mà không ảnh hưởng đến vị trí hiện tại của kênh.
Đoạn mã sau sẽ mở một tập tin để đọc và ghi bằng cách sử dụng một trong những phương thức newByteChannel
. SeekableByteChannel
mà được trả về sẽ được ép thành FileChannel
. Sau đó, 12 byte được đọc từ đầu của tập tin, và chuỗi "I was here!" được viết ở vị trí đó. Vị trí hiện tại trong tập tin được chuyển đến cuối tập tin, và 12 byte từ đầu được nối. Cuối cùng, chuỗi "I was here!" được nối và các kênh trên các tập tin được đóng.
String s = "I was here!\n";
byte data[] = s.getBytes();
ByteBuffer out = ByteBuffer.wrap(data);
ByteBuffer copy = ByteBuffer.allocate(12);
try (FileChannel fc = (FileChannel.open(file, READ, WRITE))) {
// Read the first 12
// bytes of the file.
int nread;
do {
nread = fc.read(copy);
} while (nread != -1 && copy.hasRemaining());
// Write "I was here!" at the beginning of the file.
fc.position(0);
while (out.hasRemaining())
fc.write(out);
out.rewind();
// Move to the end of the file. Copy the first 12 bytes to
// the end of the file. Then write "I was here!" again.
long length = fc.size();
fc.position(length-1);
copy.flip();
while (copy.hasRemaining())
fc.write(copy);
while (out.hasRemaining())
fc.write(out);
} catch (IOException x) {
System.out.println("I/O Exception: " + x);
}
Giải phóng thời gian, khai phóng năng lực