private static boolean isValidXMLChar(final char c) {
        return c == 0x9 || c == 0xA || c == 0xD || (c >= 0x20 && c <= 0xD7FF) || (c >= 0xE000 && c <= 0xFFFD);
    }
Every overload of {@link Reader#read()} method delegates to this one so
it is enough to override only this one. <br />
To skip invalid characters this method shifts only valid chars to left
and returns decreased value of the original read method. So after last
valid character there will be some unused chars in the buffer.

@return Number of read valid characters or {@code -1} if end of the
underling reader was reached.
main/src/main/java/cgeo/geocaching/files/InvalidXMLCharacterFilterReader.java