web-dev-qa-db-ja.com

System.inにリンクされたスキャナーを閉じる

ScannerSystem.inにリンクされています。 Scannerを使用した後、開いたままにしておくのは悪いコーディング慣行であるため、閉じる必要があります。ただし、Scannerを閉じると、System.inも閉じます。 System.inを閉じずにScannerを閉じる方法を教えてもらえますか(方法がある場合)。

30
JavaNewbie_M107

1つのオプションは、System.inストリームをCloseShieldInputStreamでラップして、閉じられないようにすることです。読者は、生のSystem.inストリームではなくCloseShieldInputStreamを使用します。

このクラスのAPIは次のとおりです。 http://commons.Apache.org/io/apidocs/org/Apache/commons/io/input/CloseShieldInputStream.html

22
paul jerman

最も簡単なことは、基になるストリームを閉じたくない場合はスキャナーを閉じないことです。

理想的には、プログラムの存続期間中に使用するスキャナーを1つだけ作成する必要があります。いずれにせよ、あなたはそれを閉じる正当な理由がないようです。

24
Peter Lawrey

シールドクラスやそのようなものを追加する代わりに、素敵なコメントと

        @SuppressWarnings("resource")

それで十分です。そして、私はこのアプローチに多くの欠点を見ているようには見えません。コメントを忘れないでください。

7
mist

同じScannerSystem.inを2度使用すると、奇妙で​​診断不可能な問題の漠然とした記憶があります。プログラム):

static String input() {
    try {
        return new Scanner(System.in).nextLine();
    } catch (NoSuchElementException e) {
        throw e;
    }
}

何らかの理由でこれは警告なしで機能しますが、キャッチスローを行わないと、EclipseはResource leak: '<unassigned Closeable value>' is never closedと文句を言います。

0
Blrp