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