{"id":57,"date":"2017-09-09T15:34:48","date_gmt":"2017-09-09T15:34:48","guid":{"rendered":"https:\/\/wp-systeme.lip6.fr\/potop-butucaru\/?p=57"},"modified":"2023-04-03T16:12:03","modified_gmt":"2023-04-03T16:12:03","slug":"entrees-sorties","status":"publish","type":"post","link":"https:\/\/wp-systeme.lip6.fr\/potop-butucaru\/2017\/09\/09\/entrees-sorties\/","title":{"rendered":"Entr\u00e9es\/Sorties"},"content":{"rendered":"<section>\n<section class=\"toc-pause\">\n<h1>Abstraction<\/h1>\n<\/section>\n<section>\n<h2>Abstraction<\/h2>\n<p>Un programme int\u00e9ragie avec le monde ext\u00e9rieur:<\/p>\n<ul>\n<li class=\"fragment\">ses actions d\u00e9pendent des param\u00e8tre re\u00e7us, des ordres re\u00e7us, des \u00e9v\u00e9nements se produisant pendant son ex\u00e9cution, etc&#8230;<\/li>\n<li class=\"fragment\">les calculs effectu\u00e9s par le programme servent \u00e0 d\u00e9clancher des \u00e9v\u00e9nements ou sont transmis \u00e0 l&#8217;utilisateur ou \u00e0 d&#8217;autres programmes.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p class=\"fragment\"><b>D\u00e9finition : <\/b><i>On appelle Entre\u0301es\/Sorties (E\/S) l\u2019ensemble des actions qui servent respectivement a\u0300 recevoir et produire des donne\u0301es quel que soit le type d\u2019interaction utilise\u0301e.<\/i><\/p>\n<\/section>\n<section>\n<h2>Types d&#8217;interactions<\/h2>\n<p class=\"fragment\">E\u0301diter un fichier <i class=\"fa fa-arrow-right\" aria-hidden=\"true\"><\/i><i class=\"fa fa-file-text-o\" aria-hidden=\"true\"><\/i><i class=\"fa fa-arrow-right\" aria-hidden=\"true\"><\/i>Lire un fichier<\/p>\n<p class=\"fragment\">Envoyer un message <i class=\"fa fa-arrow-right\" aria-hidden=\"true\"><\/i><i class=\"fa fa-globe\" aria-hidden=\"true\"><\/i><i class=\"fa fa-arrow-right\" aria-hidden=\"true\"><\/i>Recevoir un message<\/p>\n<p class=\"fragment\">Ajouter une valeur <i class=\"fa fa-arrow-right\" aria-hidden=\"true\"><\/i><i class=\"fa fa-table\" aria-hidden=\"true\"><\/i><i class=\"fa fa-arrow-right\" aria-hidden=\"true\"><\/i>Consulter une valeur<\/p>\n<\/section>\n<section>\n<h2>I\/O Stream<\/h2>\n<p><b>D\u00e9finition : <\/b><i>Un flux d&#8217;entr\u00e9e\/sortie (I\/O Stream en anglais) permet d\u2019encapsuler les envois et les re\u0301ceptions de donne\u0301es de fac\u0327on a\u0300 cacher le support utilise\u0301. Ainsi un me\u0302me code utilisera indiffe\u0301remment : un fichier, le re\u0301seau ou la me\u0301moire.<\/i><\/p>\n<p class=\"fragment hide-with-next-fragment\"><small>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Flux de Sortie\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Flux d&#8217;entr\u00e9e<\/small><br \/>\nEcrire\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <i class=\"fa fa-arrow-right\" aria-hidden=\"true\"><\/i>\u00a0\u00a0\u00a0\u00a0\u00a0 <i class=\"fa fa-question\" aria-hidden=\"true\"><\/i>\u00a0\u00a0\u00a0\u00a0\u00a0 <i class=\"fa fa-arrow-right\" aria-hidden=\"true\"><\/i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Lire<\/p>\n<p class=\"fragment hide-with-next-fragment\"><small>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Flux de Sortie\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Flux d&#8217;entr\u00e9e<\/small><br \/>\nEcrire\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <i class=\"fa fa-arrow-right\" aria-hidden=\"true\"><\/i>\u00a0\u00a0\u00a0\u00a0\u00a0 <i class=\"fa fa-table\" aria-hidden=\"true\"><\/i>\u00a0\u00a0\u00a0\u00a0\u00a0 <i class=\"fa fa-arrow-right\" aria-hidden=\"true\"><\/i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Lire<\/p>\n<p class=\"fragment hide-with-next-fragment\"><small>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Flux de Sortie\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Flux d&#8217;entr\u00e9e<\/small><br \/>\nEcrire\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <i class=\"fa fa-arrow-right\" aria-hidden=\"true\"><\/i>\u00a0\u00a0\u00a0\u00a0\u00a0 <i class=\"fa fa-globe\" aria-hidden=\"true\"><\/i>\u00a0\u00a0\u00a0\u00a0\u00a0 <i class=\"fa fa-arrow-right\" aria-hidden=\"true\"><\/i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Lire<\/p>\n<p class=\"fragment\"><small>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Flux de Sortie\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Flux d&#8217;entr\u00e9e<\/small><br \/>\nEcrire\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <i class=\"fa fa-arrow-right\" aria-hidden=\"true\"><\/i>\u00a0\u00a0\u00a0\u00a0\u00a0 <i class=\"fa fa-file-text-o\" aria-hidden=\"true\"><\/i>\u00a0\u00a0\u00a0\u00a0\u00a0 <i class=\"fa fa-arrow-right\" aria-hidden=\"true\"><\/i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Lire<\/p>\n<\/section>\n<section>\n<h2>Les types de flux<\/h2>\n<p>Les flux d&#8217;entr\u00e9e\/sortie sont des classes permettant d&#8217;\u00e9crire ou de lire des octets ou des caract\u00e8res (depuis ou vers une entit\u00e9 quelconque). Ce sont des classes abstraites!!<\/p>\n<table>\n<tbody>\n<tr>\n<td><\/td>\n<td>Input<\/td>\n<td>Output<\/td>\n<\/tr>\n<tr>\n<td>Byte (Octet)<\/td>\n<td><code>InputStream<\/code><\/td>\n<td><code>OutputStream<\/code><\/td>\n<\/tr>\n<tr>\n<td>Character<\/td>\n<td><code>Reader<\/code><\/td>\n<td><code>Writer<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p class=\"fragment\"><small>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0OutputStream\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0InputStream<\/small><br \/>\nEcrire des octets\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <i class=\"fa fa-arrow-right\" aria-hidden=\"true\"><\/i>\u00a0\u00a0\u00a0\u00a0\u00a0 <i class=\"fa fa-file-text-o\" aria-hidden=\"true\"><\/i>\u00a0\u00a0\u00a0\u00a0\u00a0 <i class=\"fa fa-arrow-right\" aria-hidden=\"true\"><\/i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Lire des octets<\/p>\n<p class=\"fragment\"><small>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Writer\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Reader<\/small><br \/>\nEcrire des caract\u00e8res\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <i class=\"fa fa-arrow-right\" aria-hidden=\"true\"><\/i>\u00a0\u00a0\u00a0\u00a0\u00a0 <i class=\"fa fa-file-text-o\" aria-hidden=\"true\"><\/i>\u00a0\u00a0\u00a0\u00a0\u00a0 <i class=\"fa fa-arrow-right\" aria-hidden=\"true\"><\/i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Lire des caract\u00e8res<\/p>\n<\/section>\n<section>\n<h3>Lecture d&#8217;Octets avec <code>InputStream<\/code><\/h3>\n<p><a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/io\/InputStream.html\" target=\"_blank\" rel=\"noopener\">documentation<\/a><\/p>\n<p class=\"fragment\"><code>int read() throws IOException<\/code> lecture d&#8217;un octet<\/p>\n<ul class=\"fragment\">\n<li><span class=\"fragment highlight-red\">bloque jusqu&#8217;a ce q&#8217;un octet soit disponible<\/span><\/li>\n<li>l&#8217;octet lu est retourn\u00e9 sous forme d&#8217;un entier<\/li>\n<li>retourne -1 si la fin du flux est atteinte<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p class=\"fragment\"><code>void close() throws IOException<\/code> : fermeture du flux.<\/p>\n<\/section>\n<section>\n<h3>Lecture d&#8217;Octets avec <code>InputStream<\/code><\/h3>\n<p class=\"fragment\"><code>int read(byte[] b, int off, int len) throws IOException<\/code><\/p>\n<ul class=\"fragment\">\n<li><span class=\"fragment highlight-red\">bloque jusqu&#8217;\u00e0 ce q&#8217;un octet soit disponible<\/span><\/li>\n<li>les octets lus (<code>len<\/code> au maximum) sont plac\u00e9s dans le tableau (a partir de la position <code>off<\/code>)<\/li>\n<li>retourne le nombre d&#8217;octets lus<\/li>\n<li>retourne -1 si aucun octet n&#8217;a \u00e9t\u00e9 lu et si la fin du flux est atteinte<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p class=\"fragment\"><code>int read(byte[] b) throws IOException<\/code>: identique \u00e0 <code>read(b, 0, b.length)<\/code><\/p>\n<\/section>\n<section>\n<h3>Ecriture d&#8217;Octets avec <code>OutputStream<\/code><\/h3>\n<p><a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/io\/OutputStream.html\" target=\"_blank\" rel=\"noopener\">documentation<\/a><\/p>\n<p class=\"fragment\"><code>void write(int b) throws IOException<\/code> : \u00e9criture d&#8217;un octet<\/p>\n<p class=\"fragment\"><code>void write(byte[] tab) throws IOException<\/code> : \u00e9criture d&#8217;un tableau d&#8217;octets<\/p>\n<p class=\"fragment\"><code>void flush() throws IOException<\/code> : vidage des buffers en for\u00e7ant l&#8217;\u00e9criture.<\/p>\n<p class=\"fragment\"><code>void close() throws IOException<\/code> : fermeture du flux.<\/p>\n<\/section>\n<section>\n<h2>Exemples<\/h2>\n<pre><code class=\"java\" data-trim=\"\">\r\n\/\/ Re\u0301cupe\u0301ration du flux\r\nOutputStream os = ?????? ;\r\n\r\n\/\/ Utilisation du flux\r\nfor (byte b=0; b&lt;5 ;b++)\r\n{\r\n    os.write(b);\r\n    os.write(2*b+1);\r\n}\r\n\/\/ Fermeture du flux\r\nos.close();\r\n                        <\/code><\/pre>\n<\/section>\n<section>\n<h2>Exemples<\/h2>\n<pre><code class=\"java\" data-trim=\"\">\r\n\/\/ Re\u0301cupe\u0301ration du flux\r\nInputStream is = ?????? ;\r\n\/\/ Utilisation du flux\r\nint x,y ;\r\nwhile ((x=is.read())!=-1) {\r\n    y = is.read();\r\n    dessin.trace(x,y);\r\n}\r\n\/\/ Fermeture du flux\r\nis.close();\r\n                        <\/code><\/pre>\n<\/section>\n<section>\n<h3>Lecture de caract\u00e8res avec <code>Reader<\/code><\/h3>\n<p><a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/io\/Reader.html\" target=\"_blank\" rel=\"noopener\">documentation<\/a><\/p>\n<p class=\"fragment\"><code>int read() throws IOException<\/code> lecture d&#8217;un caract\u00e8re<\/p>\n<ul class=\"fragment\">\n<li><span class=\"fragment highlight-red\">bloque jusqu&#8217;a ce q&#8217;un caract\u00e8re soit disponible<\/span><\/li>\n<li>le caract\u00e8re lu est retourn\u00e9 sous forme d&#8217;un entier<\/li>\n<li>retourne -1 si la fin du flux est atteinte<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p class=\"fragment\"><code>void close() throws IOException<\/code> : fermeture du flux.<\/p>\n<\/section>\n<section>\n<h3>Lecture de caract\u00e8res avec <code>Reader<\/code><\/h3>\n<p class=\"fragment\"><code>int read(char[] cbuf, int off, int len) throws IOException<\/code><\/p>\n<ul class=\"fragment\">\n<li><span class=\"fragment highlight-red\">Bloque jusqu&#8217;a ce q&#8217;un caract\u00e8re soit disponible<\/span><\/li>\n<li>les caract\u00e8res lus (<code>len<\/code> au maximum) sont plac\u00e9s dans le tableau (\u00e0 partir de la position <code>off<\/code>)<\/li>\n<li>retourne le nombre de caract\u00e8res lus<\/li>\n<li>retourne -1 si aucun caract\u00e8re n&#8217;a \u00e9t\u00e9 lu et si la fin du flux est atteinte<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p class=\"fragment\"><code>int read(char[] cbuf) throws IOException<\/code>: identique \u00e0 <code>read(cbuf, 0, cbuf.length)<\/code><\/p>\n<\/section>\n<section>\n<h3>Ecriture de caract\u00e8res avec <code>Writer<\/code><\/h3>\n<p><a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/io\/Writer.html\" target=\"_blank\" rel=\"noopener\">documentation<\/a><\/p>\n<p class=\"fragment\"><code>void write(int b) throws IOException<\/code> : \u00e9criture d&#8217;un caract\u00e8re<\/p>\n<p class=\"fragment\"><code>void write(char[] cbuf) throws IOException<\/code> : \u00e9criture d&#8217;un tableau de caract\u00e8res<\/p>\n<p class=\"fragment\"><code>void write(String str) throws IOException<\/code> : \u00e9criture d&#8217;une chaine de caract\u00e8res<\/p>\n<p class=\"fragment\"><code>void flush() throws IOException<\/code> : vidage des buffers en for\u00e7ant l&#8217;\u00e9criture.<\/p>\n<p class=\"fragment\"><code>void close() throws IOException<\/code> : fermeture du flux.<\/p>\n<\/section>\n<section>\n<h2>Exemples<\/h2>\n<pre><code class=\"java\" data-trim=\"\">\r\n\/\/ Re\u0301cupe\u0301ration d\u2019un flux\r\nWriter w = ?????? ;\r\n\/\/ Utilisation du flux\r\nw.write('a');\r\nw.write('b');\r\nw.write(\"cdef\");\r\n\/\/ Fermeture du flux\r\nw.close();\r\n                        <\/code><\/pre>\n<\/section>\n<section>\n<h2>Exemples<\/h2>\n<pre><code class=\"java\" data-trim=\"\">\r\n\/\/ Re\u0301cupe\u0301ration d\u2019un flux\r\nReader r = ?????? ;\r\n\/\/ Utilisation du flux\r\nStringBuffer buff = new StringBuffer();\r\nint i;\r\nwhile ((i=r.read())!=-1) {\r\n    buff.append((char)i);\r\n}\r\n\/\/ Fermeture du flux\r\nr.close();\r\n                        <\/code><\/pre>\n<\/section>\n<\/section>\n<section>\n<section class=\"toc-pause\">\n<h1>Construction de Flux d&#8217;E\/S<\/h1>\n<\/section>\n<section>\n<h2>O\u00f9 sont les flux?<\/h2>\n<p>On distingue deux me\u0301thodes pour obtenir la re\u0301fe\u0301rence d\u2019un flux :<\/p>\n<ul>\n<li class=\"fragment\">Par accesseur : certaines classes de Java posse\u0300dent des flux pour produire ou recevoir des donne\u0301es. Ceux-ci sont accessibles directement (<code>System.in<\/code> et <code>System.out<\/code>) ou au travers d\u2019accesseurs (<code>getInputStream()<\/code> et <code>getOutputStream()<\/code>).<\/li>\n<li class=\"fragment\">Par constructeur : pour les objets qui ne posse\u0300dent pas directement de flux, Java offre pour les construire des classes spe\u0301cifiques a\u0300 chaque support. Toutes ces classes he\u0301ritent d\u2019un des 4 flux de base : <code>InputStream<\/code>, <code>OutputStream<\/code>, <code>Reader<\/code> ou <code>Writer<\/code>.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<\/section>\n<section>\n<h2>Flux standard<\/h2>\n<p>La classe System est pourvue de trois attributs de classe :<\/p>\n<ul>\n<li><code>in<\/code> : un flux qui correspond a\u0300 l\u2019entre\u0301e standard (par de\u0301faut le clavier)<\/li>\n<li><code>out<\/code> : un flux qui correspond a\u0300 la sortie standard (par de\u0301faut la console)<\/li>\n<li><code>err<\/code> : un flux qui correspond a\u0300 la sortie d\u2019erreur (par de\u0301faut la console)<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<pre><code class=\"java\" data-trim=\"\">\r\n\/\/ Lecture sur le clavier\r\nint x = System.in.read();\r\n\r\n\/\/ E\u0301criture sur la console\r\nSystem.out.write(x);\r\n<\/code><\/pre>\n<\/section>\n<section>\n<h2>Flux standard<\/h2>\n<p>Dans le cas de la classe <code>Process<\/code> les flux permettent d\u2019e\u0301crire (resp. de lire) sur l\u2019entre\u0301e standard (resp. la sortie standard) du processus.<\/p>\n<pre><code class=\"java\" data-trim=\"\">\r\n    \/\/ Lancement du programme say (Mac Os)\r\n    Process p = Runtime.getRuntime().exec(\"say\");\r\n    \/\/ Re\u0301cupe\u0301ration du flux d\u2019entre\u0301e standard du programme\r\n    \/\/ ATTENTION : Pour nous c\u2019est un flux de sortie (out)\r\n    OutputStream os = p.getOutputStream();\r\n\r\n    \/\/ Utilisation du flux : comme avec tout OutputStream\r\n    os.write(\"bonjour, comment \u00e7a va?\".getBytes());\r\n\r\n    \/\/ Fermeture du flux (=&gt; arre\u0302t du programme beep)\r\n    os.close();\r\n<\/code><\/pre>\n<\/section>\n<section>\n<h2>Construction de flux<\/h2>\n<table>\n<tbody>\n<tr>\n<td>Source \/ Destination<br \/>\n(De\u0301fini avec un pre\u0301fixe)<\/td>\n<td>Entre\u0301e en Octets<br \/>\n(He\u0301rite de InputStream)<\/td>\n<td>Sortie en Octets<br \/>\n(He\u0301rite de OutputStream)<\/td>\n<\/tr>\n<tr>\n<td>Tableau d\u2019octets en me\u0301moire<\/td>\n<td>ByteArrayInputStream<\/td>\n<td>ByteArrayOutputStream<\/td>\n<\/tr>\n<tr>\n<td>Fichier<\/td>\n<td>FileInputStream<\/td>\n<td>FileOutputStream<\/td>\n<\/tr>\n<tr>\n<td>Pipeline entre deux threads<\/td>\n<td>PipedInputStream<\/td>\n<td>PipedOutputStream<\/td>\n<\/tr>\n<tr>\n<td>Chai\u0302ne de caracte\u0300res<\/td>\n<td>StringBufferInputStream<\/td>\n<td>StringBufferOutputStream<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/section>\n<section>\n<h2>Construction de flux<\/h2>\n<table>\n<tbody>\n<tr>\n<td>Source \/ Destination<br \/>\n(De\u0301fini avec un pre\u0301fixe)<\/td>\n<td>Entre\u0301e en caract\u00e8res<br \/>\n(He\u0301rite de Reader)<\/td>\n<td>Sortie en caract\u00e8res<br \/>\n(He\u0301rite de Writer)<\/td>\n<\/tr>\n<tr>\n<td>Tableau d\u2019octets en me\u0301moire<\/td>\n<td>CharArrayReader<\/td>\n<td>CharArrayWriter<\/td>\n<\/tr>\n<tr>\n<td>Fichier<\/td>\n<td>FileReader<\/td>\n<td>FileWriter<\/td>\n<\/tr>\n<tr>\n<td>Pipeline entre deux threads<\/td>\n<td>PipedReader<\/td>\n<td>PipedWriter<\/td>\n<\/tr>\n<tr>\n<td>Chai\u0302ne de caracte\u0300res<\/td>\n<td>StringReader<\/td>\n<td>StringWriter<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/section>\n<section>\n<h2>Exemples<\/h2>\n<pre class=\"fragment hide-with-next-fragment\"><code class=\"java\" data-trim=\"\">\r\n\/\/ Re\u0301cupe\u0301ration du flux\r\nOutputStream os = ??????;\r\n\r\n\/\/ Utilisation du flux\r\nfor (byte b=0; b&lt;5 ;b++)\r\n{\r\n os.write(b);\r\n os.write(2*b+1);\r\n}\r\n\/\/ Fermeture du flux\r\nos.close();\r\n                     <\/code><\/pre>\n<pre class=\"fragment hide-with-next-fragment\"><code class=\"java\" data-trim=\"\">\r\n\/\/ Re\u0301cupe\u0301ration du flux\r\nOutputStream os = new ByteArrayOutputStream();\r\n\r\n\/\/ Utilisation du flux\r\nfor (byte b=0; b&lt;5 ;b++)\r\n{\r\n os.write(b);\r\n os.write(2*b+1);\r\n}\r\n\/\/ Fermeture du flux\r\nos.close();\r\n                     <\/code><\/pre>\n<pre class=\"fragment\"><code class=\"java\" data-trim=\"\">\r\n\/\/ Re\u0301cupe\u0301ration du flux\r\nOutputStream os = new FileOutputStream(\"\/path\/to\/file.bin\");\r\n\r\n\/\/ Utilisation du flux\r\nfor (byte b=0; b&lt;5 ;b++)\r\n{\r\n    os.write(b);\r\n    os.write(2*b+1);\r\n}\r\n\/\/ Fermeture du flux\r\nos.close();\r\n<\/code><\/pre>\n<pre class=\"fragment hide-with-next-fragment\"><code class=\"java\" data-trim=\"\">\r\n\/\/ Re\u0301cupe\u0301ration du flux\r\nInputStream is = ?????? ;\r\n\/\/ Utilisation du flux\r\nint x,y ;\r\nwhile ((x=is.read())!=-1) {\r\n y = is.read();\r\n dessin.trace(x,y);\r\n}\r\n\/\/ Fermeture du flux\r\nis.close();\r\n<\/code><\/pre>\n<pre class=\"fragment hide-with-next-fragment\"><code class=\"java\" data-trim=\"\">\r\nbyte[] buf = {0, 1, 0, 2};\r\n\/\/ Re\u0301cupe\u0301ration du flux\r\nInputStream is = new ByteArrayInputStream(buf);\r\n\/\/ Utilisation du flux\r\nint x,y ;\r\nwhile ((x=is.read())!=-1) {\r\n y = is.read();\r\n dessin.trace(x,y);\r\n}\r\n\/\/ Fermeture du flux\r\nis.close();\r\n<\/code><\/pre>\n<pre class=\"fragment\"><code class=\"java\" data-trim=\"\">\r\n\/\/ Re\u0301cupe\u0301ration du flux\r\nInputStream is = new FileInputStream(\"\/path\/to\/file.bin\");\r\n\/\/ Utilisation du flux\r\nint x,y ;\r\nwhile ((x=is.read())!=-1) {\r\ny = is.read();\r\ndessin.trace(x,y);\r\n}\r\n\/\/ Fermeture du flux\r\nis.close();\r\n<\/code><\/pre>\n<\/section>\n<section>\n<h2>Exemples<\/h2>\n<pre class=\"fragment hide-with-next-fragment\"><code class=\"java\" data-trim=\"\">\r\n\/\/ Recupe\u0301ration d\u2019un flux\r\nWriter w = ?????????????????? ;\r\n\/\/ Utilisation du flux\r\nw.write('a');\r\nw.write('b');\r\nw.write(\"cdef\");\r\n\/\/ Fermeture du flux\r\nw.close();\r\n                     <\/code><\/pre>\n<pre class=\"fragment hide-with-next-fragment\"><code class=\"java\" data-trim=\"\">\r\n\/\/ Recupe\u0301ration d\u2019un flux\r\nWriter w = new CharArrayWriter();\r\n\/\/ Utilisation du flux\r\nw.write('a');\r\nw.write('b');\r\nw.write(\"cdef\");\r\n\/\/ Fermeture du flux\r\nw.close();\r\n                     <\/code><\/pre>\n<pre class=\"fragment\"><code class=\"java\" data-trim=\"\">\r\n\/\/ Recupe\u0301ration d\u2019un flux\r\nWriter w = new FileWriter(\"\/path\/to\/file.txt\"); ;\r\n\/\/ Utilisation du flux\r\nw.write('a');\r\nw.write('b');\r\nw.write(\"cdef\");\r\n\/\/ Fermeture du flux\r\nw.close();\r\n<\/code><\/pre>\n<pre class=\"fragment hide-with-next-fragment\"><code class=\"java\" data-trim=\"\">\r\n\/\/ Re\u0301cupe\u0301ration d\u2019un flux\r\nReader r = ?????????????????? ;\r\n\/\/ Utilisation du flux\r\nStringBuffer buff = new StringBuffer();\r\nint i;\r\nwhile ((i=r.read())!=-1) {\r\n    buff.append((char)i);\r\n}\r\n\/\/ Fermeture du flux\r\nr.close();\r\n<\/code><\/pre>\n<pre class=\"fragment hide-with-next-fragment\"><code class=\"java\" data-trim=\"\">\r\nchar[] buf = {'h', 'e', 'l', 'l', 'o'};\r\n\/\/ Re\u0301cupe\u0301ration d\u2019un flux\r\nReader r = new CharArrayReader(buf);\r\n\/\/ Utilisation du flux\r\nStringBuffer buff = new StringBuffer();\r\nint i;\r\nwhile ((i=r.read())!=-1) {\r\n    buff.append((char)i);\r\n}\r\n\/\/ Fermeture du flux\r\nr.close();\r\n<\/code><\/pre>\n<pre class=\"fragment\"><code class=\"java\" data-trim=\"\">\r\n\/\/ Re\u0301cupe\u0301ration d\u2019un flux\r\nReader r = new FileReader(\"\/path\/to\/file.txt\");\r\n\/\/ Utilisation du flux\r\nStringBuffer buff = new StringBuffer();\r\nint i;\r\nwhile ((i=r.read())!=-1) {\r\n    buff.append((char)i);\r\n}\r\n\/\/ Fermeture du flux\r\nr.close();\r\n<\/code><\/pre>\n<\/section>\n<\/section>\n<section>\n<section class=\"toc-pause\">\n<h1>Les filtres<\/h1>\n<\/section>\n<section>\n<h3>Les filtres<\/h3>\n<p><b>De\u0301finition : <\/b><i>Pour ajouter des fonctionnalite\u0301s aux flux, Java utilise des classes appele\u0301es filtre suivant le patron de conception (design-pattern) du de\u0301corateur.<\/i><\/p>\n<p class=\"fragment\">Le nom des filtres Java est suffixe\u0301 par l\u2019un des quatre flux de base :<small><\/small><\/p>\n<ul>\n<li class=\"fragment\">ils he\u0301ritent de <code>Filter[FluxBase]<\/code> qui he\u0301rite de <code>[FluxBase]<\/code><\/li>\n<li class=\"fragment\">ils prennent ce flux comme parame\u0300tre de leur constructeur.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p class=\"fragment\">Pour ajouter des fonctionnalite\u0301s ils peuvent :<small><\/small><\/p>\n<ul>\n<li class=\"fragment\">rede\u0301finir le fonctionnement des me\u0301thodes de base (read, write, &#8230;), par polymorphisme l\u2019utilisation est transparente et interchangeable<\/li>\n<li class=\"fragment\">ajouter de nouvelles me\u0301thodes (print, writeBoolean, readLine, &#8230;)<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<\/section>\n<section>\n<h3>Les filtres<\/h3>\n<table>\n<tbody>\n<tr>\n<td><b>Pr\u00e9fixe<\/b><\/td>\n<td><b>Fonctionnalit\u00e9<\/b><\/td>\n<td>\n<div>\n<div><code>InputStream<\/code><\/div>\n<\/div>\n<\/td>\n<td>\n<div>\n<div><code>OutputStream<\/code><\/div>\n<\/div>\n<\/td>\n<td>\n<div>\n<div><code>Reader<\/code><\/div>\n<\/div>\n<\/td>\n<td>\n<div>\n<div><code>Writer<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td><code>Buffered<\/code><\/td>\n<td>Mise en tampon<\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td><code>Data<\/code><\/td>\n<td>Conversion des types primitifs<\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td><code>Object<\/code><\/td>\n<td>S\u00e9rialisation d&#8217;objet<\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td><code>Sequence<\/code><\/td>\n<td>Concat\u00e9nation de flux<\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td><code>Print<\/code><\/td>\n<td>Fonctions de formatage <code>print<\/code><\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td><code>PushBack<\/code><\/td>\n<td>Lecture avec remise dans le flux<\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td><code>LineNumber<\/code><\/td>\n<td>Num\u00e9rotation des lignes<\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td><code>Digest<\/code><\/td>\n<td>V\u00e9rification par somme de contr\u00f4le<\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td><code>Cipher<\/code><\/td>\n<td>Chiffrage du flux<\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/section>\n<section>\n<h3>Attention<\/h3>\n<p><code>InputStreamReader<\/code>, resp. <code>OutputStreamWriter<\/code> n&#8217;est pas un flux de type <code>InputStream<\/code>, resp. <code>OutputStream<\/code>.<\/p>\n<p class=\"fragment\">C&#8217;est un constructeur de flux de type <code>Reader<\/code>, resp. <code>Writer<\/code>, <span class=\"fragment\">\u00e0 partir d&#8217;un flux de type <code>InputStream<\/code>, resp. <code>OutputStream<\/code><\/span><\/p>\n<p>&nbsp;<\/p>\n<\/section>\n<\/section>\n<section>\n<section class=\"toc-pause\">\n<h1>Compositions de filtres<\/h1>\n<\/section>\n<section>\n<table>\n<tbody>\n<tr>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td><\/td>\n<td>\n<div>\n<div><code>OutputStream<\/code><\/div>\n<\/div>\n<\/td>\n<td><\/td>\n<td>\n<div>\n<div><code>InputStream<\/code><\/div>\n<\/div>\n<\/td>\n<td><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div><\/div>\n<div>\n<pre><code class=\"java\" data-trim=\"\">\r\nOutputStream os = ?????? ;\r\nos.write((byte)1);\r\nos.write((byte)2);\r\nos.write((byte)3);\r\nos.close();\r\n\r\n                   <\/code><\/pre>\n<\/div>\n<div>\n<pre><code class=\"java\" data-trim=\"\">\r\nInputStream is = ?????? ;\r\nwhile ( (x = is.read()) != -1 )\r\n{\r\n    System.out.println(x);\r\n}\r\nis.close();\r\n                       <\/code><\/pre>\n<\/div>\n<\/section>\n<section>\n<table>\n<tbody>\n<tr>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td><\/td>\n<td>\n<div>\n<div><code>FileOutputStream<\/code><\/div>\n<\/div>\n<\/td>\n<td><\/td>\n<td>\n<div>\n<div><code>FileInputStream<\/code><\/div>\n<\/div>\n<\/td>\n<td><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div><\/div>\n<div>\n<pre><code class=\"java\" data-trim=\"\">\r\nOutputStream os =\r\nnew FileOutputStream(\"test.bin\");\r\nos.write((byte)1);\r\nos.write((byte)2);\r\nos.write((byte)3);\r\nos.close();\r\n\r\n                   <\/code><\/pre>\n<\/div>\n<div>\n<pre><code class=\"java\" data-trim=\"\">\r\nInputStream is =\r\nnew FileInputStream(\"test.bin\");\r\nwhile ( (x = is.read()) != -1 )\r\n{\r\n    System.out.println(x);\r\n}\r\nis.close();\r\n                       <\/code><\/pre>\n<\/div>\n<\/section>\n<section>\n<table>\n<tbody>\n<tr>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>\n<div>\n<div><code>CipherOutputStream<\/code><\/div>\n<\/div>\n<\/td>\n<td>\n<div>\n<div><code>FileOutputStream<\/code><\/div>\n<\/div>\n<\/td>\n<td><\/td>\n<td>\n<div>\n<div><code>FileInputStream<\/code><\/div>\n<\/div>\n<\/td>\n<td>\n<div>\n<div><code>CipherInputStream<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div><\/div>\n<div>\n<pre><code class=\"java\" data-trim=\"\">\r\nOutputStream os =\r\nnew CipherOutputStream(\r\nnew FileOutputStream(\"test.bin\"),c);\r\nos.write((byte)1);\r\nos.write((byte)2);\r\nos.write((byte)3);\r\nos.close();\r\n\r\n                   <\/code><\/pre>\n<\/div>\n<div>\n<pre><code class=\"java\" data-trim=\"\">\r\nInputStream is =\r\nnew CipherInputStream(\r\nnew FileInputStream(\"test.bin\"), c);\r\nwhile ( (x = is.read()) != -1 )\r\n{\r\n    System.out.println(x);\r\n}\r\nis.close();\r\n                       <\/code><\/pre>\n<\/div>\n<\/section>\n<section>\n<table>\n<tbody>\n<tr>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>\n<div>\n<div><code>GZIPOutputStream<\/code><\/div>\n<\/div>\n<\/td>\n<td>\n<div>\n<div><code>CipherOutputStream<\/code><\/div>\n<\/div>\n<\/td>\n<td>\n<div>\n<div><code>FileOutputStream<\/code><\/div>\n<\/div>\n<\/td>\n<td><\/td>\n<td>\n<div>\n<div><code>FileInputStream<\/code><\/div>\n<\/div>\n<\/td>\n<td>\n<div>\n<div><code>CipherInputStream<\/code><\/div>\n<\/div>\n<\/td>\n<td>\n<div>\n<div><code>GZIPInputStream<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div><\/div>\n<div>\n<pre><code class=\"java\" data-trim=\"\">\r\nOutputStream os =\r\nnew GZIPOutputStream(\r\nnew CipherOutputStream(\r\nnew FileOutputStream(\"test.bin\"),c)\r\n);\r\nos.write((byte)1);\r\nos.write((byte)2);\r\nos.write((byte)3);\r\nos.close();\r\n\r\n                   <\/code><\/pre>\n<\/div>\n<div>\n<pre><code class=\"java\" data-trim=\"\">\r\nInputStream is =\r\nnew GZIPInputStream(\r\nnew CipherInputStream(\r\nnew FileInputStream(\"test.bin\"), c)\r\n);\r\nwhile ( (x = is.read()) != -1 )\r\n{\r\n    System.out.println(x);\r\n}\r\nis.close();\r\n                       <\/code><\/pre>\n<\/div>\n<\/section>\n<section>\n<h2>Filtres personnalis\u00e9s<\/h2>\n<p>Pour un filtre personnalise\u0301 destine\u0301 a\u0300 la lecture d\u2019octets : de\u0301finir une classe qui he\u0301rite de <code>FilterInputStream<\/code>, imple\u0301menter un constructeur a\u0300 un parame\u0300tre <code>InputStream is<\/code> :<small><\/small><\/p>\n<ul>\n<li>appeler a\u0300 la premie\u0300re ligne du constructeur <code>super(is)<\/code><\/li>\n<li>si besoin enregistrer les autres parame\u0300tres dans des attributs<\/li>\n<\/ul>\n<p><small><\/small>&nbsp;<\/p>\n<p>rede\u0301finir la me\u0301thode <code>read()<\/code> :<small><\/small><\/p>\n<ul>\n<li>utiliser <code>super.read()<\/code> pour obtenir la valeur avant transformation<\/li>\n<li>appliquer le filtre<\/li>\n<li>retourner la valeur modifie\u0301e<\/li>\n<\/ul>\n<p><small><\/small>&nbsp;<\/p>\n<\/section>\n<section>\n<h2>Exemple<\/h2>\n<pre><code class=\"java\" data-trim=\"\">\r\nimport java.io.*;\r\n\r\nclass DoubleReader extends FilterReader {\r\n\r\n    private int lastChar = -1;\r\n    public DoubleReader(Reader r) {\r\n        super(r);\r\n    }\r\n    @Override\r\n    public int read() throws IOException {\r\n        if(lastChar != -1) {\r\n            int r = lastChar;\r\n            lastChar = -1;\r\n            return r;\r\n        }\r\n        lastChar = super.read();\r\n        return lastChar;\r\n    }\r\n}\r\n\r\n                       <\/code><\/pre>\n<\/section>\n<\/section>\n<section>\n<section class=\"toc-pause\">\n<h1>Nouvelles API <code>java.nio.file<\/code><\/h1>\n<\/section>\n<section>\n<h2><code>java.nio.file<\/code> API<\/h2>\n<p>Java 8 introduit de nouvelles API pour la lecture de fichiers<\/p>\n<p><code>Files<\/code> est une classe contenant des m\u00e9thodes statiques pour manipuler les fichiers et les dossiers.<\/p>\n<\/section>\n<section>\n<h2>Fonction pour la lecture<\/h2>\n<p>&nbsp;<\/p>\n<ul>\n<li><code>Files.newBufferedReader(Path p )<\/code> : Obtenir un buffer reader du fichier localis\u00e9 au chemin <code>p<\/code><\/li>\n<li><code>Files.lines(Path p)<\/code> : Obtenir un <code>Stream<\/code> contenant les lignes du fichier localis\u00e9 au chemin <code>p<\/code><\/li>\n<\/ul>\n<\/section>\n<\/section>\n","protected":false},"excerpt":{"rendered":"<p>Abstraction Abstraction Un programme int\u00e9ragie avec le monde ext\u00e9rieur: ses actions d\u00e9pendent des param\u00e8tre re\u00e7us, des ordres re\u00e7us, des \u00e9v\u00e9nements se produisant pendant son ex\u00e9cution, etc&#8230; les calculs effectu\u00e9s par le programme servent \u00e0 d\u00e9clancher des \u00e9v\u00e9nements ou sont transmis \u00e0 l&#8217;utilisateur ou \u00e0 d&#8217;autres programmes. &nbsp; D\u00e9finition : On appelle Entre\u0301es\/Sorties (E\/S) l\u2019ensemble des [&hellip;]<\/p>\n","protected":false},"author":55,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-57","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/wp-systeme.lip6.fr\/potop-butucaru\/wp-json\/wp\/v2\/posts\/57","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wp-systeme.lip6.fr\/potop-butucaru\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wp-systeme.lip6.fr\/potop-butucaru\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wp-systeme.lip6.fr\/potop-butucaru\/wp-json\/wp\/v2\/users\/55"}],"replies":[{"embeddable":true,"href":"https:\/\/wp-systeme.lip6.fr\/potop-butucaru\/wp-json\/wp\/v2\/comments?post=57"}],"version-history":[{"count":1,"href":"https:\/\/wp-systeme.lip6.fr\/potop-butucaru\/wp-json\/wp\/v2\/posts\/57\/revisions"}],"predecessor-version":[{"id":58,"href":"https:\/\/wp-systeme.lip6.fr\/potop-butucaru\/wp-json\/wp\/v2\/posts\/57\/revisions\/58"}],"wp:attachment":[{"href":"https:\/\/wp-systeme.lip6.fr\/potop-butucaru\/wp-json\/wp\/v2\/media?parent=57"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wp-systeme.lip6.fr\/potop-butucaru\/wp-json\/wp\/v2\/categories?post=57"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wp-systeme.lip6.fr\/potop-butucaru\/wp-json\/wp\/v2\/tags?post=57"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}