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

Quick Search    Search Deep

cformat
Class ScanfReader  view ScanfReader download ScanfReader.java

java.lang.Object
  extended byjava.io.Reader
      extended bycformat.ScanfReader

public class ScanfReader
extends java.io.Reader

A Reader which implements C scanf functionality. Once created, an application can read various primitive types from the underlying stream using various scan methods that implement scanf type input formatting.

There are scan methods to read float, double, long, int, char, char[], and String. The methods take as an argument either a format string, a pre-allocated ScanfFormat object which is created from a format string, or no argument (implying a default format). The format string is modeled after that accepted by the C scanf() methodName, and is described in the documentation for the class ScanfFormat.

Because Java does not permit variable-length argument lists, only one primitive type may be returned per method, and the format used may contain only one conversion specification (which must be appropriate to the type being scanned).

Input errors in the underlying Reader result in a java.io.IOException being thrown, while a java.io.EOFException is thrown if the end of input is reached before the scan can complete successfully. If the input does not match the specified format, then a ScanfMatchException is thrown. In the event of a match error, scanning stops at the first character from which it can be determined that the match will fail. This character is remembered by the stream (see the discussion of the look-ahead character, below) and will be the first character seen by the next scan or read method which is called. Finally, an invalid format string (or ScanfFormat object) will trigger an InvalidArgumentException.

The class keeps track of the current line number (accessible with the methods getLineNumber and setLineNumber), as well as the number of characters which have been consumed (accesible with the methods getCharNumber and setCharNumber).

The class usually keeps one character of look-ahead which has been read from the underlying reader but not yet consumed by any scan method. If the underlying reader is used later in some other capacity, this look-ahead character may have to be taken into account. If a look-ahead character is actually being stored, the lookAheadCharValid method will return true, and the look-ahead character itself can then be obtained using the getLookAheadChar method. The look-ahead character can be cleared using the clearLookAheadChar method.


Field Summary
private  int bcnt
           
private  char[] buffer
           
private static int BUFSIZE
           
private  int charCnt
           
private  int curChar
           
private  boolean curCharValid
           
private static ScanfFormat defaultCharFmt
           
private static ScanfFormat defaultDecFmt
           
private static ScanfFormat defaultDoubleFmt
           
private static ScanfFormat defaultHexFmt
           
private static ScanfFormat defaultIntFmt
           
private static ScanfFormat defaultOctFmt
           
private static ScanfFormat defaultStringFmt
           
private static java.lang.String hexChars
           
private  int lastChar
           
private  int lineCnt
           
private static java.lang.String octChars
           
private  java.io.Reader reader
           
private  boolean spacesCStandardFlag
           
 
Fields inherited from class java.io.Reader
lock
 
Constructor Summary
ScanfReader(java.io.Reader in)
          Create a new ScanfReader from the given reader.
 
Method Summary
private  boolean acceptChar(char c, int width)
           
private  boolean acceptDigits(int width)
           
private  void checkTypeAndScanPrefix(ScanfFormat fmt, java.lang.String type)
           
 void clearLookAheadChar()
          Clears the look-ahead character.
 void close()
          Closes the stream.
private  void consumeAndReplaceChar()
           
private  void consumeChar()
           
 int getCharNumber()
          Gets the current character number (equal to the number of characters that have been consumed by the stream).
 int getLineNumber()
          Gets the current line number.
 int getLookAheadChar()
          Returns the look-ahead character.
private  void initChar()
           
 boolean lookAheadCharValid()
          Returns whether or not a look-ahead character is currently begin stored.
private  void matchString(java.lang.String s)
           
 int read(char[] cbuf, int off, int len)
          Reads characters into a portion of a character array.
 char scanChar()
          Scan and return a single character, using the default format string "%c".
 char scanChar(ScanfFormat fmt)
          Scan and return a single character, using a pre-allocated ScanfFormat object.
 char scanChar(java.lang.String s)
          Scan and return a single character.
 char[] scanChars(int n)
          Scan and return a character array, using the default format string "%c", with the field width (number of characters to read) supplanted by the argument n.
 char[] scanChars(ScanfFormat fmt)
          Scan and return a character array, using a pre-allocated ScanfFormat object.
private  char[] scanChars(ScanfFormat fmt, int w)
          Implementing methodName for scanChars.
 char[] scanChars(java.lang.String s)
          Scan and return a character array, whose size is determined by the field width specified in the format string (with a default width of 1 being assumed if no width is specified).
 long scanDec()
          Scan and return a signed decimal (long) integer, using the default format string "%d".
 long scanDec(ScanfFormat fmt)
          Scan and return a signed decimal (long) integer, using a pre-allocated ScanfFormat object.
private  long scanDec(ScanfFormat fmt, int width)
          Implementing methodName for scanDec.
 long scanDec(java.lang.String s)
          Scan and return a signed decimal (long) integer.
 double scanDouble()
          Scan and return a double, using the default format string "%f".
 double scanDouble(ScanfFormat fmt)
          Scan and return a double, using a pre-allocated ScanfFormat object.
 double scanDouble(java.lang.String s)
          Scan and return a double.
 float scanFloat()
          Scan and return a float, using the default format string "%f".
 float scanFloat(ScanfFormat fmt)
          Scan and return a float, using a pre-allocated ScanfFormat object.
 float scanFloat(java.lang.String s)
          Scan and return a float.
 long scanHex()
          Scan and return a hex (long) integer, using the default format string "%x".
 long scanHex(ScanfFormat fmt)
          Scan and return a hex (long) integer, using a pre-allocated ScanfFormat object.
private  long scanHex(ScanfFormat fmt, int width)
          Implementing methodName for scanHex.
 long scanHex(java.lang.String s)
          Scan and return a hex (long) integer.
 int scanInt()
          Scan and return a signed integer, using the default format string "%i".
 int scanInt(ScanfFormat fmt)
          Scan and return a signed integer, using a pre-allocated ScanfFormat object.
 int scanInt(java.lang.String s)
          Scan and return a signed integer.
 long scanLong()
          Scan and return a signed (long) integer, using the default format string "%i".
 long scanLong(ScanfFormat fmt)
          Scan and return a signed (long) integer, using a pre-allocated ScanfFormat object.
 long scanLong(java.lang.String s)
          Scan and return a signed (long) integer.
 long scanOct()
          Scan and return an octal (long) integer, using the default format string "%o".
 long scanOct(ScanfFormat fmt)
          Scan and return an octal (long) integer, using a pre-allocated ScanfFormat object.
private  long scanOct(ScanfFormat fmt, int width)
          Implementing methodName for scanOct.
 long scanOct(java.lang.String s)
          Scan and return an octal (long) integer.
private  void scanPrefix(ScanfFormat fmt)
           
 java.lang.String scanString()
          Scan and return a String, using the default format string "%s".
 java.lang.String scanString(ScanfFormat fmt)
          Scan and return a String, using a pre-allocated ScanfFormat object.
 java.lang.String scanString(java.lang.String s)
          Scan and return a String.
private  void scanSuffix(ScanfFormat fmt)
           
 void setCharNumber(int n)
          Sets the current character number.
 void setLineNumber(int n)
          Sets the current line number.
private  boolean skipWhiteSpace()
          Skip white spacew and count line numbers.
private  int skipWhiteSpace(int limit)
          Skip white spacew and count line numbers.
 boolean useCstandard()
          White spaces are skipped at the beginning of a line if flag is true otherwise spaces are counted as valid characters.
 void useCstandard(boolean flag)
          White spaces are skipped at the beginning of a line if flag is true otherwise spaces are counted as valid characters.
 
Methods inherited from class java.io.Reader
mark, markSupported, read, read, ready, reset, skip
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

hexChars

private static java.lang.String hexChars

octChars

private static java.lang.String octChars

BUFSIZE

private static final int BUFSIZE
See Also:
Constant Field Values

defaultDoubleFmt

private static ScanfFormat defaultDoubleFmt

defaultIntFmt

private static ScanfFormat defaultIntFmt

defaultDecFmt

private static ScanfFormat defaultDecFmt

defaultHexFmt

private static ScanfFormat defaultHexFmt

defaultOctFmt

private static ScanfFormat defaultOctFmt

defaultStringFmt

private static ScanfFormat defaultStringFmt

defaultCharFmt

private static ScanfFormat defaultCharFmt

reader

private java.io.Reader reader

buffer

private char[] buffer

curCharValid

private boolean curCharValid

spacesCStandardFlag

private boolean spacesCStandardFlag

bcnt

private int bcnt

charCnt

private int charCnt

curChar

private int curChar

lastChar

private int lastChar

lineCnt

private int lineCnt
Constructor Detail

ScanfReader

public ScanfReader(java.io.Reader in)
Create a new ScanfReader from the given reader.

Method Detail

setCharNumber

public void setCharNumber(int n)
Sets the current character number.


getCharNumber

public int getCharNumber()
Gets the current character number (equal to the number of characters that have been consumed by the stream).


setLineNumber

public void setLineNumber(int n)
Sets the current line number.


getLineNumber

public int getLineNumber()
Gets the current line number. The initial value (when the Reader is created) is 1. A new line is recorded upon reading a carriage return, a line feed, or a carriage return immediately followed by a line feed.


getLookAheadChar

public int getLookAheadChar()
Returns the look-ahead character.


clearLookAheadChar

public void clearLookAheadChar()
Clears the look-ahead character.


close

public void close()
           throws java.io.IOException
Closes the stream.


lookAheadCharValid

public boolean lookAheadCharValid()
Returns whether or not a look-ahead character is currently begin stored.


read

public int read(char[] cbuf,
                int off,
                int len)
         throws java.io.IOException
Reads characters into a portion of a character array. The method will block until input is available, an I/O error occurs, or the end of the stream is reached.


scanChar

public char scanChar(java.lang.String s)
              throws java.io.IOException,
                     ScanfMatchException,
                     java.lang.IllegalArgumentException
Scan and return a single character.

The format string s must have the form described by the documentation for the class ScanfFormat, and must contain the conversion character 'c' or '['. If the conversion character is '[', then each character scanned must match the sequence specified between the '[' and the closing ']' (see the documentation for ScanfFormat).

White space preceding the character is not skipped.


scanChar

public char scanChar()
              throws java.io.IOException,
                     ScanfMatchException
Scan and return a single character, using the default format string "%c".


scanChar

public char scanChar(ScanfFormat fmt)
              throws java.io.IOException,
                     java.lang.IllegalArgumentException
Scan and return a single character, using a pre-allocated ScanfFormat object. This saves the overhead of parsing the format from a string.


scanChars

public char[] scanChars(java.lang.String s)
                 throws java.io.IOException,
                        ScanfMatchException,
                        java.lang.IllegalArgumentException
Scan and return a character array, whose size is determined by the field width specified in the format string (with a default width of 1 being assumed if no width is specified).

The format string s must have the form described by the documentation for the class ScanfFormat, and must contain the conversion characters 'c' or '['. If the conversion character is '[', then each character scanned must match the sequence specified between the '[' and the closing ']' (see the documentation for ScanfFormat).

White space preceding the character sequence is not skipped.


scanChars

public char[] scanChars(int n)
                 throws java.io.IOException,
                        ScanfMatchException,
                        java.lang.IllegalArgumentException
Scan and return a character array, using the default format string "%c", with the field width (number of characters to read) supplanted by the argument n.


scanChars

public char[] scanChars(ScanfFormat fmt)
                 throws java.io.IOException,
                        java.lang.IllegalArgumentException
Scan and return a character array, using a pre-allocated ScanfFormat object. This saves the overhead of parsing the format from a string.


scanDec

public long scanDec(java.lang.String s)
             throws java.io.IOException,
                    ScanfMatchException,
                    java.lang.IllegalArgumentException
Scan and return a signed decimal (long) integer.

The format string s must have the form described by the documentation for the class ScanfFormat, and must contain the conversion character 'd'. The integer itself must consist of an optional sign ('+' or '-') followed by a sequence of digits. White space preceding the number is skipped.


scanDec

public long scanDec()
             throws java.io.IOException,
                    ScanfMatchException
Scan and return a signed decimal (long) integer, using the default format string "%d".


scanDec

public long scanDec(ScanfFormat fmt)
             throws java.io.IOException,
                    java.lang.IllegalArgumentException
Scan and return a signed decimal (long) integer, using a pre-allocated ScanfFormat object. This saves the overhead of parsing the format from a string.


scanDouble

public double scanDouble(java.lang.String s)
                  throws java.io.IOException,
                         ScanfMatchException,
                         java.lang.IllegalArgumentException
Scan and return a double.

The format string s must have the form described by the documentation for the class ScanfFormat, and must contain the conversion character 'f'. The number itself may consist of (a) an optional sign ('+' or '-'), (b) a sequence of decimal digits, with an optional decimal point, (c) an optional exponent ('e' or 'E'), which must by followed by an optionally signed sequence of decimal digits. White space immediately before the number is skipped.


scanDouble

public double scanDouble()
                  throws java.io.IOException,
                         ScanfMatchException
Scan and return a double, using the default format string "%f".


scanDouble

public double scanDouble(ScanfFormat fmt)
                  throws java.io.IOException,
                         ScanfMatchException,
                         java.lang.IllegalArgumentException
Scan and return a double, using a pre-allocated ScanfFormat object. This saves the overhead of parsing the format from a string.


scanFloat

public float scanFloat(java.lang.String s)
                throws java.io.IOException,
                       ScanfMatchException,
                       java.lang.IllegalArgumentException
Scan and return a float. The format string s takes the same form as that described in the documentation for scanDouble(String).


scanFloat

public float scanFloat()
                throws java.io.IOException,
                       ScanfMatchException
Scan and return a float, using the default format string "%f".


scanFloat

public float scanFloat(ScanfFormat fmt)
                throws java.io.IOException,
                       ScanfMatchException,
                       java.lang.IllegalArgumentException
Scan and return a float, using a pre-allocated ScanfFormat object. This saves the overhead of parsing the format from a string.


scanHex

public long scanHex(java.lang.String s)
             throws java.io.IOException,
                    ScanfMatchException,
                    java.lang.IllegalArgumentException
Scan and return a hex (long) integer.

The format string s must have the form described by the documentation for the class ScanfFormat, and must contain the conversion character 'x'. The integer itself must be formed from the characters [0-9a-fA-F], and white space which immediately precedes it is skipped.


scanHex

public long scanHex()
             throws java.io.IOException,
                    ScanfMatchException
Scan and return a hex (long) integer, using the default format string "%x".


scanHex

public long scanHex(ScanfFormat fmt)
             throws java.io.IOException,
                    java.lang.IllegalArgumentException
Scan and return a hex (long) integer, using a pre-allocated ScanfFormat object. This saves the overhead of parsing the format from a string.


scanInt

public int scanInt(java.lang.String s)
            throws java.io.IOException,
                   ScanfMatchException,
                   java.lang.IllegalArgumentException
Scan and return a signed integer.

The format string s must have the form described by the documentation for the class ScanfFormat, and must contain one of the conversion characters "doxi".

Specifying the conversion characters 'd', 'o', or 'x' is equivalent to calling (int versions of) scanDec, scanOct, and scanHex, respectively.

If the conversion character is 'i', then after an optional sign ('+' or '-'), if the number begins with an 0x, then it is scanned as a hex number; if it begins with an 0, then it is scanned as an octal number, and otherwise it is scanned as a decimal number. White space preceding the number is skipped.


scanInt

public int scanInt()
            throws java.io.IOException,
                   ScanfMatchException
Scan and return a signed integer, using the default format string "%i".


scanInt

public int scanInt(ScanfFormat fmt)
            throws java.io.IOException,
                   java.lang.IllegalArgumentException
Scan and return a signed integer, using a pre-allocated ScanfFormat object. This saves the overhead of parsing the format from a string.


scanLong

public long scanLong(java.lang.String s)
              throws java.io.IOException,
                     ScanfMatchException,
                     java.lang.IllegalArgumentException
Scan and return a signed (long) integer. Functionality is identical to that for scanInt(String).


scanLong

public long scanLong()
              throws java.io.IOException,
                     ScanfMatchException
Scan and return a signed (long) integer, using the default format string "%i".


scanLong

public long scanLong(ScanfFormat fmt)
              throws java.io.IOException,
                     java.lang.IllegalArgumentException
Scan and return a signed (long) integer, using a pre-allocated ScanfFormat object.


scanOct

public long scanOct(java.lang.String s)
             throws java.io.IOException,
                    ScanfMatchException,
                    java.lang.IllegalArgumentException
Scan and return an octal (long) integer.

The format string s must have the form described by the documentation for the class ScanfFormat, and must contain the conversion character 'o'. The integer itself must be composed of the digits [0-7], and white space which immediately precedes it is skipped.


scanOct

public long scanOct()
             throws java.io.IOException,
                    ScanfMatchException
Scan and return an octal (long) integer, using the default format string "%o".


scanOct

public long scanOct(ScanfFormat fmt)
             throws java.io.IOException,
                    java.lang.IllegalArgumentException
Scan and return an octal (long) integer, using a pre-allocated ScanfFormat object. This saves the overhead of parsing the format from a string.


scanString

public java.lang.String scanString(java.lang.String s)
                            throws java.io.IOException,
                                   ScanfMatchException,
                                   java.lang.IllegalArgumentException
Scan and return a String.

The format string s must have the form described by the documentation for the class ScanfFormat, and must contain the conversion character 's'. The string returned corresponds to the next non-white-space sequence of characters found in the input, with preceding white space skipped.


scanString

public java.lang.String scanString()
                            throws java.io.IOException,
                                   ScanfMatchException
Scan and return a String, using the default format string "%s".


scanString

public java.lang.String scanString(ScanfFormat fmt)
                            throws java.io.IOException,
                                   java.lang.IllegalArgumentException
Scan and return a String, using a pre-allocated ScanfFormat object. This saves the overhead of parsing the format from a string.


useCstandard

public void useCstandard(boolean flag)
White spaces are skipped at the beginning of a line if flag is true otherwise spaces are counted as valid characters.


useCstandard

public boolean useCstandard()
White spaces are skipped at the beginning of a line if flag is true otherwise spaces are counted as valid characters.


acceptChar

private final boolean acceptChar(char c,
                                 int width)
                          throws java.io.IOException

acceptDigits

private final boolean acceptDigits(int width)
                            throws java.io.IOException

checkTypeAndScanPrefix

private final void checkTypeAndScanPrefix(ScanfFormat fmt,
                                          java.lang.String type)
                                   throws java.io.IOException,
                                          java.lang.IllegalArgumentException

consumeAndReplaceChar

private final void consumeAndReplaceChar()
                                  throws java.io.IOException

consumeChar

private final void consumeChar()
                        throws java.io.IOException

initChar

private final void initChar()
                     throws java.io.IOException

scanPrefix

private final void scanPrefix(ScanfFormat fmt)
                       throws java.io.IOException

scanSuffix

private final void scanSuffix(ScanfFormat fmt)
                       throws java.io.IOException

matchString

private void matchString(java.lang.String s)
                  throws java.io.IOException,
                         ScanfMatchException

scanChars

private char[] scanChars(ScanfFormat fmt,
                         int w)
                  throws java.io.IOException,
                         java.lang.IllegalArgumentException
Implementing methodName for scanChars.


scanDec

private long scanDec(ScanfFormat fmt,
                     int width)
              throws java.io.IOException,
                     java.lang.IllegalArgumentException
Implementing methodName for scanDec.


scanHex

private long scanHex(ScanfFormat fmt,
                     int width)
              throws java.io.IOException,
                     java.lang.IllegalArgumentException
Implementing methodName for scanHex.


scanOct

private long scanOct(ScanfFormat fmt,
                     int width)
              throws java.io.IOException,
                     java.lang.IllegalArgumentException
Implementing methodName for scanOct.


skipWhiteSpace

private boolean skipWhiteSpace()
                        throws java.io.IOException
Skip white spacew and count line numbers.


skipWhiteSpace

private int skipWhiteSpace(int limit)
                    throws java.io.IOException
Skip white spacew and count line numbers.