# Class StreamStarTable

java.lang.Object
uk.ac.starlink.table.AbstractStarTable
uk.ac.starlink.table.formats.StreamStarTable

All Implemented Interfaces:
  `Closeable, AutoCloseable, StarTable`

Direct Known Subclasses:
  `AsciiStarTable, CsvStarTable`

public abstract class StreamStarTable extends AbstractStarTable
Abstract superclass for tables which reads a stream of characters to obtain the row data and metadata. Since metadata is typically scarce in such tables, the strategy is to make one pass through the data attempting to work out column types etc at table initialisation time, and to make a further pass through for each required RowSequence, using the metadata obtained earlier.

Since:
  21 Sep 2004
Author:
  Mark Taylor (Starlink)
See Also:
  - `RowEvaluator`

## Field Summary

Fields
Modifier and Type
Field
Description
`protected static final char`
`END`
Char representation of -1 (as returned end-of-stream read)

## Constructor Summary

Constructors
Modifier
Constructor
Description
`protected`
`StreamStarTable()`
Constructor.

## Method Summary

Modifier and Type
Method
Description
`int`
`getColumnCount()`
Returns the number of columns in this table.
`ColumnInfo`
`getColumnInfo(int icol)`
Returns the object describing the data in a given column.
`protected PushbackInputStream`
`getInputStream()`
Convenience method which returns a buffered pushback stream based on this table's data source.
`long`
`getRowCount()`
Returns the number of rows in this table, if known.
`RowSequence`
`getRowSequence()`
Returns an object which can iterate over all the rows in the table sequentially.
`protected void`
`init(uk.ac.starlink.util.DataSource datsrc)`
Initialises the table from the input stream.
`protected abstract RowEvaluator.Metadata`
`obtainMetadata()`
Obtains column metadata for this table, probably by reading through the rows once and using a RowEvaluator.
`protected abstract List<String>`
`readRow(PushbackInputStream in)`
Reads the next row of data from a given stream.

### Methods inherited from class AbstractStarTable

`checkedLongToInt, close, getCell, getColumnAuxDataInfos, getName, getParameters, getRow, getRowAccess, getRowSplittable, getURL, isRandom, setName, setParameters, setURL`

### Methods inherited from class Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

### Methods inherited from interface StarTable

`getParameterByName, setParameter`

## Field Details

### END

protected static final char END
Char representation of -1 (as returned end-of-stream read)

See Also:
  - Constant Field Values

## Constructor Details

### StreamStarTable

protected StreamStarTable()
Constructor. This doesn't perform any processing; you must call `init(DataSource)` before doing anything with the constructed table. It is arranged this way so that the initialisation is able to call overridden methods in subclasses, which is a Bad thing to do from a constructor.

## Method Details

### init

protected void init(uk.ac.starlink.util.DataSource datsrc) throws TableFormatException, IOException
Initialises the table from the input stream. This method calls `obtainMetadata()`, which probably reads through some or all of the stream.

Parameters:
  `datsrc` - data source from which the stream can be obtained
Throws:
  `TableFormatException`
  `IOException`

### getColumnCount

public int getColumnCount()
Description copied from interface: `StarTable`
Returns the number of columns in this table.

Specified by:
  `getColumnCount` in interface `StarTable`
Specified by:
  `getColumnCount` in class `AbstractStarTable`
Returns:
  the number of columns

### getRowCount

public long getRowCount()
Description copied from interface: `StarTable`
Returns the number of rows in this table, if known. If the number of rows cannot be (easily) determined, a value of -1 will be returned.

Specified by:
  `getRowCount` in interface `StarTable`
Specified by:
  `getRowCount` in class `AbstractStarTable`
Returns:
  the number of rows, or -1

### getColumnInfo

public ColumnInfo getColumnInfo(int icol)
Description copied from interface: `StarTable`
Returns the object describing the data in a given column.

Specified by:
  `getColumnInfo` in interface `StarTable`
Specified by:
  `getColumnInfo` in class `AbstractStarTable`
Parameters:
  `icol` - the column for which header information is required
Returns:
  a ValueInfo object for column `icol`

### getRowSequence

public RowSequence getRowSequence() throws IOException
Description copied from interface: `StarTable`
Returns an object which can iterate over all the rows in the table sequentially. Each such returned object is safe for use within a single thread, but not in general from multiple threads concurrently.

Specified by:
  `getRowSequence` in interface `StarTable`
Specified by:
  `getRowSequence` in class `AbstractStarTable`
Returns:
  new RowSequence
Throws:
  `IOException` - if there is an error providing access

### getInputStream

protected PushbackInputStream getInputStream() throws IOException
Convenience method which returns a buffered pushback stream based on this table's data source.

Returns:
  input stream containing source data
Throws:
  `IOException`

### obtainMetadata

protected abstract RowEvaluator.Metadata obtainMetadata() throws TableFormatException, IOException
Obtains column metadata for this table, probably by reading through the rows once and using a RowEvaluator.

Returns:
  information about the table represented by the character stream
Throws:
  `TableFormatException` - if the data doesn't represent this kind of table
  `IOException` - if I/O error is encountered

### readRow

protected abstract List<String> readRow(PushbackInputStream in) throws TableFormatException, IOException
Reads the next row of data from a given stream. Ignorable rows are skipped; comments may be stashed away.

Parameters:
  `in` - input stream
Returns:
  list of Strings one for each cell in the row, or `null` for end of stream
Throws:
  `TableFormatException` - if the data doesn't represent this kind of table
  `IOException` - if I/O error is encountered