Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

Source code: com/diaam/lgpl/ts/MinReader.java


1   /*
2    * $Log: MinReader.java,v $
3    * Revision 1.1  2000/11/10 15:31:30  vonarnim
4    * - deplacement (et nouvelle version) de TerminalStandard dans ctulu
5    *
6    * Revision 1.1  1999/11/04 20:02:06  Herve_AGNOUX
7    * Initial revision
8    *
9    */
10  /*
11  -- TerminalStandard v111999
12  
13  Fichier : MinReader.java
14  Auteur : Hervé AGNOUX, hagnoux@mail.club-internet.fr
15  License LGPL.
16  */
17  package com.diaam.lgpl.ts;
18  
19  import java.io.InputStream;
20  import java.io.IOException;
21  import java.io.Reader;
22  
23  /**
24   * <code>MinReader</code> est une sorte de "workeuround" au fait que je ne 
25   * sois pas @?!\@@ parvenu à faire fonctionner des "pipe" java avec
26   * Pnuts. Elle stoque les caractères qu'on lui envoi avec <code>
27   * aj</code> pour les délivrer lors d'un <code>read</code> : c'est
28   * un <em>Reader</em>, tout de même...
29   * Quelles sont les modifs depuis la dernière version ? Juste la méthode
30   * "asStream", où je dois à 
31   * <a href="http://www.memoire.com/guillaume-desnoix/alma/">
32   * l'équipe d'Alma</a> quelques judicieuses contributions.
33   * <p>Cette classe est en diffusion LGPL, et elle est téléchargeable à
34   * <a href="http://perso.club-internet.fr/hagnoux/java/TerminalStandard">
35   * http://perso.club-internet.fr/hagnoux/java/TerminalStandard</a>.<br>
36   * @author <a href="h_agnoux.html">Hervé AGNOUX</a>, 
37   * hagnoux@mail.club-internet.fr
38   * @version 111999
39   */
40  public class MinReader extends Reader
41  {
42    private final static int TAILLE_BUF_IN = 1023;
43  
44    private boolean ouvert = true;
45    private char readerBuf[] = new char[TAILLE_BUF_IN];
46    private int début = 0;
47    private  int fin = 0;
48    
49    /**
50     * R.A.S.
51     */
52    public MinReader()
53    {
54      lock = new Object();
55    }
56    
57    /**
58     * R.A.S.
59     * @exception IOException R.A.S.
60     */
61    public int read(char cbuf[], int off, int len) throws IOException
62    {
63      int nbLu = 0;
64      
65      if (!ouvert)
66        throw new IOException("Lecteur fermé.");
67      try
68      {
69        if (début == fin)
70        {
71          synchronized (lock)
72          {
73            lock.wait();
74          }
75        }
76        cbuf[off] = readerBuf[début];
77        début++;
78        if (début == TAILLE_BUF_IN)
79          début = 0;
80        nbLu = 1;
81      }
82      catch (Exception e)
83      {
84        // rien... (du moins, il me semble...)
85      }
86      return nbLu;
87    }
88    
89    /**
90     * R.A.S.
91     */
92    public void close()
93    {
94      ouvert = false;
95    }
96    
97    /**
98     * Ajoute des caractères à lire par <code>read</code>.
99     * @param clef  le caractère.
100    */
101   public void aj(char clef)
102   {
103     int memoFin;
104     boolean àDébloquer;
105     
106     memoFin = fin;
107     àDébloquer = fin == début;
108     readerBuf[fin] = clef;
109     fin++;
110     if (fin == TAILLE_BUF_IN)
111       fin = 0;
112     if (fin == début)
113     {
114       System.err.println
115         ("Buffer d'entrée de MinReader trop petit !");
116       fin = memoFin;
117     }
118     if (àDébloquer)
119     {
120       synchronized (lock)
121       {
122         lock.notifyAll();
123       }
124     }
125   }
126   
127   /**
128    * R.A.S.
129    */
130   public boolean ready()
131   {
132     return début != fin;
133   }
134 
135   /**
136    * Renvoit un InputStream intermédiaire.
137    * @return ... voir ligne au dessus.
138    */
139   public InputStream asStream()
140   {
141     return new Stream();
142   }
143 
144   private class Stream extends java.io.InputStream
145   {
146     char buf[] = new char[1];
147 
148     public int read() throws IOException
149     {
150       int l;
151 
152       l = MinReader.this.read(buf, 0, 1);
153       if (l == -1)
154   return l;
155       return (int)buf[0];
156     }
157 
158     public int available()
159     {
160       int c;
161 
162       if (début >= fin)
163   c = début - fin;
164       else
165   c = readerBuf.length - fin + début;
166       return c;
167     }
168 
169     /**
170      * Merci a l'équipe d'Alma ! Pour des raisons qui m'échappent, il faut
171      * surcharger cette méthode.
172      */
173     public int read(byte[] _b, int _d, int _l) throws IOException
174     {
175       if(_l==0) return 0;
176       _b[_d]=(byte)read();
177       return 1;
178     }
179   }
180 }
181 
182 
183