"¡Hola, amigo! Ayer Rishi te habló sobre FileInputStream y FileOutputStream . Y hoy te hablaré sobre las clases FileReader y FileWriter ".

Como probablemente ya hayas adivinado, todas estas clases son adaptadores entre el objeto File y las «interfaces» InputStream , OutputStream , Reader y Writer .

"Son similares a los adaptadores entre File y Reader/Writer, pero solo necesita pasar un objeto String al constructor, ¡no un File!"

"En realidad, tienen varios constructores. Hay constructores para los objetos File y String. Si pasa un objeto String al constructor, este creará silenciosamente un objeto File usando la ruta del archivo tomada del objeto String pasado".

Esto es por conveniencia. Los creadores de Java tomaron los casos de uso más frecuentes para estas clases y escribieron constructores para todos ellos. Eso es bastante conveniente, ¿no crees?

"Oh, sí. Conveniente. Estoy de acuerdo. Pero, ¿por qué entonces tengo que escribir constantemente:"
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
"¿Por qué no agregaron este caso de uso?"

"El problema aquí es que un   programa típico de Java no funciona con la consola. En verdad, casi nunca lees nada de él. Incluso con un servidor web, un servidor de aplicaciones o algún otro sistema complicado".

Pero tenemos PrintStream para enviar datos y texto a la consola. Porque estas «aplicaciones de servidor» a menudo usan la consola para mostrar su estado, errores y todo tipo de información.

"Entendido. ¿Y también puedes copiar un archivo usando FileReader y FileWriter?"

"Sí, si es un archivo de texto (es decir, consta de caracteres). He aquí un ejemplo:"

Copiar un archivo en el 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();
}

"Casi no hay diferencias".

"Sí, las diferencias son mínimas".