java,如果一个IO资源被多个IO流打开,

有一个IO流close(),其他流是不是也就不能用这个资源了?
比如在多个类里用了Scanner键盘输入,有一个Scanner实例close(),其他的实例就不能再扫描键盘输入了

不应该,设备文件都有ref__counter, 每打开一个 ++,关闭一个--
除非为0,不会真正关闭

import java.util.*;
public class ScannerTest{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
Scanner qwe = new Scanner(System.in);
sc.close();
while(qwe.hasNext()){
System.out.println(qwe.next());
}
}
}


不会,每个scanner是独立的。

那这段代码的运行结果为什么直接结束,没有等待输入?

首先Scanner类默认实现是不支持多线程的,另外你的测试代码是有问题的
import java.util.*;
public class ScannerTest{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
Scanner qwe = new Scanner(System.in);
sc.close();
//加上这句
qwe.nextLine();
while(qwe.hasNext()){
System.out.println(qwe.next());
}
}
}
经测试报了一个NoSuchElementException,通过调试得知。Scanner对象里有一个source属性,这个可以理解为System.in,是一种资源,source下
有个bufferInputStream。发现sc.close()执行后,qwe的bufferInputStream为null,因此才报了上面的异常。
可以得出,在一个线程中,如果有多个Scanner对象,一旦有某个scanner对象执行了close方法,其他对象也就无法正常使用了.
不过可以用多线程的方法,来实现针对同一资源,可以同时打开多个IO流。这块lz自己谷歌