# Titanium.IOStream

> IOStream is the interface that all stream types implement.

- Source: https://titaniumsdk.com/docs/sdk/13.4.0/Titanium.IOStream
- Titanium SDK version: 13.4.0
- Kind: proxy
- Platforms: Android, iPhone, iPad, macOS
- Since: Titanium SDK Android 1.7, iPhone 1.7, iPad 1.7, macOS 9.2.0
- Extends: Titanium.Proxy
- Inheritance: Titanium.Proxy

See the [Titanium.Stream](https://titaniumsdk.com/docs/sdk/Titanium.Stream.md) module for related utility methods that support asynchronous
I/O.

## Example: Write Data to a Stream

This example demonstrates writing data to a stream.

``` js
var outBuffer = Ti.createBuffer({data: "write me"});
// stream object could be socket, file, buffer or blob
var outStream = Ti.Stream.createStream({mode: Ti.Stream.MODE_WRITE});

var bytesWritten = outStream.write(outBuffer);  // writes entire buffer to stream
Ti.API.info("Bytes written:" + bytesWritten);  // should be 8

bytesWritten = outStream.write(outBuffer, 2, 5);  // only writes "ite m" to stream
Ti.API.info("Bytes written:" + bytesWritten);  // should be 5
```

## Example: Read Data From a Stream

This shows a simple example of reading data from a stream, one buffer full at a
time.

``` js
var size = 0;
// read data one buffer full at a time
while ((size = instream.read(buffer)) > -1) {
    // do something with the data here ...
    Ti.API.info("Read " + size + " bytes.");
}
```

## Example: Read Data With Offset and Length

This example shows how to read data from a stream into a buffer. We assume that
the `inStream` variable holds a previously initialized stream that contains the
string, "World Titanium".

``` js
var inBuffer = Ti.createBuffer({ value: "Hello [           ]" });

// Read the first 6 bytes from the stream to the buffer, starting at position 10.
var bytesRead = inStream.read(inBuffer, 10, 6);

Ti.API.info("Bytes read: " + bytesRead);
Ti.API.info(inBuffer.toString());

// Read the next 8  bytes from the stream to the buffer, starting at position 8.
bytesRead = inStream.read(inBuffer, 8, 8);

Ti.API.info("Bytes read: " + bytesRead);
Ti.API.info(inBuffer.toString());
```

The second `read` overwrites the data from the first `read`, so the output looks
like this:

```
[INFO] Bytes read: 6
[INFO] Hello [   World   ]
[INFO] Bytes read: 8
[INFO] Hello [ Titanium  ]
```

## Methods

### close

- Platforms: Android, iPhone, iPad, macOS

Closes this stream.

Throws an exception on error.

### isReadable

- Platforms: Android, iPhone, iPad, macOS

Indicates whether this stream is readable.

Returns: Boolean - True if stream is readable, false otherwise.

### isWritable

- Platforms: Android, iPhone, iPad, macOS

Indicates whether this stream is writable.

Returns: Boolean - True if stream is writable, false otherwise.

### read

- Platforms: Android, iPhone, iPad, macOS

Reads data from this stream into a buffer.

Takes an optional `resultsCallback` function as the last argument. If specified,
the operation is done asynchronously. If no callback is passed in, the
operation is done synchronously.

If `offset` and `length` are specified, data is written into the buffer starting at
position `offset`. Data is read from this stream until one of the following occurs:

*   the end of this stream is reached
*   the end of the buffer is reached
*   a total of `length` bytes have been read from the stream

If `offset` and `length` are omitted, data is written starting at the beginning
of the buffer.

When called synchronously: returns the number of bytes read, or -1 if the end of
stream was reached before any data was read.

Returns 0 when called asynchronously.

Throws an exception on error. For example, if the `offset` value is past
the last byte of `buffer`.

Parameters:

- `buffer` (Titanium.Buffer): Buffer to read stream data into.
- `offset` (Number, optional): Offset into the buffer to start writing stream data. If specified, `length` must also be specified. Default: `0`.
- `length` (Number, optional): Maximum number of bytes to read. If specified, `offset` must also be specified. Default: `Length of the supplied buffer.`.
- `resultsCallback` (Callback<ReadCallbackArgs>, optional): Function to call with the results of the read operation.

Returns: Number - Number of bytes read.

### write

- Platforms: Android, iPhone, iPad, macOS

Writes data from a buffer to this stream.

Takes an optional `resultsCallback` function as the last argument. If specified,
the operation is done asynchronously. If no callback is passed in, the
operation is done synchronously.

If `offset` and `length` are specified, data is read from the buffer starting at
`offset`. Bytes are read from the buffer and written to the stream until:

* the end of the buffer is reached
* `length` bytes have been written
* the stream returns an error

If `offset` and `length` are omitted, all of the data in the buffer is written to
this stream.

Returns the number of bytes actually written when called synchronously.

Returns 0 when called asynchronously.

Throws an exception if an error is encountered.

Parameters:

- `buffer` (Titanium.Buffer): Buffer to write to this stream.
- `offset` (Number, optional): Offset in the buffer of the first byte to write to the stream. If specified, `length` must also be specified. Default: `0`.
- `length` (Number, optional): Maximum number of bytes to write to the stream. If specified, `offset` must also be specified. Default: `Length of the supplied buffer.`.
- `resultsCallback` (Callback<WriteCallbackArgs>, optional): Function to call with the results of the write operation.

Returns: Number - Number of bytes written.

## Inherited members

7 members are inherited. Each is documented on the type that declares it.

- [Titanium.Proxy](https://titaniumsdk.com/docs/sdk/13.4.0/Titanium.Proxy.md): `addEventListener`, `apiName`, `applyProperties`, `bubbleParent`, `fireEvent`, `lifecycleContainer`, `removeEventListener`

---

- This corpus documents Titanium SDK 13.4.1. Anything here that does not name a version describes 13.4.1.
- Titanium is maintained by TiDev. The Appcelerator toolchain is retired: there is no `appc` CLI, no Appcelerator Studio and no hosted build service. The supported CLI is `titanium` on npm, invoked as `ti`.

