Структура Java NIO для файловых систем вместо сетей?
-
13-09-2019 - |
Вопрос
Существует несколько высококачественных фреймворков, которые скрывают сложность сетевого программирования на основе NIO (mina, netty, grizzly и т. д.).Существуют ли подобные платформы, которые упрощают программирование файловой системы на основе NIO?
Например, в качестве учебного упражнения я хотел бы реализовать карту на диске, основанную на этой (потрясающей!) статье: http://www.javaworld.com/javaworld/jw-01-1999/jw-01-step.html.
Решение
Нет, но...)
Но это потому, что Java NIO Файловый канал и MappedByteBuffer не так сложны или трудны для понимания и использования, как сетевые и Селектор вещи java.nio
.
Вот пример создания карты на диске (известной как «сопоставленный байтовый буфер» в стране NIO), которая подойдет для вашего упражнения:
File file = new File("/Users/stu/mybigfile.bin");
FileChannel fc = (new FileInputStream(file)).getChannel();
MappedByteBuffer buf = fc.map(MapMode.READ_WRITE, 0, file.length());
Вы можете получить доступ к буферу, как и к любому другому Буфер.Данные волшебным образом и быстро перемещаются между диском и памятью, и все это управляется Java и системой управления виртуальной памятью базовой ОС.Однако у вас есть определенная степень контроля над этим.Например.:MappedByteBuffer's .force()
(«Принудительно записывает любые изменения, внесенные в содержимое этого буфера, на устройство хранения, содержащее сопоставленный файл».) и .load()
('Загружает содержимое этого буфера в физическую память.') Лично мне они никогда не были нужны.
Другие советы
Чтобы добавить к комментарию @Stu.Стоит отметить, что соединения сокетов не имеют всех своих данных одновременно, а вместо этого могут потребоваться поддержка множества медленных соединений (особенно соединений, которые открыты, но данные еще не отправляются).
Однако для файлов все данные доступны одновременно, и вам обычно нужно открыть только несколько файлов за раз, чтобы получить максимальную производительность (часто по одному достаточно). Если вы загружаете данные с нескольких дисков (редко) или с несколько серверов (очень редко) или несколько сетевых интерфейсов (еще реже), вы можете получить доступ к нескольким файлам одновременно, что повышает производительность.Даже в этом случае сложность невелика, и вы можете просто создать поток для каждого загружаемого файла.
Единственный случай, когда файлы являются сложными, — это чтение файлов журналов.Это сложно, поскольку файл может увеличиваться в размерах по мере его чтения.Вы можете дойти до конца файлов и позже найти дополнительные данные.Также файлы журналов можно ротировать, что означает, что файл, который вы открыли, больше не является тем файлом, который вам нужен.Несмотря на это, с этим не очень сложно справиться, и это довольно редкое требование.