Top Description Methods
com.amazon.ion

public Interface IonWriter

extends Closeable, Flushable, Faceted
Known Direct Subinterfaces
com.amazon.ion.impl._Private_IonWriter, com.amazon.ion.impl._Private_ListWriter, com.amazon.ion.impl.bin._Private_IonManagedWriter, com.amazon.ion.impl.bin._Private_IonRawWriter, com.amazon.ion.IonBinaryWriter
Known Direct Implementers
com.amazon.ion.impl._Private_IonWriterBase
Imports
com.amazon.ion.facet.Faceted, com.amazon.ion.system.IonTextWriterBuilder, com.amazon.ion.util.IonStreamUtils, java.io.ByteArrayOutputStream, .Closeable, .Flushable, .IOException, java.math.BigDecimal, .BigInteger, java.util.Date

Writes Ion data to an output source. This interface allows the user to write Ion data without being concerned about which output format is being used.

Warning

This interface should not be implemented or extended by code outside of this library.

A value is written via the set of typed write*() methods such as writeBool(boolean) and writeInt(long). Each of these methods outputs a single Ion value, and afterwards the writer is prepared to receive the data for the next sibling value.

Any type annotations must be set before the value is written. Once the value has been written the "pending annotations" are erased, so they are must be set again if they need to be applied to the next value.

Similarly the field name must be set before the value is written (assuming the value is a field in a structure). The field name is also "erased" once used, so it must be set for each field.

To write a container, first write any annotations and/or field name applicable to the container itself. Then call stepIn(IonType) with the desired container type. Then write each child value in order. Finally, call stepOut() to complete the container.

Once all the top-level values have been written (and stepped-out back to the starting level), the caller must close() the writer (or at least flush() or finish() it) before accessing the data written to the underlying data sink (for example, via ByteArrayOutputStream#toByteArray()). The writer may have internal buffers and without closing, flushing, or finishing it, it may not have written everything to the underlying data sink.

Exception Handling

IonWriter is a generic interface for generating Ion data, and it's not possible to fully specify the set of exceptions that could be thrown from the underlying data sink. Thus all failures are thrown as instances of IonException, wrapping the originating cause. If an application wants to handle (say) IOExceptions specially, then it needs to extract that from the wrappers; the documentation of IonException explains how to do that.
See Also
IonStreamUtils, IonTextWriterBuilder

Method Summary

Modifier and TypeMethod and Description
public void
addTypeAnnotation(String
string annotation to append to the annotation list
annotation
)

Adds a given string to the list of pending annotations.

public void
close()

Redeclares java.io.Closeable.close.

Closes this stream and releases any system resources associated with it.

public void
finish()

Indicates that writing is completed and all buffered data should be written and flushed as if this were the end of the Ion data stream.

public void
flush()

Redeclares java.io.Flushable.flush.

Flushes this writer by writing any buffered output to the underlying output target without finalizing the stream's local symbol table.

public SymbolTable

Returns:

current symbol table
getSymbolTable
()

Gets the symbol table that is currently in use by the writer.

public boolean

Returns:

true when the parent is a struct.
isInStruct
()

Determines whether values are being written as fields of a struct.

public void
setFieldName(String
text of the field name
name
)

Sets the pending field name to the given text.

public void
setFieldNameSymbol(SymbolToken
text of the field name
name
)

Sets the pending field name to the given token.

public void
setTypeAnnotations(String...
string array with the annotations. If null or empty, any pending annotations are cleared.
annotations
)

Sets the full list of pending annotations to the given text symbols.

public void
setTypeAnnotationSymbols(SymbolToken...
If null or empty, any pending annotations are cleared.
annotations
)

Sets the full list of pending annotations to the given symbols.

public void
stepIn(IonType containerType)

Writes the beginning of a non-null container (list, sexp, or struct).

public void
stepOut()

Writes the end of the current container, returning this writer to the context of parent container.

public void
writeBlob(byte[]
may be null to represent null.blob.
value
)

write the byte array out as an IonBlob value.

public void
writeBlob(byte[]
bytes to be written. May be null to represent null.blob.
value
,
int
offset of the first byte in value to write
start
,
int
number of bytes to write from value
len
)

Writes a portion of the byte array out as an IonBlob value.

public void
writeBool(boolean
true or false as desired
value
)

writes a non-null boolean value (true or false) as an IonBool to output.

public void
writeClob(byte[]
may be null to represent null.clob.
value
)

write the byte array out as an IonClob value.

public void
writeClob(byte[]
bytes to be written. May be null to represent null.clob.
value
,
int
offset of the first byte in value to write
start
,
int
number of bytes to write from value
len
)

Writes a portion of the byte array out as an IonClob value.

public void
writeDecimal(BigDecimal
may be null to represent null.decimal.
value
)

Writes a BigDecimal value as an Ion decimal.

public void
writeFloat(double
double to write
value
)

writes a 64 bit binary floating point value, a Java double, as an IonFloat.

public void
writeInt(long
signed int to write
value
)

writes a signed 64 bit value, a Java long, as an IonInt.

public void
writeInt(BigInteger
BigInteger to write
value
)

writes a BigInteger value as an IonInt.

public void
writeNull()

Writes a value of Ion's null type (null aka null.null).

public void
writeNull(IonType
type of the null to be written
type
)

Writes a null value of a specified Ion type.

public void
writeString(String
may be null to represent null.string.
value
)

Writes a java.lang.String as an Ion string.

public void
writeSymbol(String
may be null to represent null.symbol.
content
)

Writes the text of an Ion symbol value.

public void
writeSymbolToken(SymbolToken
may be null to represent null.symbol.
content
)

Writes the content of an Ion symbol value.

public void
writeTimestamp(Timestamp
may be null to represent null.timestamp.
value
)

Writes a timestamp value.

public void
writeTimestampUTC(Date
java.util Date holding the UTC timestamp; may be null to represent null.timestamp.
value
)

writes the passed in Date (in milliseconds since the epoch) as an IonTimestamp.

public void
writeValue(IonValue
may be null, in which case this method does nothing.
value
)
Deprecated Use IonValue#writeTo(IonWriter) instead.

writes the contents of the passed in Ion value to the output.

public void
writeValue(IonReader reader)

Writes the current value from a reader.

public void
writeValues(IonReader reader)

Writes a reader's current value, and all following values until the end of the current container.

Inherited from com.amazon.ion.facet.Faceted:
asFacet

Method Detail

addTypeAnnotationback to summary
public void addTypeAnnotation(String annotation)

Adds a given string to the list of pending annotations.

The list of pending annotations is cleared when the current value is written via stepIn() or one of the write*() methods.

Parameters
annotation:String

string annotation to append to the annotation list

closeback to summary
public void close() throws IOException

Redeclares java.io.Closeable.close.

Closes this stream and releases any system resources associated with it. If the stream is already closed then invoking this method has no effect.

If the cursor is between top-level values, this method will finish() before closing the underlying output stream. If not, the resulting data may be incomplete and invalid Ion.

In other words: unless you're recovering from a failure condition, don't close the writer until you've stepped-out back to the starting level.

Exceptions
IOException:
if thrown by the underlying output target.
See Also
finish()
finishback to summary
public void finish() throws IOException

Indicates that writing is completed and all buffered data should be written and flushed as if this were the end of the Ion data stream. For example, an Ion binary writer will finalize any local symbol table, write all top-level values, and then flush.

This method may only be called when all top-level values are completely written and stepped-out.

Implementations should allow the application to continue writing further top-level values following the semantics for concatenating Ion data streams. If another top-level value is written, the result must behave as if it were preceded by an Ion version marker, resetting the stream context as if this were a new stream. (Whether or not an IVM is written may depend upon the writer's configuration; see IvmMinimizing.)

This feature can be used to flush buffered data and reset the local symbol table before writing more values. Applications that produce long streams of binary Ion may wish to finish occasionally to relieve memory pressure, then continue writing data using a new local symbol table. This is particularly useful for streams that contain an ever-growing number of unique symbols to avoid unbounded growth of the symbol table, which may degrade performance and bloat the encoding. Applications that produce long streams with a limited number of unique symbols should enable localSymbolTableAppend (see com.amazon.ion.system.IonBinaryWriterBuilder#withLocalSymbolTableAppendEnabled) and flush() instead to avoid re-declaring the local symbol table unnecessarily.

Exceptions
IOException:
if thrown by the underlying output target.
IllegalStateException:
when not between top-level values.
See Also
flush(), close()
flushback to summary
public void flush() throws IOException

Redeclares java.io.Flushable.flush.

Flushes this writer by writing any buffered output to the underlying output target without finalizing the stream's local symbol table.

For some implementations this may have no effect even when some data is buffered, because it's not always possible to fully write partial data. In particular, when writing binary Ion data, Ion's length-prefixed encoding requires a complete top-level value to be written at once.

If localSymbolTableAppend is enabled (see com.amazon.ion.system.IonBinaryWriterBuilder#withLocalSymbolTableAppendEnabled), this feature can be used to flush buffered data before writing more values without subsequently having to redeclare the current local symbol table. Applications that produce long streams of binary Ion may wish to flush occasionally to relieve memory pressure, then continue writing data using the same local symbol table. The symbol table will be appended with newly-encountered symbols as necessary.

Exceptions
IOException:
if thrown by the underlying output target.
See Also
finish()
getSymbolTableback to summary
public SymbolTable getSymbolTable()

Gets the symbol table that is currently in use by the writer. While writing a number of values the symbol table will be populated with any added symbols.

Note that the table may be replaced during processing. For example, the stream may start out with a system table that's later replaced by a local table in order to store newly-encountered symbols.

When this method returns a local table, it may be mutable, meaning that additional symbols may be interned until it is made read-only. Note that manually mutating local symbol tables is a deprecated feature; please instead use IonSystem#newBinaryWriter(java.io.OutputStream, SymbolTable...) or IonSystem#newTextWriter(java.io.OutputStream, SymbolTable...) to provide custom symbol table(s) to writers upon construction.

Returns:SymbolTable

current symbol table

isInStructback to summary
public boolean isInStruct()

Determines whether values are being written as fields of a struct. This is especially useful when it is not clear whether field names need to be written or not.

Returns:boolean

true when the parent is a struct.

setFieldNameback to summary
public void setFieldName(String name)

Sets the pending field name to the given text.

The pending field name is cleared when the current value is written via stepIn() or one of the write*() methods.

Parameters
name:String

text of the field name

Exceptions
IllegalStateException:
if the current container isn't a struct, that is, if isInStruct() is false.
NullPointerException:
if name is null.
setFieldNameSymbolback to summary
public void setFieldNameSymbol(SymbolToken name)

Sets the pending field name to the given token.

The pending field name is cleared when the current value is written via stepIn() or one of the write*() methods.

Parameters
name:SymbolToken

text of the field name

Exceptions
IllegalStateException:
if the current container isn't a struct, that is, if isInStruct() is false.
NullPointerException:
if name is null.
setTypeAnnotationsback to summary
public void setTypeAnnotations(String... annotations)

Sets the full list of pending annotations to the given text symbols. Any pending annotations are cleared. The contents of the annotations array are copied into this writer, so the caller does not need to preserve the array.

The list of pending annotations is cleared when the current value is written via stepIn() or one of the write*() methods.

Parameters
annotations:String[]

string array with the annotations. If null or empty, any pending annotations are cleared.

setTypeAnnotationSymbolsback to summary
public void setTypeAnnotationSymbols(SymbolToken... annotations)

Sets the full list of pending annotations to the given symbols. Any pending annotations are cleared. The contents of the annotations array are copied into this writer, so the caller does not need to preserve the array.

The list of pending annotations is cleared when the current value is written via stepIn() or one of the write*() methods.

This is an "expert method": correct use requires deep understanding of the Ion binary format. You almost certainly don't want to use it.

Parameters
annotations:SymbolToken[]

If null or empty, any pending annotations are cleared.

stepInback to summary
public void stepIn(IonType containerType) throws IOException

Writes the beginning of a non-null container (list, sexp, or struct). This must be matched by a call to stepOut() after the last child value.

This method is not used to write null.list et al. To write null values use writeNull(IonType).

Parameters
containerType:IonType

must be one of IonType#LIST, IonType#SEXP, or IonType#STRUCT.

stepOutback to summary
public void stepOut() throws IOException

Writes the end of the current container, returning this writer to the context of parent container. Invocation of this method must match a preceding call to stepIn(IonType).

writeBlobback to summary
public void writeBlob(byte[] value) throws IOException

write the byte array out as an IonBlob value. This copies the byte array.

Parameters
value:byte[]

may be null to represent null.blob.

writeBlobback to summary
public void writeBlob(byte[] value, int start, int len) throws IOException

Writes a portion of the byte array out as an IonBlob value. This copies the portion of the byte array that is written.

Parameters
value:byte[]

bytes to be written. May be null to represent null.blob.

start:int

offset of the first byte in value to write

len:int

number of bytes to write from value

writeBoolback to summary
public void writeBool(boolean value) throws IOException

writes a non-null boolean value (true or false) as an IonBool to output.

Parameters
value:boolean

true or false as desired

writeClobback to summary
public void writeClob(byte[] value) throws IOException

write the byte array out as an IonClob value. This copies the byte array.

Parameters
value:byte[]

may be null to represent null.clob.

writeClobback to summary
public void writeClob(byte[] value, int start, int len) throws IOException

Writes a portion of the byte array out as an IonClob value. This copies the porition of the byte array that is written.

Parameters
value:byte[]

bytes to be written. May be null to represent null.clob.

start:int

offset of the first byte in value to write

len:int

number of bytes to write from value

writeDecimalback to summary
public void writeDecimal(BigDecimal value) throws IOException

Writes a BigDecimal value as an Ion decimal. Ion uses an arbitrarily long sign/value and an arbitrarily long signed exponent to write the value. This preserves all of the BigDecimal digits, the number of significant digits.

To write a negative zero value, pass this method a Decimal instance.

Parameters
value:BigDecimal

may be null to represent null.decimal.

writeFloatback to summary
public void writeFloat(double value) throws IOException

writes a 64 bit binary floating point value, a Java double, as an IonFloat. Currently IonFloat values are output as 64 bit IEEE 754 big endian values. IonFloat preserves all valid floating point values, including -0.0, Nan and +/-infinity. It does not guarantee preservation of -Nan or other less less "common" values.

Parameters
value:double

double to write

writeIntback to summary
public void writeInt(long value) throws IOException

writes a signed 64 bit value, a Java long, as an IonInt.

Parameters
value:long

signed int to write

writeIntback to summary
public void writeInt(BigInteger value) throws IOException

writes a BigInteger value as an IonInt. If the BigInteger value is null this writes a null int.

Parameters
value:BigInteger

BigInteger to write

writeNullback to summary
public void writeNull() throws IOException

Writes a value of Ion's null type (null aka null.null).

writeNullback to summary
public void writeNull(IonType type) throws IOException

Writes a null value of a specified Ion type.

Parameters
type:IonType

type of the null to be written

writeStringback to summary
public void writeString(String value) throws IOException

Writes a java.lang.String as an Ion string. Since Ion strings are UTF-8 and Java Strings are Unicode 16. As such the resulting lengths may not match. In addition some Java strings are not valid as they may contain only one of the two needed surrogate code units necessary to define the Unicode code point to be output, an exception will be raised if this case is encountered.

Parameters
value:String

may be null to represent null.string.

Exceptions
IllegalArgumentException:
if the value contains an invalid UTF-16 surrogate pair.
writeSymbolback to summary
public void writeSymbol(String content) throws IOException

Writes the text of an Ion symbol value.

Parameters
content:String

may be null to represent null.symbol.

Exceptions
IllegalArgumentException:
if the value contains an invalid UTF-16 surrogate pair.
writeSymbolTokenback to summary
public void writeSymbolToken(SymbolToken content) throws IOException

Writes the content of an Ion symbol value.

Parameters
content:SymbolToken

may be null to represent null.symbol.

Exceptions
IllegalArgumentException:
if the value contains an invalid UTF-16 surrogate pair.
writeTimestampback to summary
public void writeTimestamp(Timestamp value) throws IOException

Writes a timestamp value.

Parameters
value:Timestamp

may be null to represent null.timestamp.

writeTimestampUTCback to summary
public void writeTimestampUTC(Date value) throws IOException

writes the passed in Date (in milliseconds since the epoch) as an IonTimestamp. The Date value is treated as a UTC value with an unknown timezone offset (a z value).

Parameters
value:Date

java.util Date holding the UTC timestamp; may be null to represent null.timestamp.

Annotations
@Deprecated
writeValueback to summary
public void writeValue(IonValue value) throws IOException

Deprecated

Use IonValue#writeTo(IonWriter) instead.

writes the contents of the passed in Ion value to the output.

This method also writes annotations and field names (if in a struct), and performs a deep write, including the contents of any containers encountered.

Parameters
value:IonValue

may be null, in which case this method does nothing.

Annotations
@Deprecated
writeValueback to summary
public void writeValue(IonReader reader) throws IOException

Writes the current value from a reader.

This method also writes annotations and field names (if in a struct), and performs a deep write, including the contents of any containers encountered.

writeValuesback to summary
public void writeValues(IonReader reader) throws IOException

Writes a reader's current value, and all following values until the end of the current container. If there's no current value then this method calls IonReader#next() to get going.

This method iterates until IonReader#next() returns null and does not step out to the container of the current cursor position.

This method also writes annotations and field names (if in a struct), and performs a deep write, including the contents of any containers encountered.