Java: Tập tin truy cập ngẫu nhiên

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơ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ênh
  • position(long) - Thiết lập vị trí của kênh
  • read(ByteBuffer) - Đọc byte vào bộ đệm từ kênh
  • write(ByteBuffer) - Ghi byte từ bộ đệm vào kênh
  • truncate(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 newByteChannelSeekableByteChannel 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);
}

» Tiếp: Tạo và đọc thư mục
« Trước: Đọc, ghi và tạo tập tin
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!