📄 base64.java
字号:
} // end constructor
/**
* Constructs a {@link Base64#InputStream} in
* either ENCODE or DECODE mode.
*
* @param in the {@link java.io.InputStream} from which to read data.
* @param encode Conversion direction
* @see Base64#ENCODE
* @see Base64#DECODE
* @since 1.3
*/
public InputStream(java.io.InputStream in, boolean encode)
{
super(in);
this.encode = encode;
this.bufferLength = encode ? 4 : 3;
this.buffer = new byte[bufferLength];
this.position = -1;
} // end constructor
/**
* Reads enough of the input stream to convert
* to/from Base64 and returns the next byte.
*
* @return next byte
* @since 1.3
*/
public int read() throws java.io.IOException
{
// Do we need to get data?
if (position < 0)
{
if (encode)
{
byte[] b3 = new byte[3];
numSigBytes = 0;
for (int i = 0; i < 3; i++)
{
try
{
int b = in.read();
// If end of stream, b is -1.
if (b >= 0)
{
b3[i] = (byte)b;
numSigBytes++;
} // end if: not end of stream
} // end try: read
catch (java.io.IOException e)
{
// Only a problem if we got no data at all.
if (i == 0)
throw e;
} // end catch
} // end for: each needed input byte
if (numSigBytes > 0)
{
encode3to4(b3, 0, numSigBytes, buffer, 0);
position = 0;
} // end if: got data
} // end if: encoding
// Else decoding
else
{
byte[] b4 = new byte[4];
int i = 0;
for (i = 0; i < 4; i++)
{
int b = 0;
do
{
b = in.read();
}
while (b >= 0 && DECODABET[b & 0x7f] < WHITE_SPACE_ENC);
if (b < 0)
break; // Reads a -1 if end of stream
b4[i] = (byte)b;
} // end for: each needed input byte
if (i == 4)
{
numSigBytes = decode4to3(b4, 0, buffer, 0);
position = 0;
} // end if: got four characters
} // end else: decode
} // end else: get data
// Got data?
if (position >= 0)
{
// End of relevant data?
if (position >= numSigBytes)
return -1;
int b = buffer[position++];
if (position >= bufferLength)
position = -1;
return b;
} // end if: position >= 0
// Else error
else
return -1;
} // end read
/**
* Calls {@link #read} repeatedly until the end of stream
* is reached or <var>len</var> bytes are read.
* Returns number of bytes read into array or -1 if
* end of stream is encountered.
*
* @param dest array to hold values
* @param off offset for array
* @param len max number of bytes to read into array
* @return bytes read into array or -1 if end of stream is encountered.
* @since 1.3
*/
public int read(byte[] dest, int off, int len) throws java.io.IOException
{
int i;
int b;
for (i = 0; i < len; i++)
{
b = read();
if (b < 0)
return -1;
dest[off + i] = (byte)b;
} // end for: each byte read
return i;
} // end read
} // end inner class InputStream
/* ******** I N N E R C L A S S O U T P U T S T R E A M ******** */
/**
* A {@link Base64#OutputStream} will write data to another
* {@link java.io.OutputStream}, given in the constructor,
* and encode/decode to/from Base64 notation on the fly.
*
* @see Base64
* @see java.io.FilterOutputStream
* @since 1.3
*/
public static class OutputStream extends java.io.FilterOutputStream
{
private boolean encode;
private int position;
private byte[] buffer;
private int bufferLength;
private int lineLength;
/**
* Constructs a {@link Base64#OutputStream} in ENCODE mode.
*
* @param out the {@link java.io.OutputStream} to which data will be written.
* @since 1.3
*/
public OutputStream(java.io.OutputStream out)
{
this(out, Base64.ENCODE);
} // end constructor
/**
* Constructs a {@link Base64#OutputStream} in
* either ENCODE or DECODE mode.
*
* @param out the {@link java.io.OutputStream} to which data will be written.
* @param encode Conversion direction
* @see Base64#ENCODE
* @see Base64#DECODE
* @since 1.3
*/
public OutputStream(java.io.OutputStream out, boolean encode)
{
super(out);
this.encode = encode;
this.bufferLength = encode ? 3 : 4;
this.buffer = new byte[bufferLength];
this.position = 0;
this.lineLength = 0;
} // end constructor
/**
* Writes the byte to the output stream after
* converting to/from Base64 notation.
* When encoding, bytes are buffered three
* at a time before the output stream actually
* gets a write() call.
* When decoding, bytes are buffered four
* at a time.
*
* @param theByte the byte to write
* @since 1.3
*/
public void write(int theByte) throws java.io.IOException
{
buffer[position++] = (byte)theByte;
if (position >= bufferLength)
{
if (encode)
{
out.write(Base64.encode3to4(buffer, bufferLength));
lineLength += 4;
if (lineLength >= MAX_LINE_LENGTH)
{
out.write(NEW_LINE);
lineLength = 0;
} // end if: end o fline
} // end if: encoding
else
out.write(Base64.decode4to3(buffer));
position = 0;
} // end if: convert and flush
} // end write
/**
* Calls {@link #write} repeatedly until <var>len</var>
* bytes are written.
*
* @param theBytes array from which to read bytes
* @param off offset for array
* @param len max number of bytes to read into array
* @since 1.3
*/
public void write(byte[] theBytes, int off, int len) throws java.io.IOException
{
for (int i = 0; i < len; i++)
{
write(theBytes[off + i]);
} // end for: each byte written
} // end write
/**
* Appropriately pads Base64 notation when encoding
* or throws an exception if Base64 input is not
* properly padded when decoding.
*
* @since 1.3
*/
public void flush() throws java.io.IOException
{
if (position > 0)
{
if (encode)
{
out.write(Base64.encode3to4(buffer, position));
} // end if: encoding
else
{
throw new java.io.IOException("Base64 input not properly padded.");
} // end else: decoding
} // end if: buffer partially full
super.flush();
out.flush();
} // end flush
/**
* Flushes and closes stream.
*
* @since 1.3
*/
public void close() throws java.io.IOException
{
this.flush();
super.close();
out.close();
buffer = null;
out = null;
} // end close
} // end inner class OutputStream
} // end class Base64
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -