With all of the branches this has caused, I *much* prefer the existing FS interface and its 4 subclasses with their overridden methods.

Why can't this IO package use those until its the last caller, and then integrate them into itself?  Its extremely difficult to review this reformatted version of the code to ensure the logic is still equivalent.