2012-12-25 10 views
5

Uso la libreria Xerces per l'analisi di XML. Ecco lo snippet di codice per l'analisi:Devo chiudere manualmente Input Stream?

Documento doc = builder.parse (new InputSource (new StringReader (someXMLString)));

Devo chiudere il InputStream in InputSource manualmente o sarà il metodo parse gestirlo?

risposta

2

Sembra che non ci sia nulla in DocumentBuilder API a riguardo. Siamo in grado di testare come

InputStream is = new FileInputStream("test.xml") { 
    @Override 
    public void close() throws IOException { 
     System.out.println("close"); 
     super.close(); 
    } 
}; 
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
DocumentBuilder documentBuilder = dbf.newDocumentBuilder(); 
documentBuilder.parse(is); 

la stampa close. Ma poiché non c'è nulla in API a riguardo, questo comportamento non è garantito.

0

Se si utilizza try-with, è possibile lasciare che java lo richieda per voi. Altrimenti raccomanderei di chiuderlo manualmente.

+0

Si noti che è necessario farlo su 'StringReader' come' InputSource' non è 'AutoCloseable' –

0

InputStream dovrebbe essere chiuso, in quanto metodo close():

chiude questo flusso di input e rilascia tutte le risorse di sistema associate al flusso.

E 'non importa è il vostro flusso utilizza risorse o no - è buon modo per chiuderla. Giusto per essere sicuro.

6

Dato che non ci sono risorse esterne - solo un StringReader - non è necessario per chiuderlo. Lo farei comunque comunque ... se poi cambi il codice per usare un input diverso, non perderesti per caso una perdita di risorse.

(per il codice usa e getta solo, mi piacerebbe lascio -. Ma essere consapevoli che se non stai attento, il codice usa e getta ha l'abitudine di vivere più a lungo del previsto)

0

InputSource è solo conveniente classe wrapper su flusso, quindi non chiude il flusso al suo interno.

1

Dovresti chiuderlo da solo.

Il metodo builder.parse non chiude il flusso nella sua implementazione. Non saprà quando è opportuno chiudere il flusso, quindi è necessario che il flusso venga chiuso manualmente.