"Bună, Amigo! Ieri, Rishi ți-a povestit despre FileInputStream și FileOutputStream . Și astăzi vă voi vorbi despre clasele FileReader și FileWriter ."

După cum probabil ați ghicit deja, toate aceste clase sunt adaptoare între obiectul Fișier și „interfețele” InputStream , OutputStream , Reader și Writer .

„Sunt similare cu adaptoarele dintre File și Reader/Writer, dar trebuie să treceți doar un obiect String constructorului, nu un fișier!”

"De fapt, ei au mai mulți constructori. Există constructori atât pentru obiecte File, cât și pentru String. Dacă treceți un obiect String constructorului, atunci constructorul va crea în liniște un obiect File folosind calea fișierului luată de la obiectul String transmis."

Acest lucru este pentru comoditate. Creatorii Java au luat cele mai frecvente cazuri de utilizare pentru aceste clase și au scris constructori pentru toate. E destul de convenabil, nu crezi?

"Oh, da. Convenabil. Sunt de acord. Dar atunci de ce trebuie să scriu constant:"
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
„De ce nu au adăugat acest caz de utilizare?”

„Problema aici este că un   program tipic Java nu funcționează cu consola. De fapt, aproape niciodată nu citești nimic din el. Chiar și cu un server web, un server de aplicații sau un alt sistem complicat.”

Dar avem PrintStream pentru a trimite date și text în consolă. Deoarece aceste „aplicații server” folosesc adesea consola pentru a-și afișa starea, erorile și tot felul de alte informații.

"Am înțeles. Și puteți copia și un fișier folosind FileReader și FileWriter?"

„Da, dacă este un fișier text (adică este format din caractere). Iată un exemplu:”

Copiați un fișier pe disc
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();
}

— Aproape fără diferențe.

— Da, diferențele sunt minime.