page précédantetable des matièrestable des matières

Entrées-sorties

Introduction
 
La POO utilise des flots (stream) pour traiter les entrées-sorties:


 

Il existe un grand nombre(même un peu trop) des classes pour les entrées - sortie en Java . En plus il y a deux approches différentes - de Java 1.0 basée sur la circulation des octets  et de Java 1.1 basée sur les caractères unicode.
 

Classes de lecture et d'écriture des données sur des supports physiques (niveau bas)


 La plupart des classes qui manipulent des flots d'octets sont dérivés de l'une des deux classes abstraites InputStream et OutputStream. Les méthodes qui peuvent être appliquées sur un tel flot pour lire des octets sont les suivantes:

Les méthodes disponible pour écrire sont les suivant:

 

 La plupart des classes qui manipulent des caractères sont dérivés de l'une des deux classes abstraites Reader et Writer. Les méthodes qui peuvent être appliquées sur un tel flot sont très semblable à celles de les classes précédentes seul le type des données lues est différent. Pour lire des caractères sont les suivantes:

Les méthodes disponible pour écrire sont les suivant:

 

Classes de lecture et d'écriture des données (les filtres, niveau haut)

Un filtre est un flot particulier qui enveloppe un autre flot. Les données lues dans un filtre proviennent du flot enveloppé. Le filtre peut effectuer différents traitements sur les données lues dans le flot enveloppé avant de les transmettre. Il peut le placer dans un tampon, les coder, etc. Inversement dans le cas d'un filtre en écriture, les données peuvent être transformées avant d'être écrites dans le flot enveloppé.


 
 

Lecture et écriture du fichier texte  (flux  caractères)

  
Exemple При стартиране с:
java ReadTxtF ReadTxtF.java
import java.io.*;
public class ReadTxtF {
   public static void main(String arg[]) {
      String tampon,s=new String();
      try {
         // read lines
         BufferedReader in = new BufferedReader(
                              new FileReader(arg[0]));  
         while(( tampon=in.readLine()) != null)
             s += tampon + "\n";
         in.close();
      }
      catch(IOException e) {
          e.printStackTrace();
      }

      System.out.println(s);     
    }
}

import java.io.*;
public class ReadTxtF {
   public static void main(String arg[]) {
       String tampon,s=new String();
       try {
         // read lines
         BufferedReader in = new BufferedReader(
                              new FileReader(arg[0]));
         while(( tampon=in.readLine()) != null)
             s += tampon + "\n";
         in.close();
      }
      catch(IOException e) {
          e.printStackTrace();
      }

      System.out.println(s);

   }
}

 



Lecture de flot standard

Exemple java  ReadStdin
import java.io.*;
public class ReadStdin {
   public static void main(String arg[]) {
      try {        
         BufferedReader stdin = new BufferedReader(
                           new InputStreamReader(System.in));
         System.out.print("Enter a line: ");
         System.out.println(stdin.readLine());
         stdin.close();
       }
       catch(IOException e) {
          e.printStackTrace();
       }
  }
}
Enter a line: abrakadabra nawuhodonosor
abrakadabra nawuhodonosor

Remarques:
System.in est de type "DataInputStream". Un "BufferedReader" a besoin d'un argument de type "Reader". C'est pourquoi on passe par un "InputStreamReader".

La classe "BufferedReader" utilise un tampon de lecture phisique est permet l'utilisation de "readLine()"

Lecture de flot standard (2ème aproche) - class Scanner

тип на резултата Описание
Scanner
new Scanner(System.in)  //конструктор
 BigDecimal nextBigDecimal()
          Scans the next token of the input as a BigDecimal.
 BigInteger nextBigInteger()
          Scans the next token of the input as a BigInteger.
 BigInteger nextBigInteger(int radix)
          Scans the next token of the input as a BigInteger.
 boolean nextBoolean()
          Scans the next token of the input into a boolean value and returns that value.
 byte nextByte()
          Scans the next token of the input as a byte.
 byte nextByte(int radix)
          Scans the next token of the input as a byte.
 double nextDouble()
          Scans the next token of the input as a double.
 float nextFloat()
          Scans the next token of the input as a float.
 int nextInt()
          Scans the next token of the input as an int.
 int nextInt(int radix)
          Scans the next token of the input as an int.
 String nextLine()
          Advances this scanner past the current line and returns the input that was skipped.
 long nextLong()
          Scans the next token of the input as a long.
 long nextLong(int radix)
          Scans the next token of the input as a long.
 short nextShort()
          Scans the next token of the input as a short.
 short nextShort(int radix)
          Scans the next token of the input as a short.

Exemple
java StdInputTest
import java.util.*;

public class StdInputTest

   public static void main(String[] args)
   { 
      Scanner in = new Scanner(System.in);

      // get first input
      System.out.print("What is your name? ");
      String name = in.nextLine();

      // get second input
      System.out.print("How old are you? ");
      int age = in.nextInt();

      // display output on console
      System.out.println("Hello, " + name + ". Next year, you'll be " + (age + 1));
   }
}
What is your name? Pijo
How old are you? 21
Hello, Pijo. Next year, you'll be 22


Lecture de flot standard (3ème aproche) - class JOptionPane

 

 import javax.swing.JOptionPane;

 public class TestInp {

    public static void main( String[] args ){
       String name = "",s_age="";
       int age;
       name=JOptionPane.showInputDialog("Please enter your name");
       s_age=JOptionPane.showInputDialog("How old are You?");
       age=Integer.parseInt(s_age);
       String msg = "Hello " + name + " next year,you'll be " + (age + 1);
   
       JOptionPane.showMessageDialog(null, msg);
    }
}

 

Lecture deEcriture dans un fichier texte - copie d'un fichier (flux lignes)

Exemple
import java.io.*;
public class Copy {
   public static void main(String arg[]) {
      String f1="",f2="";
      try{
          f1=arg[0];
          f2=arg[1];
      }catch (IndexOutOfBoundsException e){
          System.out.println("Usage: java Copy file_1 file_2");
          System.exit(1);
      }
      try { 
         BufferedReader in = new BufferedReader(
                              new FileReader(f1));
         BufferedWriter ot = new BufferedWriter(
                 new FileWriter(f2));
        
         System.out.println("Copy "+arg[0]+" as "+arg[1]);
      
         String tampon="" ;
         while(( tampon=in.readLine()) != null) {
             ot.write(tampon) ;
             ot.newLine();    
         }
         in.close();
         ot.close();
         System.out.println("done");
      }
      catch(FileNotFoundException ef){
          System.out.print(arg[0]+" does not exist");
          System.out.println(" or "+arg[1]+ " can not be created");
          System.exit(3);
      }
      catch(IOException e) {
          e.printStackTrace();
          System.exit(4);
      }

    }
}

Lecture  et écriture du fichier binaire (flux octets)

exemple
import java.io.*;
   public class FileCopy {
      public static void main(String arg[]) {
         int octet;
         try {

            System.out.print("Nom de fichier a copier: ");
            // lecture du flot d'entree standart
            BufferedReader stdin = new BufferedReader(new  InputStreamReader(System.in));
            String s =stdin.readLine();

            System.out.print("Nom de nouveau fichier: ");           
            String sn= stdin.readLine();
            
            System.out.println("copy the file "+s+" in the file "+sn);
            
            FileInputStream fi = new FileInputStream(s);
            FileOutputStream fo = new FileOutputStream(sn);


            while((octet= fi.read())!=-1)fo.write(octet);

            stdin.close();
            fi.close();
            fo.close();
            System.out.println("created");
         }
         catch(IOException e) {
         System.out.println("Error:"+e);;
      }
   }
}

exemple
import java.io.*;

public class FCopyArr {
    public static void main(String arg[]) throws IOException{
        byte bt[] = new byte[2048];
        int len;
        
        System.out.print("Nom de fichier a copier: ");
        // lecture du flot d'entree standart
        BufferedReader stdin = new BufferedReader(new  InputStreamReader(System.in));
        String fns =stdin.readLine();

        System.out.print("Nom de nouveau fichier: ");           
        String fnd= stdin.readLine();

        System.out.println("copy the file "+fns+" in the file "+fnd);
        FileInputStream fi = null;
        FileOutputStream fo = null;
        try {
            fi = new FileInputStream(fns);
            fo = new FileOutputStream(fnd);
            while((len = fi.read(bt))!=-1){
                fo.write(bt,0,len);
            }
            System.out.println("file "+fns+" is copied as "+fnd);
        }
        catch(FileNotFoundException ex){
            if(fi== null)System.out.println("The file "+fns+" does not exist");
            else System.out.println("not possible to create "+fnd);
        }
        finally{
            if(fi != null)fi.close();
            if(fo != null)fo.close();
        }
    }
}

Remarque: FileNotFoundException est derivée de la IOException

La classe File

Liste d'une répertoire.
 
exemple Résultat
import java.io.*;
/** affiche la liste des fichiers d'un repertoire */

public class FileListe{
   public static void main(String args[]) {
      try{
         File path = new File(".");
         String[] list = path.list();
         for(int i = 0; i < list.length; i++)
          System.out.println(list[i]);
      } catch (Exception e) {
         e.printStackTrace();
      }
    }
}

stdin.java
io.html
read_stream.gif
write_stream.gif
io_bases_classes.gif
io_classes.gif
stdin.class
FileListe.java
FileInfo.java
FileListe.class
FileInfo.class

Information sur le fichier
 
exemple  lancement avec
java FileInfo FileInfo.java
import java.io.*;
import java.util.*;
/** affiche les caracteristiques d'un fichier */

public class FileInfo{
   public static void main(String args[]) {
      if(args.length == 0){
         System.out.println(
                "Usage FileInfo <FilePath> ");
         return;
      }

      File f = new File(args[0]);
      System.out.println(
            " Abs path: " + f.getAbsolutePath() +
            "\n write: " + f.canWrite() +
            "\n read: " + f.canRead() +
            "\n Name: " + f.getName() +
            "\n Length: " + f.length() +
            "\n Parent " + f.getParent() +
            "\n Path: " + f.getPath() +
            "\n Modif: " + 
                            new Date(f.lastModified()));
      if(f.isFile())
            System.out.println("fichier");
      else if(f.isDirectory())
            System.out.println("repertoire");
   }
}

Abs path: E:\My_Documents\JAVA\CoursJava(my)\io\FileInfo.java
 write: true
 read: true
 Name: FileInfo.java
 Length: 855
 Parent null
 Path: FileInfo.java
 Modif: Tue May 14 10:30:44 GMT+03:00 2002
fichier

 

Création, renommage et suppression de fichiers

 
exemple Résultat
import java.io.*;

public class FichierManip{
   public static void main(String args[]) {
      File nouveau = new File("Test.txt");
      File change = new File("Test_change.txt");
      dir();
      try{
         nouveau.createNewFile();
      }catch (IOException e) {e.printStackTrace();}
      dir();
      nouveau.renameTo(change);
      dir();
      change.delete();
      dir();
      nouveau.mkdirs();
      dir();
      nouveau.delete();
      dir(); 
   }

   public static void dir() {
      try{
         File repert = new File(".");
         String[] liste = repert.list();
         for(int i = 0; i< liste.length; i++)
            System.out.println(liste[i]);
         System.out.println("\n");
      } catch (Exception e) { e.printStackTrace();  }
   }
}

FichierManip.class

FichierManip.class
Test.txt

FichierManip.class
Test_change.txt

FichierManip.class

FichierManip.class
Test.txt

FichierManip.class

 


 

Persistence d'objets. Les mécanismes de "sérialisation" d'objets


 
Constructeurs (fichier save.ser dans la répertoire courante)

ObjectInputStream ois = new ObjectInputStream (new FileInputStream ("save.ser"));
ObjectOutputStream oos =  new ObjectOutputStream (new FileOutputStream ("save.ser"));

L'interface Serializable

Exemple

import java.io.Serializable;

public class PersonSr implements Serializable{
         static int num=0;
         String
 name;
         String
 id;
         PersonSr(){
                name = "student "+ ++num;
                id = (int)(Math.random()*3999)+1111+"";
         }
}

public class StudentSr extends PersonSr{
         int notes[];
         StudentSr(){
               notes = new int [5];
                for(int i =0;i<notes.length;i++){
                      notes[i]=(int)(Math.random()*5)+2;
                }
         }
         public
 String toString(){
            String
 rez;
            rez = "name:"+name+"\tid:"+id+"\tnotes:";
             for(int i=0;i<notes.length;i++){
                      rez += "\t"+notes[i];
             }
             return rez;     
        
 }
}


Sérialistion

 import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public
 class StudWr {
         public
 static void main(String arg[]) throws IOException{
                ObjectOutputStream oos = null;
                StudentSr s;
                try{
                      oos = new ObjectOutputStream (
                            new FileOutputStream ("save.ser"));
                      for(int i=0;i<9;i++){
                            s =new StudentSr();
                            
System.out.println(""+s);
                            oos.writeObject(s);
                      }
                }
                finally{
                      oos.close();
                }
         }
}

Résultat:

name:student 1      id:4236     notes: 3    4    5    6    4

name:student 2      id:4051     notes: 2    6    4    4    4

name:student 3      id:2745     notes: 6    3    5    3    4

name:student 4      id:2550     notes: 4    2    2    4    6

name:student 5      id:3783     notes: 6    2    6    4    2

name:student 6      id:1677     notes: 2    4    5    4    6

name:student 7      id:1378     notes: 5    2    2    5    4

name:student 8      id:2112     notes: 2    5    4    6    5

name:student 9      id:3111     notes: 5    2    6    3    6

 


Désérialisation

import java.io.EOFException;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectInputStream;

public class StudRd {
         public
 static void main(String[] arg)throws
                       IOException,ClassNotFoundException{

                ObjectInputStream ois = null;
                StudentSr s;
                int n=0, nf=0;
                try{
                      ois = new ObjectInputStream (new FileInputStream ("save.ser"));

                      for(;;){
                            s= (StudentSr)ois.readObject();
                            n++;
                            if
(average(s)>=4){
                                   System.out.print(""+s);
                                   System.out.println("\thas average "+ average(s));
                                   nf++;
                            }
                      }
                }
                catch(EOFException ex){
                      System.out.println("printed "+nf+" students, found total "+n+" students");
                }
                finally{
                      ois.close();
                }
         }
         public
 static double average(StudentSr s){
                double sum;
                int i;
                for(sum=i=0;i<s.notes.length;i++){
                      sum+=s.notes[i];
                }
                return sum/s.notes.length;
         }
}

Résultat:

name:student 1      id:4236     notes: 3    4    5    6    4    has average 4.4
name:student 2      id:4051     notes: 2    6    4    4    4    has average 4.0
name:student 3      id:2745     notes: 6    3    5    3    4    has average 4.2
name:student 5      id:3783     notes: 6    2    6    4    2    has average 4.0
name:student 6      id:1677     notes: 2    4    5    4    6    has average 4.2
name:student 8      id:2112     notes: 2    5    4    6    5    has average 4.4
name:student 9      id:3111     notes: 5    2    6    3    6    has average 4.4
printed 7 students, found total 9 students


Mot clé   transient:

 
class MyClass implements Serializable {
    transient Thread thread;  //Skip serialization of the transient field
    transient String fieldIdontwantSerialization;
         // Serialize the rest of the fields
    int data;
    String x;
         // More code
}

 


page précédantetable des matièrestable des matières