问题描述
这些方法中有些问题要求用户输入和输入验证,所以我使用了一个扫描仪和System.in
但是当我关闭我的扫描仪我也关闭System.in
所以我的问题是,我只能通过用CloseShieldInputStream屏蔽System.in来关闭它,或者我应该只是开始将扫描器传递给方法?
您可以通过实现自定义装饰器来忽略关闭。
public class UnClosableDecorator扩展InputStream {
private final InputStream inputStream;
public UnClosableDecorator(InputStream inputStream){
this.inputStream = inputStream;
}
@Override
public int read()throws IOException {
return inputStream.read();
}
@Override
public int read(byte [] b)throws IOException {
return inputStream.read(b);
}
@Override
public int read(byte [] b,int off,int len)throws IOException {
return inputStream.read(b,off, LEN);
}
@Override
public long skip(long n)throws IOException {
return inputStream.skip(n);
}
@Override
public int available()throws IOException {
return inputStream.available();
}
@Override
public synchronized void mark(int readlimit){
inputStream.mark(readlimit);
}
@Override
public synchronized void reset()throws IOException {
inputStream.reset();
}
@Override
public boolean markSupported(){
return inputStream.markSupported();
}
@Override
public void close()throws IOException {
// do nothing
}
}
并在主要使用它
public static void main(String [] args)throws Exception {
System.setIn(new UnClosableDecorator(System.in));
}
I'm trying to re-factor a large and frequently used part of my application into separate methods to make it easier to maintain.
Some of these methods asks the user for input and does input validation, so I've used a Scanner and System.inBut when I close my Scanner I also close System.in
So my question is, can I only prevent System.in being closed by shielding it with CloseShieldInputStream or should I just start passing a Scanner to the methods?
You can just ignore close by implementing custom decorator.
public class UnClosableDecorator extends InputStream {
private final InputStream inputStream;
public UnClosableDecorator(InputStream inputStream) {
this.inputStream = inputStream;
}
@Override
public int read() throws IOException {
return inputStream.read();
}
@Override
public int read(byte[] b) throws IOException {
return inputStream.read(b);
}
@Override
public int read(byte[] b, int off, int len) throws IOException {
return inputStream.read(b, off, len);
}
@Override
public long skip(long n) throws IOException {
return inputStream.skip(n);
}
@Override
public int available() throws IOException {
return inputStream.available();
}
@Override
public synchronized void mark(int readlimit) {
inputStream.mark(readlimit);
}
@Override
public synchronized void reset() throws IOException {
inputStream.reset();
}
@Override
public boolean markSupported() {
return inputStream.markSupported();
}
@Override
public void close() throws IOException {
//do nothing
}
}
And use it in main
public static void main(String[] args) throws Exception {
System.setIn(new UnClosableDecorator(System.in));
}
这篇关于关闭扫描仪而不关闭System.in的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!