Domanda

Sto leggendo un file locale utilizzando un BufferedReader avvolto intorno ad un FileReader:

BufferedReader reader = new BufferedReader(new FileReader(fileName));
// read the file
// (error handling snipped)
reader.close();

Devo close() la FileReader così, o sarà il wrapper gestire questo? Ho visto il codice in cui le persone fanno qualcosa di simile a questo:

FileReader fReader = new FileReader(fileName);
BufferedReader bReader = new BufferedReader(fReader);
// read the file
// (error handling snipped)
bReader.close();
fReader.close();

Questo metodo viene chiamato da un servlet, e vorrei essere sicuro di non lasciare qualsiasi handle aperti.

È stato utile?

Soluzione

no.

BufferedReader.close()

chiude il flusso secondo javadoc per BufferedReader e InputStreamReader

così come

FileReader.close()

fa.

Altri suggerimenti

Come altri hanno fatto notare, è sufficiente chiudere l'involucro esterno.

BufferedReader reader = new BufferedReader(new FileReader(fileName));

C'è una probabilità molto sottile che questo potrebbe perdere un handle di file se il costruttore BufferedReader ha generato un'eccezione (ad esempio OutOfMemoryError). Se la vostra applicazione è in questo stato, come attento tua su pulito ha bisogno di essere potrebbe dipendere da quanto sia importante che non si privano il sistema operativo delle risorse si potrebbe desiderare di destinare ad altri programmi.

L'interfaccia Closeable può essere utilizzato se un costruttore involucro rischia di fallire in Java 5 o 6:

Reader reader = new FileReader(fileName);
Closeable resource = reader;
try {
  BufferedReader buffered = new BufferedReader(reader);
  resource = buffered;
  // TODO: input
} finally {
  resource.close();
}

codice Java 7 dovrebbe usare il try-con-le risorse modello:

try (Reader reader = new FileReader(fileName);
    BufferedReader buffered = new BufferedReader(reader)) {
  // TODO: input
}

Secondo fonte BufferedReader, in questo caso bReader.close chiamare fReader.close quindi tecnicamente non devi chiamare quest'ultimo.

Il codice sorgente per BufferedReader mostra che la sottostante è chiuso quando si chiude il BufferedReader.

Dopo aver controllato il codice sorgente, ho trovato che per l'esempio:

FileReader fReader = new FileReader(fileName);
BufferedReader bReader = new BufferedReader(fReader);

il metodo close () BufferedReader oggetto potrebbe chiamare il metodo astratto close () Reader classe che finirebbe chiamare il metodo implementato in InputStreamReader classe, che quindi chiude la InputStream oggetto.

Quindi, solo bReader.close () è sufficiente.

A partire da Java 7 è possibile utilizzare try-con-le risorse Statement

try (BufferedReader br = new BufferedReader(new FileReader(path))) {
    return br.readLine();
}

Perché l'istanza BufferedReader è dichiarata in un'istruzione try-with-risorsa, sarà chiusa indipendentemente dal fatto che l'istruzione try completa normalmente o bruscamente. Quindi non c'è bisogno di chiudere da soli nella dichiarazione finally. (Questo è anche il caso di dichiarazioni di risorsa nidificate)

Questo è il modo recomanded di lavorare con le risorse, vedere i href="https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html" per informazioni più dettagliate

Hai solo bisogno di chiudere il BufferedReader cioè reader.close () e funzionerà bene.

Sono in ritardo, ma:

BufferReader.java:

public BufferedReader(Reader in) {
  this(in, defaultCharBufferSize);
}

(...)

public void close() throws IOException {
    synchronized (lock) {
        if (in == null)
            return;
        try {
            in.close();
        } finally {
            in = null;
            cb = null;
        }
    }
}

Non è necessario chiudere il lettore / scrittore avvolto.

Se hai preso uno sguardo ai documenti ( Reader.close() , Writer.close() ), vedrai che in Reader.close() si dice:

  

Chiude il flusso e rilascia tutte le risorse di sistema ad esso associati.

Il che dice che si "rilascia tutte le risorse di sistema associati con essa". Anche se non conferma .. ti dà una piccola spinta per iniziare la ricerca più profonda. e se si va a Writer.close() si afferma solo che si chiude.

In questi casi, si fa riferimento a OpenJDK per dare un'occhiata al codice sorgente.

A BufferedWriter linea 265 vedrete out.close(). Quindi non sta chiudendo in sé .. E 'qualcosa di diverso. Se si cerca la classe per occorrenze di "out" si noterà che nel costruttore all'indirizzo linea 87 che out è lo scrittore della classe avvolge in cui chiede un altro costruttore e quindi l'assegnazione dei parametri out ad essa la propria variabile out. .

Quindi .. Che dire degli altri? Si può vedere il codice simile a BufferedReader linea 514 , BufferedInputStream linea 468 e InputStreamReader linea 199 . Altri non lo so, ma questo dovrebbe essere sufficiente per ritenere che lo fanno.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top