|
Spec-Zone .ru
спецификации, руководства, описания, API
|
Разрешение на файлы произвольного доступа непоследовательный, или случайный, доступ к содержанию файла. Чтобы получить доступ к файлу в произвольном порядке, Вы открываете файл, ищете определенное расположение, и читаете из или пишете в тот файл.
Эта функциональность возможна с SeekableByteChannel интерфейс. SeekableByteChannel интерфейс расширяет ввод-вывод канала с помощью понятия текущей позиции. Методы позволяют Вам установить или запросить позицию, и можно тогда считать данные из, или записать данные в, то расположение. API состоит из некоторых, удобных, методы:
предоставление Вас получает доступ к большему количеству расширенных функций, таких как отображение области файла непосредственно в память для более быстрого доступа, блокировка области файла, или чтения и записи байтов от абсолютного расположения, не влияя на текущую позицию канала.
Следующий фрагмент кода открывает файл и для чтения и для записи при использовании одного из newByteChannel методы. SeekableByteChannel это возвращается, бросается к a FileChannel. Затем, 12 байтов читаются с начала файла, и строки, "Я был здесь!" пишется в том расположении. Текущая позиция в файле перемещается до конца, и 12 байтов с начала добавляются. Наконец, строка, "Я был здесь!" добавляется, и канал на файле закрывается.
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);
}