2009-11-16 10 views
26

Ho una domanda nella mia mente che, mentre si scrive nel file, prima che la chiusura sia terminata, dovremmo includere flush() ??. Se sì, cosa farà esattamente? non flussi auto a livello ?? MODIFICA:flush in java.io.FileWriter

Quindi svuota quello che effettivamente fa?

risposta

18

I masterizzatori e gli stream di solito tamponano alcuni dei dati di output in memoria e provano a scriverli in blocchi più grandi per volta, lo svuotamento causerà un'immediata scrittura su disco dal buffer, quindi se il programma si blocca i dati non andranno persi Naturalmente non c'è alcuna garanzia, dal momento che il disco potrebbe non scrivere fisicamente i dati immediatamente, quindi potrebbe essere comunque perso. Ma non sarebbe colpa del programma Java :)

PrintWriter un uto-flush (per impostazione predefinita) quando si scrive un fine riga e, naturalmente, flussi e buffer scorrono quando vengono chiusi. Oltre a ciò, c'è lo svuotamento solo quando il buffer è pieno.

+0

La dimensione del buffer è dinamica/statica ?? – i2ijeya

+0

Non importa? È il buffer di Java, non il tuo. Ho guardato ma non ho trovato il modo di impostarlo o modificarlo. Penso che tu debba accettare il comportamento di buffering dei flussi come indicato. –

+14

I PrintWriter non si svuotano automaticamente per impostazione predefinita. Per ottenerne uno automatico, devi chiedere esplicitamente usando il costruttore PrintWriter (OutputStream, booleano). – Aaron

2

Chiude automaticamente gli scarichi. Non è necessario chiamarlo.

11

Non è necessario eseguire un flush perché close() lo farà per te.

Dal javadoc:.

"Chiudere il flusso, vampate di calore prima volta che un flusso è stato chiuso, ulteriori write() o flush() invocazioni causeranno un'IOException per essere gettato Chiusura di una precedentemente chiusa. flusso, tuttavia, non ha alcun effetto. "

+2

l'unica volta che io abbia mai usare colore è se sto utilizzando il flusso in una sorta di comunicazione tra processi. per esempio, forse un unico processo sta scrivendo su una pipe denominata e l'altra sta leggendo da essa. Non voglio chiudere l'handle del file alla pipe perché scriverò più tardi, ma voglio assicurarmi che tutti i dati siano stati scaricati nella pipe denominata così che l'altro processo ce l'ha. – Benj

1

Non ha senso chiamare flush() appena prima di close(), come altri hanno già detto. Il tempo di utilizzare flush() è se si mantiene aperto il file ma si desidera assicurarsi che le scritture precedenti siano state completate completamente.

+0

Cosa farà per garantire che le scritture del file siano state completate completamente? – i2ijeya

4

Per rispondere alla tua domanda su cosa sia effettivamente lo svuotamento, si assicura che tutto ciò che hai scritto sullo stream - un file nel tuo caso - venga effettivamente scritto sul file lì e poi.

Java può eseguire il buffering, il che significa che manterrà i dati scritti in memoria fino a quando non avrà una certa quantità, e quindi scriverli tutti sul file in una volta, che è più efficiente. Lo svantaggio di questo è che il file non è necessariamente aggiornato in un dato momento. Flush è un modo per dire "aggiorna il file

Chiudi le chiamate per primo per assicurarsi che dopo aver chiuso il file abbia ciò che ci si aspetterebbe di vedere in esso, quindi come altri hanno sottolineato, non è necessario prima di chiudere

1

Come detto, di solito non è necessario svuotare.

Ha senso solo se, per qualche motivo, si desidera che un altro processo visualizzi il contenuto completo di un file con cui si sta lavorando, senza chiuderlo. Ad esempio, potrebbe essere utilizzato per un file modificato contemporaneamente da più processi, anche se con molta cura :-)

20

Consiglio vivamente di chiamare a filo prima di chiudere. Fondamentalmente scrive i restanti dati tamponati nel file.

Se si chiama flush esplicitamente si può essere certi che qualsiasi IOException che esce da close è davvero catastrofico e correlato al rilascio di risorse di sistema.

Quando si è flush da soli, è possibile gestire il suo IOException nello stesso modo in cui si gestiscono le eccezioni di scrittura dei dati.

1

FileWriter è una classe malvagia che recupera qualsiasi set di caratteri che si trova lì, piuttosto che prendere un set di caratteri esplicito. Anche se vuoi il default, sii esplicito al riguardo.

La soluzione usuale è OutputStreamWriter e FileOutputStream. È possibile per il decoratore lanciare un'eccezione. Pertanto è necessario essere in grado di chiudere lo stream anche se lo scrittore non è mai stato costruito. Se hai intenzione di farlo, devi solo svuotare lo scrittore (nel caso felice) e chiudere sempre lo stream. (Giusto per essere confusi, alcuni decoratori, ad esempio per la gestione delle cerniere, hanno risorse che richiedono la chiusura.)

1

Un altro caso per lo svuotamento del programma è la scrittura del processo di longrunning nel file (quindi può essere arrestato e riavviato in un secondo momento). . si vuole essere sicuri che i dati siano al sicuro sul disco.

while (true) { 
    computeStuff(); 
    progresss += 1; 
    out.write(String.format("%d", progress)); 
    out.flush(); 
} 
out.close();