简体   繁体   English

关闭扫描仪而不关闭System.in

[英]Close Scanner without closing 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.in But when I close my Scanner I also close System.in 其中一些方法要求用户输入并进行输入验证,因此我使用了Scanner和System.in,但是当我关闭Scanner时,我也关闭了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? 所以我的问题是,我只能通过使用CloseShieldInputStream屏蔽System.in来防止它被关闭,还是应该开始将Scanner传递给方法?

Simply use a custom FilterInputStream instead of System.in: 只需使用自定义FilterInputStream代替System.in:

new FilterInputStream(System.in) {
    @Override
    public void close() throws IOException {
        //don't close System.in! 
    }
}

You can just ignore close by implementing custom decorator. 您可以通过实现自定义装饰器来忽略close。

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

您可以不关闭它就放任它,只需将holding变量设置为null

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM