Делая это
br.close();
Вы на самом деле делаете это
System.in.close();
Поскольку BufferedReader
закрывает основной поток.
Это делает поток System.in
более недоступным для использования.
Что вам нужно сделать, это сделать небольшой трюк, чтобы предотвратить System.in
от закрытия. Для этого вы можете использовать следующую оболочку
public class ShieldedInputStream extends InputStream {
InputStream source;
public ShieldedInputStream(InputStream source) {
this.source = source;
}
@Override
public int read() throws IOException {
return source.read();
}
@Override
public int read(byte[] b) throws IOException {
return source.read(b);
}
@Override
public int read(byte[] b, int off, int len) throws IOException {
return source.read(b, off, len);
}
@Override
public long skip(long n) throws IOException {
return source.skip(n);
}
@Override
public int available() throws IOException {
return source.available();
}
@Override
public void close() throws IOException {
// source.close(); // We dont awant to close it!
}
@Override
public void mark(int readlimit) {
source.mark(readlimit);
}
@Override
public void reset() throws IOException {
source.reset();
}
@Override
public boolean markSupported() {
return source.markSupported();
}
}
И используйте это так
br = new BufferedReader(new InputStreamReader(new ShieldedInputStream(System.in)));
Таким образом, вы предотвратите закрытие System.in
, но при этом сможете освободить ресурсы, закрыв BufferedReader