PDA

View Full Version : [Java] Interrompere un'operazione IO


malocchio
18-06-2009, 09:52
Sto scrivendo un sistema di importazione/esportazione contenuti. Per quanto riguarda il codice che effettivamente si occupa di copiare i dati, vorrei poter impostare un limite di tempo terminato il quale l'operazione si ferma, riuscendo a chiudere correttamente tutti i flussi di IO e senza errori tipo file corrotti eccetera (esempio sparato).

Secondo voi qual'è il metodo migliore?

Tenendo conto che l'IO si può fare da/verso database/file...

Ho dato un'occhiata al Javadoc del Thread, avendo un'idea di interrompere il thread che esegue la copia e chiudere i file e connessioni con un trycatch ma non so a che metodi ed eccezioni mi devo attaccare di preciso.


Grazie

PGI-Bis
18-06-2009, 16:10
Per interrompere immediatamente la scrittura-lettura chiudi il flusso e cattura l'eccezione rilasciata quando cerchi di scrivere o leggere su un flusso chiuso.

Se stai scrivendo qualcosa, ad esempio un file, ovviamente questo corrompe il file nel senso che il suo contenuto non è completo. Poi è possibile che la parte scritta sia comunque un dato valido, dipende dalla natura delle informazioni che scrivi (un file di testo semplice sarà sempre valido, un file di testo formattato probabilmente mai).

L'interruzione di un Thread funziona esattamente come una condizione di controllo con in più la capacità di "svegliare" un Thread addormentato attraverso una InterruptedException. Il fatto che sia una condizione di controllo ti obbliga, nel caso in cui tu voglia usare interrupt(), ad una verifica periodica della condizione stessa (Thread.interrupted()) per decidere se proseguire o no con la lettura/scrittura. Il che significa anche dover frazionare il procedimento di lettura/scrittura, in modo tale da poterci mettere in mezzo un "if(condizione) fermati".

malocchio
18-06-2009, 17:04
Per interrompere immediatamente la scrittura-lettura chiudi il flusso e cattura l'eccezione rilasciata quando cerchi di scrivere o leggere su un flusso chiuso.

Se stai scrivendo qualcosa, ad esempio un file, ovviamente questo corrompe il file nel senso che il suo contenuto non è completo. Poi è possibile che la parte scritta sia comunque un dato valido, dipende dalla natura delle informazioni che scrivi (un file di testo semplice sarà sempre valido, un file di testo formattato probabilmente mai).

L'interruzione di un Thread funziona esattamente come una condizione di controllo con in più la capacità di "svegliare" un Thread addormentato attraverso una InterruptedException. Il fatto che sia una condizione di controllo ti obbliga, nel caso in cui tu voglia usare interrupt(), ad una verifica periodica della condizione stessa (Thread.interrupted()) per decidere se proseguire o no con la lettura/scrittura. Il che significa anche dover frazionare il procedimento di lettura/scrittura, in modo tale da poterci mettere in mezzo un "if(condizione) fermati".

Grazie, sei stato molto chiaro... in pratica ho implementato una cosa del genere (flag di controllo) senza però avviare un thread staccato.
Stavo cercando in particolare di riuscire a terminare il thread sul momento senza interrompere operazioni di IO, ma non è possibile.
Opterò per una via di mezzo: con un flag controllo l'esecuzione del ciclo di copia di ogni record e in più, tramite un altro timer, controllo che effettivamente il 3d sia terminato, altrimenti vado di interrupt(), bloccando eventuali operazioni di IO in corso.