"Olá, amigo! Ontem Rishi falou sobre FileInputStream e FileOutputStream . E hoje vou falar sobre as classes FileReader e FileWriter ."

Como você provavelmente já adivinhou, todas essas classes são adaptadores entre o objeto File e as «interfaces» InputStream , OutputStream , Reader e Writer .

"Eles são semelhantes aos adaptadores entre File e Reader/Writer, mas você só precisa passar um objeto String para o construtor, não um File!"

"Na verdade, eles têm vários construtores. Existem construtores para objetos File e String. Se você passar um objeto String para o construtor, o construtor criará silenciosamente um objeto File usando o caminho de arquivo obtido do objeto String passado."

Isso é por conveniência. Os criadores de Java pegaram os casos de uso mais frequentes para essas classes e escreveram construtores para todos eles. Isso é muito conveniente, você não acha?

"Ah, sim. Conveniente. Concordo. Mas por que então tenho que escrever constantemente:"
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
"Por que eles não adicionaram este caso de uso?"

"A questão aqui é que um   programa Java típico não funciona com o console. Na verdade, você quase nunca lê nada dele. Mesmo com um servidor web, servidor de aplicativos ou algum outro sistema complicado."

Mas temos PrintStream para enviar dados e texto para o console. Porque esses "aplicativos de servidor" geralmente usam o console para exibir seu status, erros e todos os tipos de outras informações.

"Entendi. E você também pode copiar um arquivo usando FileReader e FileWriter?"

"Sim, se for um arquivo de texto (ou seja, consiste em caracteres). Aqui está um exemplo:"

Copiar um arquivo no 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();
}

"Quase nenhuma diferença."

"Sim, as diferenças são mínimas."