java中的流是实现输入/输出的基础。Java中吧所有的输入/输出源都抽象地表述为“流”(stream),通过流的方式允许java程序使用相同的方式访问不同的输入/输出源。stream是从源(source)到池(sink)的有序数据。
流的分类:
输入流:只能从中读入数据,不能向其中写入数据。
输出流:只能向其中写入数据,不能从中读入数据。
(输入/输出都是相对于java程序(程序运行所在内存)而言)
字节流:操作流的单位是8位的字节,以InputStream、OutputStream作为基类。
字符流:操作流的单为是16位的字符,以Reader、Writer作为基类。
节点流:直接连接到实际的输入/输出数据源。
处理流(包装流):不直接连接到实际的输入/输出源,而是对一个已经存在的流进行连接或封装。
四大基流(他们都是抽象类):
InputStrem、OutputSteam:所有输入流的基流。
Reader、writer:所有输出流的基流。
InputStrem、Reader
InputStrem方法:
int read();读入一个字节,返回所读取的字节(转换为int)
int read(byte[] b);从输入流中读取最多b.length个字节,返回实际读取的字节数
int read(byte[] b,int off,int len);从输入流中最多读取len个字节,储存时从off处开始,返回实际读取的字节数
Reader方法:同字节流InputStream相似,只是把读取单位换成了字符。
int read();
int read(char[] b);
int read(char[] b,int off,int len);
他们对应的子类:FileInputStream,FileReader,他们都是节点流
操作记录指针:
void mark(int readAheadLimit);//在当前记录指针出记录一个标记mark
boolean markSupported();//判断此流是否支持mark操作
void reset();//将此流的指针重新定位到上一次记录mark标记的位置
long skip(long n);//跳过n个字节/字符
OutputStream与Writer
void write(int c);//将指定字节/字符输出到输出流,其中c既可以代表字节也可以代表字符
void write(byte[]/char[] b);//将指定字节/字符数组输出到输出流中
void write(byte[]/char[] b,int off,int len);//把指定字节/字符数组中从off开始的长为len的部分住处到输出流中。
因为Writer操作的是字符,所以其中还有以下两个方法:
void write(String str);//将指定字符串输出到输出流中
void write(String str,int off,int len);//将指定字符串中从off开始,长len的字符串输出到输出流中。