2013-02-19 13 views
7

私は、アプリケーションの大部分を頻繁に使用する部分を、別の方法で再構成して、管理しやすくしています。System.inを閉じずにスキャナを閉じよう

これらの方法のいくつかは、ユーザーに入力を要求し、入力検証を行いますので、私はスキャナとSystem.in を使用しました。しかし、私は私のスキャナを閉じて、私も近いSystem.in

だから私の質問ですCloseSupportInputStreamで遮蔽してSystem.inを閉じないようにすることはできますか?それとも、メソッドにスキャナを渡すだけですか?

+0

をいくつかのコードを投稿してください... – nkukhar

+5

はあなたが本当にクローズする必要がありますかスキャナ?ガベージコレクタに処理させておくことをお勧めします。基になるオブジェクトを閉じずに閉じられる方法はありません。 – ddmps

+0

私のメソッドは、スキャナを宣言し、nextLine()を読み込んで返し、スキャナを閉じて次の実行時に頭痛を与えます。 私がそれを閉じないと、Eclipseは潜在的なリソースリークについて私に嫌うが、それを無視しても安全でしょうか? – deepy

答えて

3

をnullに保持する変数を設定し、それを閉じることなくなりましょうことができます。

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

単に代わりにSystem.inのカスタムFilterInputStream使用メイン

public static void main(String[] args) throws Exception { 
     System.setIn(new UnClosableDecorator(System.in)); 
} 
+0

これは自分のバージョンのCloseShieldInputStreamを作成するのと同じではないでしょうか? – deepy

+0

どういう意味なのか分かりませんが、クローズ時に入力ストリームでいくつかのアクションを実行する必要がある場合は、UnClosableDecorator.close()メソッドでこのアクションを実行してください。 – nkukhar

+1

CloseShieldInputStreamは、 。 http://commons.apache.org/io/apidocs/org/apache/commons/io/input/CloseShieldInputStream.html – deepy

1

あなただけのただあなただけのカスタムデコレータを実装することにより、近い無視することができます

+0

このEclipseではスキャナが閉じられないという警告が表示されますが、無視しても安全ですか? – deepy

+0

私はそれが簡単なプログラミングスタイルだと思います。プログラマーは、実際に閉じなければならないオープンなリソースを残してしまうかもしれません。 –

11

でそれを使用します。

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

は受け入れられた答えよりも簡単です!ありがとう。 –

+2

これはコモンズの[CloseShieldInputStream](http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/input/CloseShieldInputStream.html)の機能とほぼ同じです。このポジションでは、ソフトウェアの設計をもう一度見たいと思うかもしれません。 サードパーティのソリューションを使用している場合を除き、このようなソリューションは必要ありません。 (ここのすべての回答に適用されます) – deepy

関連する問題