字节流和字符流
字节流的读写以字节为单位,字符流的读写以Unicode字符为单位。
二进制数据一般用字节流来读写。
字节流的继承关系
InputStream类(输入流体系的基类,抽象类)
int read():读一个字节,返回高24位补0得到的整数。如果已经到了流末尾,则返回-1.
int read(byte[] b):读b.length个字节到b中,返回实际读到的字节数。
int read(byte[] b, int off, int len):读len个字节到b中从off开始的位置,返回实际读到的字节数。
以上各read方法在没读够字节且没碰到流末尾时均会阻塞。
int available():返回流中剩余字节数的估计值。
long skip(long n):跳过流中的n个字节,返回实际跳过的字节数。
void mark (int readAheadLimit):在流中当前位置做标记,以便将来可以再从这里开始读。但是往前读或跳超过readAheadLimit个字节的话标记会失效。
void reset():将流中当前位置置为标记位置,下次再读的话就会从标记位置开始读。
但是不是所有输入流都支持mark-reset方法,是否支持可以通过boolean markSupported()方法检验。
void close():关闭流。
OutputStream类(输出流体系的基类,抽象类)
void write(int b):将b的最低字节写到流中。
void write(byte[] b):将b数组写到流中。
void write(byte[] b, int off, int len):将b数组从off位置开始的len个字节写到流中。
void flush():将流缓冲区内的数据写到目的地。
void close():关闭流。
ByteArrayInputStream类(实现类)
以一个字节数组作为数据源。
支持mark-reset方法。
ByteArrayInputStream(byte[] buf):以buf(本体)为数据源构造流。
ByteArrayInputStream(byte[] buf, int off, int len):以buf数组(本体)从off开始的len个位置作为数据源来构造流。
从InputStream类继承来的read方法:因为数据源是一个数组,数组的末端就是流的结尾,所以没什么好阻塞的。
void close():没有任何作用。
ByteArrayOutputStream类(实现类)
将一个容量可以动态增长的匿名字节数组作为数据宿,用toByteArray或toString方法可以获取这个数组的复制品。
ByteArrayOutputStream():构造一个数据宿初始大小为32的流。
ByteArrayOutputStream(int size):构造一个数据宿初始大小为size的流。
void writeTo(OutputStream des):将流中的全部内容写入到des流里。
byte[] toByteArray():得到数据宿的复制品。
String toString():使用平台默认字符集将流中数据解码为字符串。
String toString(String CharsetName):使用指定字符集将流中数据解码为字符串。
void reset():清空流中数据,使得流就像刚创建从未使用过一样。
int size():获得流中的字节数,也就是数据宿中有效字节的数目。
void close():没有任何作用。
FileInputStream类(实现类)
不支持mark-reset方法。
FileInputStream(File file):例如,File f = new File("文件路径"); FileInputStream fis = new FileInputStream(f);
FileInputStream(String pathname):例如,FileInputStream fis = new FileInputStream("文件路径");
从InputStream类继承来的read方法:同样在没读够字节且没碰到文件结束符时均会阻塞。这种情况一般出现在读网络文件时。
FileChannel getChannel():获得对应的FileChannel对象。
FileOutputStream类(实现类)
FileOutputStream(File file)和FileOutputStream(String pathname):构造一个以文件为数据宿的流。
FileOutputStream(File file, boolean append)和FileOutputStream(String pathname, boolean append):构造一个以文件为数据宿的流,可选择追加写或覆盖写。
FileChannel getChannel():获得对应的FileChannel对象。
BufferedInputStream类(实现类,装饰流)
将InputStream用匿名缓冲区装饰而得到的流。从流中读数据时是先从匿名缓冲区读,缓冲区内数据不足时才从被装饰流提取数据到缓冲区。因此用BufferedInputStream装饰FileInputStream流可以减少IO次数,提高读的效率。
支持非阻塞读和mark-reset方法。
BufferedInputStream(InputStream in):以大小为2048的匿名缓冲区装饰in流。
BufferedInputStream(InputStream in, int size):以大小为size的匿名缓冲区装饰in流。
int read():直接继承InputStream的int read(),当然是阻塞读。
int read(byte[] b, int off, int len):功能不变,但是是非阻塞读,不阻塞地能读多少读多少,然后返回。
BufferedOutputStream类(实现类,装饰流)
将OutputStream用匿名缓冲区装饰而得到的流。向流中写数据时是先往匿名缓冲区写,缓冲区已满时才会将缓冲区内数据写进被装饰流。因此用BufferedOutputStream装饰FileOutputStream流可以减少IO次数,提高写的效率。
BufferedOutputStream(OutputStream out):以大小为512的匿名缓冲区装饰out流。
BufferedOutputStream(OutputStream out, int size):以大小为size的匿名缓冲区装饰out流。
DataInputStream类(实现类,装饰流)
不支持mark-reset函数。
DataInputStream(InputStream in):装饰in流,使得我们可以从中读取基本类型数据。
void readFully(byte[] b):阻塞读数据,一定要填满b.如果还没读够流就结束了,则会抛出EOFException.
void readFully(byte[] b, int off, int len):阻塞读数据,一定要读出len个,放在从b中从off开始的位置。如果还没读够流就结束了,则会抛出EOFException.
boolean readBoolean():读一个字节,如果非0则返回true,否则返回false.
byte readByte():读一个字节,将其解释为8位有符号数。
int readUnsignedByte():读一个字节,将其解释为8位无符号数。
short readShort():读两个字节,将其解释为16位有符号数。
int readUnsignedshort():读两个字节,将其解释为16为无符号数。
char readChar():读两个字节,将其解释为一个Unicode字符。
int readInt():读四个字节,将其解释为一个int.
long readLong():读八个字节,将其解释为一个long.
float readFloat():读四个字节,将其先解释为一个int,再转换成float型。
double readDouble():读八个字节,将其先解释为一个long,再转换成double型。
String readUTF():读出一个以“UTF修改版”编码的Unicode字符串。
int skipBytes(int n):和skip函数同样功能。
DataOutputStream类(实现类,装饰流)
DataOutputStream(OutputStream out):装饰out流,使得我们可以向其写入基本类型数据。
void writeBoolean(boolean v):将v以1字节形式写入流,true写作1,false写作0.
void writeByte(int v):将v的最低字节写入流,先写高字节。
void writeShort(int v):将v的低两字节写入流,先写高字节。
void writeChar(int v):将v的低两字节写入流,先写高字节。
void writeInt(int v):将v的四个字节写入流,先写高字节。
void writeLong(int v):将v的八个字节写入流,先写高字节。
void writeFloat(float v):先将v转换成int型,再把int的四个字节写入流,先写高字节。
void writeDouble(double v):先将v转换成long型,再把long的八个字节写入流,先写高字节。
void writeBytes(String s):依次将s的各个字符的低字节写入流。
void writeChars(String s):依次将s的各个字符的两个字节写入流。
void writeUTF(String s):将s以“UTF修正版”编码后写入流。
ObjectInputStream类(实现类,装饰流)
ObjectInputStream(InputStream in):装饰in流,使得我们可以从中读取对象。
Object readObject():读取一个对象。
除此之外,还有上面在DataInputStream类中提到的所有函数:readFully,readBollean~readUTF,skipBytes.
ObjectOutputStream类(实现类,装饰流)
ObjectOutputStream(OutputStream out):装饰out流,使得我们可以向其写入对象。
void writeObject(Object obj):将obj写入流。要求obj所属的类必须继承了Serializable接口。另外,对象中的静态变量不会被写入。
除此之外,还有上面在DataOutputStream类中提到的所有函数:writeBollean~writeUTF.
PrintStream类(实现类,装饰流)
可以将任何类型的数据先转化为符合人类书写方式的字符串然后送给数据宿的流。既可以通过装饰其它流得到,也可以选取一个文件为数据宿而直接创建。
PrintStream(OutputStream out, boolean autoFlush, String encoding):装饰out流,使得它可以将任何类型的数据先转化为符合人类书写方式的字符串然后再写入数据宿。autoflush决定写完之后是否自动flush,encoding是转化出来的字符串写入数据宿时的编码方式。
PrintStream(OutputStream out),PrintStream(OutputStream out, boolean autoFlush):autoFlush缺位时不会自动flush,encoding缺位时采用默认字符集写字符串。
PrintStream(File file),PrintStream(String fileName):以文件为数据宿直接创建流,写字符串时采用默认字符集,写入后不会自动flush.
PrintStream(File file, String charsetName),PrintStream(String fileName, String charsetName):以文件为数据宿直接创建流,写字符串时采用charsetName字符集,写入后不会自动flush.
void print(boolean b),void print(char c),void print(int i),void print(long l),void print(float f),void print(double d),void print(char[] s),void print(String s),void print(Object obj):把参数用它所属类型的.toString(...)静态方法转换为符合人类书写习惯的字符串,然后写给数据宿。(Object类型有toString函数,不用在子类中自己写)
void println(boolean b),void println(char c)...:写完数据之后还会再写入一个该平台的换行符。
void println():只写入一个该平台的换行符。
PrintStream printf/format(String format, Object... args):实现C风格的格式化写流,返回流本身。
PrintStream append(char c),PrintStream append(CharSequence csq),PrintStream append(CharSequence scq, int start, int end):write是覆盖写,append是追加写,返回流本身。注意三参数append函数中,写入的字符序列是scq[start,end)左闭右开。
标准输出流System.out就是一种PrintStream.
PipedInputStream类(实现类)
和PipedOutputStream配合实现线程间通信。两者连在一起构成管道,一个线程往PipedOutputStream里放数据,另一个线程从PipedInputStream里取。
PipedInputStream():构造一个未连接的读管道流,管道缓冲区大小为1024.
PipedInputStream(int pipeSize):构造一个未连接的读管道流,管道缓冲区大小为pipeSize.
PipedInputStream(PipedOutputStream src):构造一个连接到src的读管道流,管道缓冲区大小为1024.
PipedInputStream(PipedOutputStream src, int pipeSize):构造一个连接到src的读管道流,管道缓冲区大小为pipeSize.
void connect(PipedOutputStream src):连接到src。两个流只要有一方发起连接就可以了。
PipedOutputStream类(实现类)
PipedOutputStream():构造一个未连接的写管道流。
PipedOutputStream(PipedInputStream dst):构造一个连接到dst的写管道流。
void connect(PipedInputStream dst):连接到dst。两个流只要有一方发起连接就可以了。