关闭扫描仪而不关闭System.in [英] Close Scanner without closing System.in

查看:132
本文介绍了关闭扫描仪而不关闭System.in的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



这些方法中有些问题要求用户输入和输入验证,所以我使用了一个扫描仪和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.in But 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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆