2013-02-19 18 views
7

Uygulamamın büyük ve sıkça kullanılan bir bölümünü, bakımını kolaylaştırmak için ayrı yöntemlere yeniden dahil etmeye çalışıyorum. Tarayıcıyı kapatmadan kapatın System.in

Bu yöntemlerden bazıları

kullanıcıdan giriş yapması istenir ve giriş doğrulaması yapar, bu yüzden bir Tarayıcı ve System.in kullandım Ama Tarayıcı kapattığınızda Ben de System.in

yakın Yani benim sorum , sadece System.in'i CloseShieldInputStream ile kapatarak kapatmayı engelleyebilir miyim, yoksa sadece bir Scanner'ı bu yöntemlere aktarmaya başlamalı mıyım?

+0

bazı kod sonrası Lütfen ... – nkukhar

+5

Gerçekten kapatmak gerekir mi Tarayıcı? Çöp toplayıcının ele almasına izin vermenizi öneririm - altta yatan nesneyi kapatmadan kapatmanın bir yolu yoktur. – ddmps

+0

Yöntemim bir Tarayıcı bildirir, nextLine() öğesini okur ve döndürür, Tarayıcıyı kapatır ve bir sonraki işlemde bana bir baş ağrısı verir. Eğer kapatmazsam, Eclipse bana potansiyel bir kaynak sızıntısı yaşatır, bunu görmezden gelmek güvenli olur mu? – deepy

cevap

3

sadece yakın özel dekoratör uygulayarak yok sayabilirsiniz null set, onu kapatmadan olalım olabilir.

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

Ve Basitçe yerine System.in özel bir FilterInputStream kullandığımız ana

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

Bu benim kendi CloseShieldInputStream sürümünü yazmakla aynı şey değil miydi? – deepy

+0

Neyi kastettiğinizden tam emin değilim, ancak giriş akışı ile bazı eylemleri gerçekleştirmeniz gerekiyorsa, UnClosableDecorator.close() yöntemindeki – nkukhar

+1

CloseShieldInputStream'deki bu eylemler, alttaki giriş akışının kapatılmasını engelleyen bir proxy akıştır . http://commons.apache.org/io/apidocs/org/apache/commons/io/input/CloseShieldInputStream.html – deepy

1

sadece sadece tutan değişken

+0

Bu Eclipse ile tarayıcı asla kapalı olmadığına dair bir uyarı verir, bunu göz ardı etmek güvenli midir? – deepy

+0

Bence geliştirilebilir bir programlama tarzı. Programcı, kapalı olması gereken açık kaynakları bırakabilir. –

11

kullanmak:

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

kabul edilen cevaptan daha basit bir şekilde! Teşekkürler. –

+2

Bu, Commons'ın [CloseShieldInputStream] (http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/input/CloseShieldInputStream.html) ne işe yaradığını ve sonuçta sona erdiklerini Bu pozisyonda, yazılımınızın tasarımına başka bir göz atmak isteyebilirsiniz. Üçüncü taraf çözümlerle çalışmadığınız sürece buna benzer bir çözüm gerekli olmamalıdır. (Buradaki tüm cevaplar için geçerlidir) – deepy

İlgili konular