|
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | ||||||||
totalcross.lang.Objecttotalcross.io.Stream
totalcross.io.CompressedByteArrayStream
public class CompressedByteArrayStream
Creates a compressed byte array stream, saving memory when reading and writting huge amount of data. Arrays of 16000 bytes will be created and each byte array will be compressed once filled and will be automatically decompressed on read. This saves space but adds a slowdown to the process. It is useful when transferring FTP files to/from the server.
This class cannot be used for output AND input, but only for output OR input, in an absolutely sequential mode (the skipBytes method is NOT implemented): you must write everything, then read everything. To change the mode, use the setMode(READ_MODE or WRITE_MODE) method. No check is made to see if you're in the right mode, but your program will probably crash if you do it in the wrong one.
Sample that transfers bytes to the server:
CompressedByteArrayStream cbas = new CompressedByteArrayStream(9); // default mode is WRITE_MODE
for (int i = 0; i < 50000; i++)
cbas.writeLine("1234567890"); // already appends \r\n
cbas.flush();
cbas.setMode(CompressedByteArrayStream.READ_MODE); // prepare for read
ftp.sendFile(cbas, "bigfile.txt", true);
// if you want to send another one, just call
cbas.setMode(CompressedByteArrayStream.WRITE_MODE);
Sample that transfers bytes from the server:
CompressedByteArrayStream cbas = new CompressedByteArrayStream(9);
ftp.receiveFile("bigfile.txt", cbas);
cbas.flush();
totalcross.lang.String line;
while ((line = cbas.readLine()) != null)
// do something with the line!
Here is another fully functional sample:
int i;
totalcross.lang.String g = "1234567890";
CompressedByteArrayStream cbas = new CompressedByteArrayStream(9); // default mode is WRITE_MODE
for (i = 0; i < 50000; i++)
cbas.writeLine(g); // already appends \r\n
cbas.flush();
Vm.debug("size: " + cbas.getCompressedSize() + " -> " + cbas.getSize());
totalcross.lang.String s;
for (i = 0; (s = cbas.readLine()) != null; i++)
if (!g.equals(s))
Vm.debug("error in " + i);
if (i != 50000)
Vm.debug("i differs!");
cbas.close();
Note that, although the sample uses writeLine and readLine, you can store any
kind of data, by attaching a DataStream as
CompressedByteArrayStream cbas = new CompressedByteArrayStream(5);
DataStream ds = new DataStream(cbas);
byte[] big = new byte[200000];
// fill big with something
ds.writeBytes(big);
for (int i = 0; i < 100000; i++)
{
ds.writeInt(0x123456);
ds.writeString("Michelle");
ds.writeDouble(123.456d);
}
// well, now we do something with these!
int realSize = cbas.getSize(); // just for fun
int compressed = cbas.getCompressedSize(); // just for fun
ds.readBytes(big);
for (int i = 0; i < 100000; i++)
{
int i = ds.readInt();
totalcross.lang.String love = ds.writeString(); // Michelle
double d = ds.writeDouble();
}
Call the close method only when you're completely done in using it: all the
internal buffers will be released, and reading from it will crash your
program.
Note that the readLine method will not work if there are any character with accentuation.
| Nested Class Summary | |
|---|---|
static class |
CompressedByteArrayStream.DirectCharConverter
Implements a CharacterConverter that from char[] to byte[] which just casts the char to byte; thus, ignoring any non-ASCII character. |
| Field Summary | |
|---|---|
static byte[] |
crlf
Defines the line terminator, which is by default \r\n. |
static int |
DESTRUCTIVE_READ_MODE
used in the setMode method. |
static int |
READ_MODE
Used in the setMode method. |
ZLibException |
rwException
The ZLibException that the readBytes or writeBytes received. |
static int |
WRITE_MODE
Used in the setMode method. |
| Fields inherited from class totalcross.io.Stream |
|---|
skipBuffer |
| Constructor Summary | |
|---|---|
CompressedByteArrayStream()
Creates a new CompressedByteArrayStream using the maximum compression level (9) |
|
CompressedByteArrayStream(int compressionLevel)
Creates a new CompressedByteArrayStream, using the given compression level (0 = no compression, 9 = max compression). |
|
| Method Summary | |
|---|---|
void |
close()
Deletes all internal buffers. |
void |
flush()
After everything was written, call this method to flush the internal buffers and prepare the CompressedByteArrayStream for read. |
int |
getCompressedSize()
Returns the compressed size of the data written. |
int |
getSize()
Returns the real (uncompressed) size of data written. |
int |
readBytes(byte[] buffer,
int start,
int count)
Transfers count bytes from the internal buffer to the given one. |
void |
readFully(Stream inputStream,
int retryCount,
int bufSize)
Reads all data from the input stream into our buffer. |
String |
readLine()
Reads a totalcross.lang.String until the next control character (newline, enter, tab, etc) is read. |
String |
readUntilNextChar(char c)
Reads the buffer until the given character is found. |
void |
setMode(int newMode)
Changes the mode to the given one, calling flush if in write mode. |
int |
writeBytes(byte[] buffer,
int start,
int count)
This method writes to the byte array, expanding it if necessary. |
void |
writeLine(String s)
Writes a line of text. |
| Methods inherited from class totalcross.io.Stream |
|---|
skipBytes, writeBytes, writeBytes |
| Methods inherited from class totalcross.lang.Object |
|---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| Field Detail |
|---|
public ZLibException rwException
public static final int READ_MODE
public static final int WRITE_MODE
public static final int DESTRUCTIVE_READ_MODE
public static byte[] crlf
CompressedByteArrayStream.crlf = new byte[]{'\n'};
| Constructor Detail |
|---|
public CompressedByteArrayStream(int compressionLevel)
public CompressedByteArrayStream()
| Method Detail |
|---|
public void flush()
throws ZLibException
ZLibExceptionsetMode(int)
public void setMode(int newMode)
throws ZLibException
flush if in write mode.
newMode - the new mode
ZLibExceptionWRITE_MODE,
READ_MODE,
DESTRUCTIVE_READ_MODEpublic void close()
public int getSize()
public int getCompressedSize()
public int readBytes(byte[] buffer,
int start,
int count)
readBytes in class Streambuffer - the byte array to read data intostart - the start position in the arraycount - the number of bytes to read
public int writeBytes(byte[] buffer,
int start,
int count)
writeBytes in class Streambuffer - the byte array to write data fromstart - the start position in the byte arraycount - the number of bytes to write
public String readLine()
throws ZLibException
ZLibException
public void readFully(Stream inputStream,
int retryCount,
int bufSize)
throws IOException,
ZLibException
inputStream - The input stream from where data will be readretryCount - The number of times to retry if no data is read. In remote connections,
use at least 5; for files, it can be 0.bufSize - The size of buffer used to read data.
IOException
ZLibExceptionpublic void writeLine(String s)
CompressedByteArrayStream.crlf = new byte[0];
s - the totalcross.lang.String to be written; cannot be null!
public String readUntilNextChar(char c)
throws ZLibException
ZLibException
|
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | ||||||||