Для 1) вы всегда можете прочитать байты и преобразовать их в строку, используя выбранную кодировку. Я почти уверен, что это то, что все «читатели» под капотом.
Для 2) нет, класс Scanner
не переопределяет метод finalize
, поэтому я почти уверен, что он не закрывает дескриптор (и это действительно не должно). Раздел, посвященный финализаторам книги Effective Java, содержит подробное объяснение этой темы.
Для 3) закрытие Scanner
автоматически закроет основной поток. Я почти уверен, что именно так почти все классы ввода / вывода обрабатывают переданный дескриптор файла / ресурса.