有一堂课
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);
}
扫描器级别的调用
close确保输入流也是关闭is的,在被重用之前不会重新创建/重新打开Scanner sss = new Scanner(is);。由于
sss这是扫描仪的新实例, 和 的标志sourceClosed被closed重新初始化,因此hasNext不会引发异常。但是,无法从流中读取is,因此流保持关闭状态。您可以使用该方法
InputStream::available检查输入流是否包含要读取的数据。