« Bonjour, Amigo ! Hier, Rishi t'a parlé de FileInputStream et FileOutputStream. Et aujourd'hui, je vais te parler des classes FileReader et FileWriter. »

Comme tu l'as probablement déjà deviné, toutes ces classes sont des adaptateurs entre l'objet File et les 'interfaces' InputStream, OutputStream, Reader et Writer.

« Ils sont semblables à des adaptateurs entre File et Reader/Writer, mais il te suffit de passer un objet String au constructeur, pas un File ! »

« En fait, ils ont plusieurs constructeurs. Il y a des constructeurs aussi bien pour les objets String que File. Si tu passes un objet String au constructeur, le constructeur va simplement créer un objet File en utilisant le chemin du fichier représenté par l'objet String passé. »

C'est juste un souci de commodité. Les créateurs de Java ont pris les cas d'utilisation les plus fréquents pour ces classes et écrit des constructeurs pour chacun. C'est plutôt pratique, tu ne trouves pas ?

« Oh oui. Pratique. Tout à fait d’accord. Mais alors pourquoi je dois constamment écrire : »
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
« Pourquoi n'ajoutent-ils pas ce cas d'utilisation ? »

« Le problème ici est qu'un  programme Java typique ne travaille pas avec la console. En fait, tu n'y lis presque jamais rien. Même avec un serveur Web, un serveur d'applications ou un autre système complexe. »

Mais nous avons PrintStream pour envoyer des données et du texte dans la console. Car ces 'applications serveur' utilisent souvent la console pour afficher leur statut, les erreurs et toutes sortes d'autres informations.

« J'ai compris. Et tu peux également copier un fichier avec FileReader et FileWriter ? »

« Oui, si c'est un fichier texte (qu'il se compose de caractères). Voici un exemple : »

Copier un fichier sur le disque
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();
}

« Presque aucune différence. »

« Oui, les différences sont minimes. »