Как узнать что поток(стрим) ещё можно считывать

Есть класс

    public class CreatIStream {

    private static final String PATH_TO = "Text"; // !!!!!!!!!!!!! <- Pls use this path for your text!

    public InputStream getInputStreamFile(){
        return getClass().getClassLoader().getResourceAsStream(PATH_TO);
    }
}

И класс использующий эту реализацию, забегая вперед скажу что я пытаюсь (ради эксперимента) открыть его дважды.

 public class ReadText {

    public static void loadAllQuotes(){

        InputStream is = new CreatIStream().getInputStreamFile();

        Scanner sc = new Scanner(is);
        while (sc.hasNext()){
            System.out.println(sc.nextLine());
        }
        System.out.println("END READ");
        sc.close();

        // Пробую выполнить эту операцию ещё раз
        // Чтение не происходит, вызывается сразу "END READ2"
        // Никаких ошибок о том что поток is нулевой, нет.
        // что происходит при sc.close(); ???

        Scanner sss = new Scanner(is);
        while (sss.hasNext()){
            System.out.println(sss.nextLine());
        }
        System.out.println("END READ2");
        sss.close();

    }
}

Посмотрев документацию Scaner, я увидел что после закрытия потока, ставится метка о том, что поток закрыт

 public void close() {
    if (closed)
        return;
    if (source instanceof Closeable) {
        try {
            ((Closeable)source).close();
        } catch (IOException ioe) {
            lastException = ioe;
        }
    }
    sourceClosed = true;
    source = null;
    closed = true;
}

Вопрос : Почему нет ошибки, и как вообще закрывается поток is, ведь в конструкторе Scaner идёт создание новой ссылки на InputStream.

public Scanner(InputStream source) {
    this(new InputStreamReader(source), WHITESPACE_PATTERN);
}

Ответы (1 шт):

Автор решения: Nowhere Man

Вызов close на уровне сканера гарантирует, что будет также закрыт поток ввода is, который не пересоздаётся / не переоткрывается перед повторным использованием в Scanner sss = new Scanner(is);.

Поскольку sss это новый экземпляр сканера, флажки sourceClosed и closed у него переинициализируются, и поэтому hasNext не выбрасывает исключение. Однако чтение из потока is не может быть выполнено, так этот поток остаётся закрытым.

Как узнать что поток(стрим) ещё можно считывать

Можно использовать метод InputStream::available для проверки, содержит ли поток ввода данные для чтения.

→ Ссылка