Hi, one thing to change (maybe):
In my opinion, the methods implemented by simply forwarding and calling doWrapDirectoryReader(in.getReader) should be final, because the whole class depends on this functionality. If you override these methods in a subclass instead of correctly implementing the "SubReaderWrapper#wrap()" inner class and "doWrapDirectoryReader()", you break the whole reopen logic. You should do the work only in the abstract doWrapDirectoryReader() method is combination with the SubReaderWrapper. So the methods for doOpenIfChanged(...) should be made final to prevent mis-use.