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

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

5个回答

不会,每个scanner是独立的。

restaurant123
小飞侠2009 那这段代码的运行结果为什么直接结束,没有等待输入?
5 年多之前 回复
restaurant123
小飞侠2009 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()); } } }
5 年多之前 回复

首先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自己谷歌

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

restaurant123
小飞侠2009 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()); } } }
5 年多之前 回复

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());
}
}
}


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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐