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.