home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1995 November / PCWK1195.iso / inne / win95 / sieciowe / hotja32.lzh / hotjava / classsrc / java / io / pushbackinputstream.java < prev    next >
Text File  |  1995-08-11  |  3KB  |  109 lines

  1. /*
  2.  * @(#)PushbackInputStream.java    1.6 95/01/31 Jonathan Payne
  3.  *
  4.  * Copyright (c) 1994 Sun Microsystems, Inc. All Rights Reserved.
  5.  *
  6.  * Permission to use, copy, modify, and distribute this software
  7.  * and its documentation for NON-COMMERCIAL purposes and without
  8.  * fee is hereby granted provided that this copyright notice
  9.  * appears in all copies. Please refer to the file "copyright.html"
  10.  * for further important copyright and licensing information.
  11.  *
  12.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
  13.  * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
  14.  * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
  15.  * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
  16.  * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
  17.  * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
  18.  */
  19.  
  20. package java.io;
  21.  
  22. /**
  23.  * An input stream that has a 1 byte push back buffer.
  24.  * It also keeps track of line numbers.
  25.  * @version     1.6, 31 Jan 1995
  26.  * @author    Jonathan Payne
  27.  */
  28. public
  29. class PushbackInputStream extends FilterInputStream {
  30.     /**
  31.      * Push back character.
  32.      */
  33.     protected int    pushBack = -1;
  34.  
  35.     /**
  36.      * The current line number.
  37.      */
  38.     protected int    lineNumber = 1;
  39.  
  40.     /**
  41.      * Creates a PushbackInputStream.
  42.      * @param in the input stream
  43.      */
  44.     public PushbackInputStream(InputStream in) {
  45.     super(in);
  46.     }
  47.  
  48.     /**
  49.      * Reads a byte. Will block if no input is available.
  50.      * @return     the byte read, or -1 if the end of the
  51.      *        stream is reached.
  52.      * @exception IOException i/o error occurred
  53.      */
  54.     public int read() {
  55.     int c;
  56.  
  57.     if ((c = pushBack) != -1) {
  58.         pushBack = -1;
  59.     } else {
  60.         c = super.read();
  61.     }
  62.     if (c == '\n') {
  63.         lineNumber += 1;
  64.     }
  65.     return c;
  66.     }
  67.  
  68.     /**
  69.      * Reads into an array of bytes.
  70.      * Blocks until some input is available.
  71.      * This method should be overridden in a subclass for
  72.      * efficiency (the default implementation reads 1 byte
  73.      * at a time).
  74.      * @param b    the buffer into which the data is read
  75.      * @param off the start offset of the data
  76.      * @param len the maximum number of bytes read
  77.      * @return  the actual number of bytes read, -1 is
  78.      *         returned when the end of the stream is reached.
  79.      * @exception IOException i/o error occurred
  80.      */
  81.     public int read(byte bytes[], int offset, int length) {
  82.     int c = read();
  83.     if (c == -1) {
  84.         bytes[offset] = (byte)c;
  85.         return 1;
  86.     }
  87.     return -1;
  88.     }
  89.  
  90.     /**
  91.      * Pushes back a character. 
  92.      * @param ch the character to push back.
  93.      * @exception Exception Attempt to push back more than one character.
  94.      */
  95.     public void unread(int ch) {
  96.     if (pushBack != -1) {
  97.         throw new Exception("Attempt to unread more than one character!");
  98.     }
  99.     pushBack = ch;
  100.     }
  101.  
  102.     /**
  103.      * Returns the current line number.
  104.      */
  105.     public int currentLine() {
  106.     return lineNumber;
  107.     }
  108. }
  109.