"Ciao, Amigo! Ieri Rishi ti ha parlato di FileInputStream e FileOutputStream . E oggi ti parlerò delle classi FileReader e FileWriter ."

Come probabilmente avrai già intuito, tutte queste classi sono adattatori tra l'oggetto File e le «interfacce» InputStream , OutputStream , Reader e Writer .

"Sono simili agli adattatori tra File e Reader/Writer, ma devi solo passare un oggetto String al costruttore, non un File!"

"In realtà, hanno diversi costruttori. Ci sono costruttori sia per gli oggetti File che per quelli String. Se passi un oggetto String al costruttore, allora il costruttore creerà tranquillamente un oggetto File usando il percorso del file preso dall'oggetto String passato."

Questo è per comodità. I creatori di Java hanno preso i casi d'uso più frequenti per queste classi e hanno scritto costruttori per tutti loro. È abbastanza conveniente, non credi?

"Oh, sì. Conveniente. Sono d'accordo. Ma perché allora devo scrivere costantemente:"
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
"Perché non hanno aggiunto questo caso d'uso?"

"Il problema qui è che un   tipico programma Java non funziona con la console. In verità, non leggi quasi mai nulla da esso. Anche con un server web, un server applicativo o qualche altro sistema complicato."

Ma abbiamo PrintStream per inviare dati e testo alla console. Perché queste "applicazioni server" spesso usano la console per visualizzare il loro stato, errori e ogni sorta di altra informazione.

"Capito. E puoi anche copiare un file usando FileReader e FileWriter?"

"Sì, se si tratta di un file di testo (cioè composto da caratteri). Ecco un esempio:"

Copia un file su disco
public static void main(String[] args) throws Exception
{
 FileReader reader = new FileReader("c:/data.txt");
 FileWriter writer = new FileWriter("c:/result.txt");

 while (reader.ready()) //as long as there are unread bytes in the input stream
 {
  int data = reader.read(); //Read one character (the char will be widened to an int)
  writer.write(data); //Write one character (the int will be truncated/narrowed to a char)
 }

 //Close the streams after we done using them
 reader.close();
 writer.close();
}

"Quasi nessuna differenza."

"Sì, le differenze sono minime."