2012-07-26 17 views
13

La mia app scrive costantemente carichi di byte su un file. Se un blocco del mio codice sta scrivendo byte e ottiene una IOException se la connessione all'unità o alla rete è persa, come faccio a sapere quanti byte ha scritto?Gestione IOException durante la scrittura di file in java

Ad esempio, sto scrivendo 2500 byte alla volta e se si verifica IOException significa che non ha scritto nulla sul file o che avrebbe scritto byte parziali nel file? Se byte parziali sono scritte nel file come sono io per sapere quanto è scritto

FYI sto usando

DataOutputStream 

di scrivere i file. Arrossisco solo quando la mia app si chiude.

+0

Quale metodo si utilizza per scrivere nel file? Sono abbastanza sicuro che qualcosa come BufferedOutputStream possa darti un risultato diverso da un OutputStream. – xthexder

+0

puoi anche controllare http://stackoverflow.com/questions/1742361/flush-in-java-io-filewriter, questo può anche aiutarti – MaVRoSCy

risposta

6

Non è possibile, IOException può accadere in qualsiasi momento. Se ci pensate, IOException può essere causato da un errore software o hardware in qualsiasi momento, prima che il primo byte fosse scritto, dopo che tutti erano stati scritti ma qualcosa accadeva alla connessione - o nel mezzo se il blocco dati era piuttosto grande.

Dopo la riconnessione, è necessario verificare le dimensioni del file o utilizzare un'altra tecnica per mantenere i file in uno stato coerente e ripristinare. La rete di sicurezza più semplice: leggere le dimensioni del file prima di scrivere i dati e memorizzarli in modo affidabile, scrivere i dati e leggere le dimensioni del file dopo la scrittura. Se si verifica un errore e la dimensione del file corrente non è uguale alla dimensione del file prevista (ultima archiviazione), troncare i byte aggiuntivi e riprovare.

Leggere i registri delle transazioni nei database relazionali per vedere come il software grande e affidabile gestisce tali casi.

1

Dipende da come riesce la scrittura, ma l'InterruptedIOException può essere quello che stai cercando:

http://docs.oracle.com/javase/1.4.2/docs/api/java/io/InterruptedIOException.html

Esso contiene un campo per "bytesTransferred": "Rapporti quanti byte erano stati trasferito come parte dell'operazione I/O prima che venisse interrotto. "

+0

Questo è il tipo di eccezione che stavo cercando, sperimenterò e riferirò se provi a prendere funziona !! Grazie – Vig

+0

Potrebbe essere. Ma questo è per ogni operazione di I/O, e non l'intero trasferimento se non sbaglio ... –

+0

Questa eccezione si applica solo se il thread è stato interrotto, non se c'era un vero problema di I/O come l'OP sta chiedendo. – EJP

Problemi correlati