FileDocCategorySizeDatePackage
Base64OutputStream.javaAPI DocAndroid 1.5 API6732Wed May 06 22:42:46 BST 2009com.android.email.codec.binary

Base64OutputStream

public class Base64OutputStream extends FilterOutputStream
Provides Base64 encoding and decoding in a streaming fashion (unlimited size). When encoding the default lineLength is 76 characters and the default lineEnding is CRLF, but these can be overridden by using the appropriate constructor.

The default behaviour of the Base64OutputStream is to ENCODE, whereas the default behaviour of the Base64InputStream is to DECODE. But this behaviour can be overridden by using a different constructor.

This class implements section 6.8. Base64 Content-Transfer-Encoding from RFC 2045 Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies by Freed and Borenstein.

author
Apache Software Foundation
version
$Id $
see
RFC 2045
since
1.0-dev

Fields Summary
private final boolean
doEncode
private final Base64
base64
private final byte[]
singleByte
Constructors Summary
public Base64OutputStream(OutputStream out)
Creates a Base64OutputStream such that all data written is Base64-encoded to the original provided OutputStream.

param
out OutputStream to wrap.


                             
       
        this(out, true);
    
public Base64OutputStream(OutputStream out, boolean doEncode)
Creates a Base64OutputStream such that all data written is either Base64-encoded or Base64-decoded to the original provided OutputStream.

param
out OutputStream to wrap.
param
doEncode true if we should encode all data written to us, false if we should decode.

        super(out);
        this.doEncode = doEncode;
        this.base64 = new Base64();
    
public Base64OutputStream(OutputStream out, boolean doEncode, int lineLength, byte[] lineSeparator)
Creates a Base64OutputStream such that all data written is either Base64-encoded or Base64-decoded to the original provided OutputStream.

param
out OutputStream to wrap.
param
doEncode true if we should encode all data written to us, false if we should decode.
param
lineLength If doEncode is true, each line of encoded data will contain lineLength characters. If lineLength <=0, the encoded data is not divided into lines. If doEncode is false, lineLength is ignored.
param
lineSeparator If doEncode is true, each line of encoded data will be terminated with this byte sequence (e.g. \r\n). If lineLength <= 0, the lineSeparator is not used. If doEncode is false lineSeparator is ignored.

        super(out);
        this.doEncode = doEncode;
        this.base64 = new Base64(lineLength, lineSeparator);
    
Methods Summary
public voidclose()
Closes this output stream, flushing any remaining bytes that must be encoded. The underlying stream is flushed but not closed.

        // Notify encoder of EOF (-1).
        if (doEncode) {
            base64.encode(singleByte, 0, -1);
        } else {
            base64.decode(singleByte, 0, -1);
        }
        flush();
    
private voidflush(boolean propogate)
Flushes this output stream and forces any buffered output bytes to be written out to the stream. If propogate is true, the wrapped stream will also be flushed.

param
propogate boolean flag to indicate whether the wrapped OutputStream should also be flushed.
throws
IOException if an I/O error occurs.

        int avail = base64.avail();
        if (avail > 0) {
            byte[] buf = new byte[avail];
            int c = base64.readResults(buf, 0, avail);
            if (c > 0) {
                out.write(buf, 0, c);
            }
        }
        if (propogate) {
            out.flush();
        }
    
public voidflush()
Flushes this output stream and forces any buffered output bytes to be written out to the stream.

throws
IOException if an I/O error occurs.

        flush(true);
    
public voidwrite(int i)
Writes the specified byte to this output stream.

        singleByte[0] = (byte) i;
        write(singleByte, 0, 1);
    
public voidwrite(byte[] b, int offset, int len)
Writes len bytes from the specified b array starting at offset to this output stream.

param
b source byte array
param
offset where to start reading the bytes
param
len maximum number of bytes to write
throws
IOException if an I/O error occurs.
throws
NullPointerException if the byte array parameter is null
throws
IndexOutOfBoundsException if offset, len or buffer size are invalid

        if (b == null) {
            throw new NullPointerException();
        } else if (offset < 0 || len < 0 || offset + len < 0) {
            throw new IndexOutOfBoundsException();
        } else if (offset > b.length || offset + len > b.length) {
            throw new IndexOutOfBoundsException();
        } else if (len > 0) {
            if (doEncode) {
                base64.encode(b, offset, len);
            } else {
                base64.decode(b, offset, len);
            }
            flush(false);
        }