Java NIO Framework для файловых систем вместо сетей? - PullRequest
2 голосов
/ 15 июля 2009

Существует несколько высококачественных сред, которые скрывают сложность сетевого программирования на основе NIO (mina, netty, grizzly и т. Д.). Существуют ли подобные структуры, которые упрощают программирование файловой системы на основе NIO?

Например, в качестве учебного упражнения я хотел бы реализовать карту на основе диска на основе этой (потрясающей!) Статьи: http://www.javaworld.com/javaworld/jw-01-1999/jw-01-step.html.

Ответы [ 2 ]

6 голосов
/ 15 ноября 2009

Нет (но ...)

Но это потому, что Java NIO FileChannel и 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());

Вы можете получить доступ к буферу, как и любой другой Buffer . Данные магически и быстро перемещаются между диском и памятью, и все они управляются Java и системой управления виртуальной памятью базовой ОС. У вас есть степень контроля над этим, хотя. Например: MappedByteBuffer's .force() ( 'Принудительно записывает любые изменения, внесенные в содержимое этого буфера, на устройство хранения, содержащее сопоставленный файл.' ) и .load() ( 'Загружает содержимое этого буфера в физическую память.' ) Я никогда не нуждался в этом лично.

3 голосов
/ 15 ноября 2009

Добавить к комментарию @ Stu. Стоит отметить, что сокет-соединения не имеют всех своих данных одновременно, но вместо этого может потребоваться поддержка многих медленных соединений (esp-соединения, которые открыты, но данные еще не отправляются)

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

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

...