问题
Many people asked question like that but this one is a little bit different. Here is the code:
public static BufferedReader reader;
public static String readString() throws IOException {
reader = new BufferedReader(new InputStreamReader(System.in));
String s = reader.readLine();
reader.close();
return s;
}
While program runtime readString
method is invoked many times. The second call causes exception: stream closed
. I can not understand: why it ends up so? Every time we declare new BufferedReader
. So the stream
must be also new. Or not?
If not, how should I organize my program so that it will close reader after all invocations and after my program is over?
回答1:
Because System.in
is same Object
(public final static InputStream in;
of System
class) both method calls are using, closing in one method will automatically close System.in
for other method. You should close the BufferedReader
from outside(as I can see it's public
) the method once you finish calling readString
and so it will ultimately close underlying System.in
.
回答2:
Closing the BufferedReader
closes System.in
. You shouldn't close it at all, and you shouldn't keep creating a new one either: you will lose data. Use the same one for the life of the process.
来源:https://stackoverflow.com/questions/34552774/java-io-ioexception-stream-closed-with-new-bufferedreader