Вопрос

Существует несколько высококачественных фреймворков, которые скрывают сложность сетевого программирования на основе 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.Стоит отметить, что соединения сокетов не имеют всех своих данных одновременно, а вместо этого могут потребоваться поддержка множества медленных соединений (особенно соединений, которые открыты, но данные еще не отправляются).

Однако для файлов все данные доступны одновременно, и вам обычно нужно открыть только несколько файлов за раз, чтобы получить максимальную производительность (часто по одному достаточно). Если вы загружаете данные с нескольких дисков (редко) или с несколько серверов (очень редко) или несколько сетевых интерфейсов (еще реже), вы можете получить доступ к нескольким файлам одновременно, что повышает производительность.Даже в этом случае сложность невелика, и вы можете просто создать поток для каждого загружаемого файла.

Единственный случай, когда файлы являются сложными, — это чтение файлов журналов.Это сложно, поскольку файл может увеличиваться в размерах по мере его чтения.Вы можете дойти до конца файлов и позже найти дополнительные данные.Также файлы журналов можно ротировать, что означает, что файл, который вы открыли, больше не является тем файлом, который вам нужен.Несмотря на это, с этим не очень сложно справиться, и это довольно редкое требование.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top