In realtà a te serve un thread che faccia la lettura del file.
Se l'applicazione è visuale (cioè, possiede una GUI), generalmente il thread principale in esecuzione è l'EDT (Event Dispatch Thread), cioè il thread che si occupa di gestire gli eventi dei controlli visuali. Per questo, tutto ciò che è "lavoro pesante" (e l'I/O lo è per sua natura) va spostato in un thread separato in modo che l'EDT non venga mai impegnato per troppo tempo (pena un congelamento della GUI).
Poi, per poter visualizzare una ProgressBar che faccia vedere a che punto si è con la lettura del file, è necessario conoscere la dimensione del file. Quindi, per prima cosa bisognerà ottenere questa informazione e passarla alla JProgressBar, in modo che sappia gestirsi.
A questo punto, il tuo Thread dovrebbe ottenere un riferimento alla JProgressBar (o alla classe che la possiede), in modo da poterle comunicare, passo passo, a che punto è con la lettura del file.
Un modello semplice è il seguente:
codice:
// Nella classe che possiede la ProgressBar
JProgressBar progress = new JProgressBar( ... );
File f = new File( ... ); // Il file che il thread dovrà leggere
// Imposto il massimo alla dimensione (in byte) del file
progress.setMaximum((int) f.length());
// Avvio il thread passandogli il file da leggere e la progress bar
ThreadLettore tl = new ThreadLettore(f, progress);
tl.start();
Il thread lettore dovrà semplicemente leggere il file a blocchi, fare ciò che deve con ciò che ha letto e aggiornare la progress bar
codice:
// Il Thread Lettore
private JProgressBar progress;
private File file;
...
public void run() {
...
FileInputStream fis = new FileInputStream( file );
byte[] buffer = new byte[4096]; // 4 KB di buffer
int byteLetti = 0;
while((byteLetti = fis.read(buffer)) >= 0) {
// Ho letto "byteLetti" bytes di dati
... // Ci faccio quello che devo con quei dati
// Aggiorno la progressBar
progress.setValue( progress.getValue() + byteLetti );
}
fis.close();
...
}
Ciao.