La prima soluzione alternativa è quella di fare un ciclo in cui la condizione è sempre vera, e poi usare break quando viene letto il valore -1. Questa soluzione viene implementata nel programma FineBreak.java riportato qui sotto.
import java.io.*;
class FineBreak {
public static void main(String args[])
throws IOException {
FileReader fr;
fr=new FileReader("prova.txt");
int x=0;
char c;
while(true) {
x=fr.read();
if(x==-1)
break;
c=(char) x;
System.out.println(c);
}
}
}
Una soluzione alternativa è quella di leggere il primo carattere, e poi entrare nel ciclo. A ogni passo, viene prima stampato il carattere letto in precedenza e poi letto un nuovo carattere. Questa soluzione è implementata dal programma FineDopo.java
import java.io.*;
class FineDopo {
public static void main(String args[])
throws IOException {
FileReader fr;
fr=new FileReader("prova.txt");
int x;
char c;
x=fr.read();
while(x!=-1) {
c=(char) x;
System.out.println(c);
x=fr.read();
}
}
}
Questa soluzione funziona nel modo seguente: prima viene letto un carattere. Se il file non è finito (cosa che potrebbe avvenire dato che il file potrebbe anche essere vuoto, ossia contenere zero caratteri), si entra nel ciclo. A ogni esecuzione del corpo del ciclo, viene prima stampato il carattere letto in precedenza e poi letto un nuovo carattere (che verrà poi stampato nella successiva iterazione del ciclo). Quando viene letto il valore -1, il ciclo termina, quindi non ci sono iterazioni successive in cui il valore -1 verrebbe stampato.
Un metodo alternativo è quello di usare i cicli do-while, e viene visto di seguito.