public abstract class OutputStream implements Closeable, Flushable
这个抽象类是表示字节输出流的所有类的超类。 输出流接收输出字节并将其发送到某个接收器。
void close() 关闭此输出流并释放与此流相关联的任何系统资源。
void flush() 刷新此输出流并强制任何缓冲的输出字节被写出。
void write(byte[] b) 将 b.length字节从指定的字节数组写入此输出流。
void write(byte[] b, int off, int len) 从指定的字节数组写入 len个字节,从偏移 off开始输出到此输出流。
abstract void write(int b) 将指定的字节写入此输出流。
write(byte b[], int off, int len)
public void write(byte b[], int off, int len) throws IOException {
... 检查数据
for (int i = 0 ; i < len ; i++)
write(b[off + i]);
}
public abstract void write(int b) throws IOException;
flush() close()
public void flush() throws IOException {
}
public void close() throws IOException {
}
class FileOutputStream extends OutputStream
文件输出流是用于将数据写入到输出流File或一个FileDescriptor
write(int b)
public void write(int b) throws IOException {
write(new byte[] { (byte) b }, 0, 1);
}
write(byte b[], int off, int len)
public void write(byte b[], int off, int len) throws IOException {
if (closed && len > 0) {
throw new IOException("Stream Closed");
}
tracker.trackIo(len);
IoBridge.write(fd, b, off, len); //根据不同系统写入
}
class FilterOutputStream extends OutputStream
这个类是过滤输出流的所有类的超类。 所有方法都是调用实现类out类的方法
protected OutputStream out;
public FilterOutputStream(OutputStream out) {
this.out = out;
}
public void write(int b) throws IOException {
out.write(b);
}
.....
class BufferedOutputStream extends FilterOutputStream
该类实现缓冲输出流
protected byte[] buf 存储数据的内部缓冲区。
protected int count 缓冲区中有效字节的数量。
synchronized void write(int b)
public synchronized void write(int b) throws IOException {
if (count >= buf.length) {
flushBuffer(); //
}
buf[count++] = (byte)b;
}
flushBuffer()
private void flushBuffer() throws IOException {
if (count > 0) {
out.write(buf, 0, count);
count = 0;
}
}
synchronized void write(byte b[], int off, int len)
public synchronized void write(byte b[], int off, int len) throws IOException {
if (len >= buf.length) { // 要写入数据的字节数组的长度大于缓存的字节数组长度
flushBuffer();// 把当前缓存的写入
out.write(b, off, len);//写入缓存的数据
return;
}
if (len > buf.length - count) { // 写出数据长度大于缓存的剩余长度
flushBuffer(); //把当前缓存的写入
}
System.arraycopy(b, off, buf, count, len);//把要写入的拷贝到缓存数组中
count += len;
}
public class ByteArrayOutputStream extends OutputStream
该类实现了将数据写入字节数组的输出流。
protected byte[] buf 存储数据的缓冲区。
protected int count 缓冲区中有效字节的数量。
synchronized void write(int b)
public synchronized void write(int b) {
ensureCapacity(count + 1);
buf[count] = (byte) b;
count += 1;
}
synchronized void write(byte b[], int off, int len)
public synchronized void write(byte b[], int off, int len) {
... 检查数据
ensureCapacity(count + len);
System.arraycopy(b, off, buf, count, len);
count += len;
}
synchronized void writeTo(OutputStream out) 把该流中的数据通过该out写出
public synchronized void writeTo(OutputStream out) throws IOException {
out.write(buf, 0, count); //
}
synchronized byte toByteArray()[]
public synchronized byte toByteArray()[] {
return Arrays.copyOf(buf, count);
}
DataOutputStream
class DataOutputStream extends FilterOutputStream implements DataOutput
数据输出流使应用程序以便携式方式将原始Java数据类型写入输出流
protected int written 到目前为止写入数据输出流的字节数。
void writeBoolean(boolean v) 将 boolean写入底层输出流作为1字节值。
void writeByte(int v) 将 byte作为1字节值写入底层输出流。
void writeBytes(String s) 将字符串作为字节序列写入基础输出流。
void writeChar(int v) 将 char写入底层输出流作为2字节值,高字节优先。
void writeChars(String s) 将字符串写入底层输出流作为一系列字符。
void writeDouble(double v) 双参数传递给转换 long使用 doubleToLongBits方法在类 Double ,然后写入该 long值基础输出流作为8字节的数量,高字节。
void writeFloat(float v) 浮子参数的转换 int使用 floatToIntBits方法在类 Float ,然后写入该 int值基础输出流作为一个4字节的数量,高字节。
void writeInt(int v) 将底层输出流写入 int作为四字节,高位字节。
void writeLong(long v) 将 long写入底层输出流,为8字节,高字节为首。
void writeShort(int v) 将 short写入底层输出流作为两个字节,高字节优先。
void writeUTF(String str) 使用 modified UTF-8编码以机器无关的方式将字符串写入基础输出流。
synchronized void write(int b)
public synchronized void write(int b) throws IOException {
out.write(b);
incCount(1);
}
synchronized void write(byte b[], int off, int len)
public synchronized void write(byte b[], int off, int len)
throws IOException
{
out.write(b, off, len);
incCount(len);
}
final void writeInt(int v)
public final void writeInt(int v) throws IOException {
out.write((v >>> 24) & 0xFF);
out.write((v >>> 16) & 0xFF);
out.write((v >>> 8) & 0xFF);
out.write((v >>> 0) & 0xFF);
incCount(4);
}
void incCount(int value)
private void incCount(int value) {
int temp = written + value;
if (temp < 0) {
temp = Integer.MAX_VALUE;
}
written = temp;
}
final void writeBoolean(boolean v)
public final void writeBoolean(boolean v) throws IOException {
out.write(v ? 1 : 0);
incCount(1);
}