В смысле?
Какие именно сложности?
Там просто много различных "необычностей"
Простой курьер (Reader/Writer), позволяющий читать только байты и ничего кроме байтов - это все в рамках общей схемы Carrier-Rider-Mapper (или Носитель-Курьер-Проектор), при которой Rider содержит только доступ к элементарным логическим элементам, зависящий от конкретной реализации носителя. Все операции по работе с данными в терминах более высокоуровневых единиц выносятся в независимый от реализации носителя проектор (Stores.Reader/Stores.Writer).

Сам набор методов - частично вызван "долгой историей", а частично - диктуется общей схемой... Например, то, что имя новому файлу может быть присвоено только после его записи - из-за того, что с одним и тем же файлом может работать много клиентов. А в момент создания файла нужно обеспечить эксклюзивность доступа. Например, если несколько модулей намерены создать файл с одним и тем же именем, то они будут записывать данные не в один файл и не запортят его, а в индивидуальные временные файлы, а уж кто зарегистрирует файл первым - как повезет
Ну и т.п. В частности, объект File к одному файлу в среде всегда существует только один. Если Вы вызвали Old, то сначала ищется в памяти уже существующий объект... И закрывать явно файлы в большинстве случаев - именно поэтому - никогда не надо (кроме тех случаев, когда работаете в неразделяемомо режиме со своими файлами), т.к. неизвестно, кто еще с ним работает...