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

  1. /*
  2.  * @(#)DataInputStream.java    1.16 95/01/31 Arthur van Hoff
  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.  * A data input stream that lets you read primitive Java data types
  24.  * from a stream in a portable way.
  25.  *
  26.  * @see DataOutputStream
  27.  * @version     1.16, 31 Jan 1995
  28.  * @author    Arthur van Hoff
  29.  */
  30. public
  31. class DataInputStream extends FilterInputStream {
  32.     /**
  33.      * Create a new DataInputStream.
  34.      * @param in     the input stream
  35.      */
  36.     public DataInputStream(InputStream in) {
  37.     super(in);
  38.     }
  39.  
  40.     /**
  41.      * Reads bytes, blocking until all bytes are read.
  42.      * @param b    the buffer into which the data is read
  43.      * @return  the actual number of bytes read, -1 is
  44.      *         returned when the end of the stream is reached.
  45.      * @exception IOException i/o error occurred
  46.      */
  47.     public final int readBytes(byte b[]) {
  48.     return readBytes(b, 0, b.length);
  49.     }
  50.  
  51.     /**
  52.      * Reads bytes, blocking until all bytes are read.
  53.      * @param b    the buffer into which the data is read
  54.      * @param off the start offset of the data
  55.      * @param len the maximum number of bytes read
  56.      * @return  the actual number of bytes read, -1 is
  57.      *         returned when the end of the stream is reached.
  58.      * @exception IOException i/o error occurred
  59.      */
  60.     public final int readBytes(byte b[], int off, int len) {
  61.     InputStream in = this.in;
  62.     int i, n = 0;
  63.     while (n < len) {
  64.         if ((i = in.read(b, off + n, len - n)) < 0) {
  65.         return (n > 0) ? n : -1;
  66.         }
  67.         n += i;
  68.     }
  69.     return n;
  70.     }
  71.  
  72.     /**
  73.      * Skips bytes, block until all bytes are skipped.
  74.      * @param n     bytes to be skipped
  75.      * @return    actual number of bytes skipped
  76.      * @exception IOException i/o error occurred
  77.      */
  78.     public final int skipBytes(int n) {
  79.     InputStream in = this.in;
  80.     for (int i = 0 ; i < n ; i += in.skip(n - i));
  81.     return n;
  82.     }
  83.  
  84.     /**
  85.      * Reads a boolean.
  86.      */
  87.     public final boolean readBoolean() {
  88.     return in.read() != 0;
  89.     }
  90.  
  91.     /**
  92.      * Reads an 8 bit byte.
  93.      */
  94.     public final byte readByte() {
  95.     return (byte)in.read();
  96.     }
  97.  
  98.     /**
  99.      * Reads 16 bit short.
  100.      */
  101.     public final short readShort() {
  102.     InputStream in = this.in;
  103.     return (short)(((in.read() << 8) & (0xFF << 8)) |
  104.                ((in.read() << 0) & (0xFF << 0)));
  105.     }
  106.  
  107.     /**
  108.      * Reads a 16 bit char.
  109.      */
  110.     public final char readChar() {
  111.     InputStream in = this.in;
  112.     return (char)(((in.read() << 8) & (0xFF << 8)) |
  113.               ((in.read() << 0) & (0xFF << 0)));
  114.  
  115.     }
  116.  
  117.     /**
  118.      * Reads a 32 bit int.
  119.      */
  120.     public final int readInt() {
  121.     InputStream in = this.in;
  122.     return ((in.read() << 24) & (0xFF << 24)) |
  123.            ((in.read() << 16) & (0xFF << 16)) |
  124.            ((in.read() <<  8) & (0xFF <<  8)) |
  125.            ((in.read() <<  0) & (0xFF <<  0));
  126.     }
  127.  
  128.     /**
  129.      * Reads a 64 bit long.
  130.      */
  131.     public final long readLong() {
  132.     InputStream in = this.in;
  133.     return (((long)in.read() << 56) & ((long)0xFF << 56)) |
  134.            (((long)in.read() << 48) & ((long)0xFF << 48)) |
  135.            (((long)in.read() << 40) & ((long)0xFF << 40)) |
  136.            (((long)in.read() << 32) & ((long)0xFF << 32)) |
  137.            (((long)in.read() << 24) & ((long)0xFF << 24)) |
  138.            (((long)in.read() << 16) & ((long)0xFF << 16)) | 
  139.            (((long)in.read() <<  8) & ((long)0xFF <<  8)) |
  140.            (((long)in.read() <<  0) & ((long)0xFF <<  0));
  141.     }
  142.  
  143.     /**
  144.      * Reads a 32 bit float.
  145.      */
  146.     public final float readFloat() {
  147.     return int2float(readInt());
  148.     }
  149.  
  150.     /**
  151.      * Reads a 64 bit double.
  152.      */
  153.     public final double readDouble() {
  154.     return long2double(readLong());
  155.     }
  156.  
  157.     /**
  158.      * Reads a line terminated by a '\n' or EOF.
  159.      */
  160.     public final String readLine() {
  161.     InputStream in = this.in;
  162.     StringBuffer input = new StringBuffer();
  163.     int c;
  164.  
  165.     while (((c = in.read()) != -1) && (c != '\n')) {
  166.         input.appendChar((char)c);
  167.     }
  168.     if ((c == -1) && (input.length() == 0)) {
  169.         return null;
  170.     }
  171.     return input.toString();
  172.     }
  173.  
  174.     /**
  175.      * Reads a UTF format string.
  176.      */
  177.     public final String readUTF() {
  178.     InputStream in = this.in;
  179.     int utflen = ((in.read() << 8) & 0xFF00) |
  180.                  ((in.read() << 0) & 0x00FF);
  181.     char str[] = new char[utflen];
  182.     int strlen = 0;
  183.  
  184.  
  185.     for (int i = 0 ; i < utflen ;) {
  186.         int c = in.read();
  187.         if ((c & 0x80) == 0) {
  188.         str[strlen++] = (char)c;
  189.         i++;
  190.         } else if ((c & 0xE0) == 0xC0) {
  191.         str[strlen++] = (char)(((c & 0x1F) << 6) | (in.read() & 0x3F));
  192.         i += 2;
  193.         } else {
  194.         str[strlen++] = (char)(((c & 0x0F) << 12) |
  195.                        ((in.read() & 0x3F) << 6) |
  196.                        (in.read() & 0x3F));
  197.         i += 3;
  198.         } 
  199.     }
  200.     return new String(str, 0, strlen);
  201.     }
  202.  
  203.     /*
  204.      * Conversions
  205.      */
  206.     private native float int2float(int v);
  207.     private native double long2double(long v);
  208. }
  209.