Как узнать что поток(стрим) ещё можно считывать
Есть класс
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 шт):
Вызов close на уровне сканера гарантирует, что будет также закрыт поток ввода is, который не пересоздаётся / не переоткрывается перед повторным использованием в Scanner sss = new Scanner(is);.
Поскольку sss это новый экземпляр сканера, флажки sourceClosed и closed у него переинициализируются, и поэтому hasNext не выбрасывает исключение. Однако чтение из потока is не может быть выполнено, так этот поток остаётся закрытым.
Как узнать что поток(стрим) ещё можно считывать
Можно использовать метод InputStream::available для проверки, содержит ли поток ввода данные для чтения.