STIL offers a number of options for reading a VOTable document,
described below. In all cases they provide you with a way of
obtaining the table data (contents of the cells) without having to
know how these were encoded. The API defines the contents of a cell
only as an Object
, but to make sense of them, you will
need to have an idea what kind of object each is.
In general, scalars are represented by the corresponding primitive
wrapper class,
and arrays are represented by an array of primitives of the corresponding
type. Arrays are only ever one-dimensional - information about any
multidimensional shape they may have is supplied separately
(use the getShape
method on the corresponding
ColumnInfo
).
There are a couple of exceptions to this: arrays with
datatype="char"
or "unicodeChar"
are represented by String objects
since that is almost always what is intended
(n-dimensional arrays of char
are treated as if they were
(n-1)-dimensional arrays of Strings),
and unsignedByte
types are represented as if they were
short
s, since in Java bytes are always signed.
Complex values are represented as if they were an array of the corresponding
type but with an extra dimension of size two (the most rapidly varying).
Here is how all VOTable datatypes are represented then:
datatype Class for scalar Class for arraysize>1 -------- ---------------- --------------------- boolean Boolean boolean[] bit boolean[] boolean[] unsignedByte Short short[] short Short short[] int Integer int[] long Long long[] char Char String or String[] unicodeChar Char String or String[] float Float float[] double Double double[] floatComplex float[] float[] doubleComplex double[] double[]
It is not, however, necessary to investigate the values of the
datatype
and arraysize
attributes to work
out what kinds of objects you are going to get as values of cells
in a table. Each column of the table object that STIL gives you
can report the class of object which will be found in it.
In most cases, you will receive a
StarTable
object which contains
the table metadata. To find the class of objects in the fourth column,
you can do this:
Class clazz = starTable.getColumnInfo(3).getContentClass();Every value obtained from a cell in that column can be cast to the class
clazz
(though note such a value might be
null
).
Useful tip: for generic processing it is often handy to cast
numeric scalar cell contents to type
Number
.