Чтение онлайн

на главную - закладки

Жанры

Философия Java3

Эккель Брюс

Шрифт:

Класс MappedByteBuffer унаследован от буфера ByteBuffer, поэтому он содержит все методы последнего. Здесь представлены только простейшие вызовы методов put и get, но вы также можете использовать такие возможности, как метод asCharBuffer и т. п.

Программа напрямую создает файл размером 128 Мбайт; скорее всего, это превышает ограничения вашей операционной системы на размер блока данных, находящегося в памяти. Однако создается впечатление, что весь файл доступен сразу, поскольку только часть его подгружается

в память, в то время как остальные части выгружены. Таким образом можно работать с очень большими (размером до 2 Гбайт) файлами. Заметьте, что для достижения максимальной производительности используются низкоуровневые механизмы отображения файлов используемой операционной системы.

Производительность

Хотя быстродействие «старого» ввода/вывода было улучшено за счет переписывания его с учетом новых библиотек nio, техника отображения файлов качественно эффективнее. Следующая программа выполняет простое сравнение производительности:

//. io/MappedIO.java import java.nio.*. import java.nio.channels *; import java io.*,

public class MappedIO {

private static int numOflnts = 4000000, private static int numOfUbufflnts = 200000; private abstract static class Tester { private String name,

public Tester(String name) { this name = name. } public void runTestO {

System.out.print(name + ": "). try {

long start = System nanoTimeO; test;

double duration = System.nanoTimeO - start; System.out.formates 2f\n", duration/1.0e9); } catch(IOException e) {

throw new RuntimeException(e).

}

}

public abstract void testO throws IOException;

}

private static Tester[] tests = {

new Tester("Stream Write") {

public void testO throws IOException {

DataOutputStream dos = new DataOutputStream( new BufferedOutputStream(

new FileOutputStream(new

FileC temp, tmp"))));

for(int i = 0; i < numOflnts; i++) dos writelnt(i); dos.closeO;

}

}.

new Tester("Mapped Write") {

public void testO throws IOException { FileChannel fc =

new RandomAccessFile("temp.tmp". "rw") getChannel; IntBuffer ib = fc map(

FileChannel .MapMode READ_WRITE, 0. fc sizeO) .asIntBufferO; for(int i = 0; i < numOflnts; i++)

ib.putCi); fc.closeO;

}

}.

new Tester("Stream Read") {

public void testO throws IOException {

DatalnputStream dis = new DatalnputStreamC new BufferedlnputStreamC

new F i1eInputSt rearn("temp.tmp"))); for(int i = 0; i < numOflnts; i++)

dis.readlntO; dis.closeO;

}

}.

new Tester("Mapped Read") {

public void testO throws IOException {

FileChannel fc = new FileInputStream(

new File("temp.tmp")).getChannelО; IntBuffer ib = fc.map(

Fi 1 eChannel.MapMode.READ_0NLY, 0. fc.sizeO) .asIntBufferO; while(ib. hasRemainingO)

ib.getO; fc. closeO;

}

}.

new Tester("Stream Read/Write") {

public void testO throws IOException {

RandomAccessFile raf = new RandomAccessFile(

new FileC'temp.tmp"), "rw"); raf.writelnt(l);

for(int i = 0; i < numOfUbufflnts; i++) { raf.seek(raf.length - 4); raf,writelnt(raf.readlnt);

}

raf.closeO;

}

}.

new Tester("Mapped Read/Write") {

public void testO throws IOException {

FileChannel fc = new RandomAccessFile(

new FileC'temp.tmp"). "rw").getChannelО; IntBuffer ib e fc.map(

FileChannel.MapMode.READ_WRITE. 0. fc.sizeO) .asIntBufferO; ib.put(O);

for(int i = 1; i < numOfUbufflnts; i++)

ib.put(ib.get(i - 1)); fc.closeO;

}

}

}:

public static void main(String[] args) { for(Tester test ; tests) test.runTestO;

}

} /* Output; Stream Write; 0.56 Mapped Write; 0.12 Stream Read; 0.80

Mapped Read: 0.07 продолжение &

Stream Read/Write 5.32 Mapped Read/Write 0.02 */// ~

Как

уже было видно из предыдущих примеров книги, runTest — не что иное как метод шаблона, предоставляющий тестовую инфраструктуру для различных реализаций метода test, определенного в безымянных внутренних подклассах. Каждый из этих подклассов выполняет свой вид теста, таким образом, методы test также являются прототипами для выполнения различных действий, связанных с вводом/выводом.

Хотя кажется, что для отображаемой записи следует использовать поток FileOutputStream, на самом деле любые операции отображаемого вывода должны проходить через класс RandomAccessFile так же, как выполняется чтение/запись в рассмотренном примере.

Отметьте, что в методах test также учитывается инициализация различных объектов для работы с вводом/выводом, и, несмотря на то что настройка отображаемых файлов может быть затратной, общее преимущество по сравнению с потоковым вводом/выводом все равно получается весьма значительным.

Блокировка файлов

Блокировка файлов позволяет синхронизировать доступ к файлу как к совместно используемому ресурсу. Впрочем, потоки, претендующие на один и тот же файл, могут принадлежать различным виртуальным машинам JVM, или один поток может быть Java-потоком, а другой представлять собой обычный поток операционной системы. Блокированные файлы видны другим процессам операционной системы, поскольку механизм блокировки Java напрямую связан со средствами операционной системы. Вот простой пример блокировки файла:

Поделиться:
Популярные книги

Газлайтер. Том 29

Володин Григорий Григорьевич
29. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
6.40
рейтинг книги
Газлайтер. Том 29

Северянин. Трилогия

Лей Влад
Северянин
Фантастика:
фэнтези
5.75
рейтинг книги
Северянин. Трилогия

Невидимый убийца

Касслер Клайв
13. Дирк Питт
Приключения:
прочие приключения
7.83
рейтинг книги
Невидимый убийца

Тёмный Лорд Поттер

The Santi
Проект «Поттер-Фанфикшн»
Фантастика:
фэнтези
городское фэнтези
5.00
рейтинг книги
Тёмный Лорд Поттер

Проводник

Кораблев Родион
2. Другая сторона
Фантастика:
боевая фантастика
рпг
7.41
рейтинг книги
Проводник

Том 8. Проза, незавершенное 1841-1856

Некрасов Николай Алексеевич
8. Собрание сочинений в пятнадцати томах
Проза:
русская классическая проза
5.00
рейтинг книги
Том 8. Проза, незавершенное 1841-1856

Резонанс Ци. Дилогия

Орлов Андрей Юрьевич
Резонанс Ци
Фантастика:
постапокалипсис
рпг
уся
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Резонанс Ци. Дилогия

Федор Алексеевич

Мосияш Сергей Павлович
Романовы. Династия в романах
Проза:
историческая проза
5.00
рейтинг книги
Федор Алексеевич

Те, кто внизу. Донья Барбара. Сеньор Президент

Астуриас Мигель Анхель
133. Библиотека всемирной литературы
Проза:
классическая проза
5.50
рейтинг книги
Те, кто внизу. Донья Барбара. Сеньор Президент

"Фантастика 2025-70". Компиляция. Книги 1-31

Волков Николай Владимирович
Фантастика 2025. Компиляция
Фантастика:
боевая фантастика
попаданцы
фэнтези
5.00
рейтинг книги
Фантастика 2025-70. Компиляция. Книги 1-31

Газлайтер. Том 38

Володин Григорий Григорьевич
38. История Телепата
Фантастика:
городское фэнтези
аниме
попаданцы
6.20
рейтинг книги
Газлайтер. Том 38

Ветхий Завет. Перевод и комментарии

Щедровицкий Дмитрий Владимирович
Религия и эзотерика:
прочая религиозная литература
5.00
рейтинг книги
Ветхий Завет. Перевод и комментарии

Бояръ-Аниме. Газлайтер. Том 35

Володин Григорий Григорьевич
35. История Телепата
Фантастика:
аниме
боевая фантастика
фэнтези
6.25
рейтинг книги
Бояръ-Аниме. Газлайтер. Том 35

Театральная Энциклопедия

Неизвестен 3 Автор
Справочная литература:
словари
5.00
рейтинг книги
Театральная Энциклопедия