一、流(Stream)
1、流(Stream)的定义
流是个抽象的概念,是对输入输出设备的抽象,Java程序中,对于数据的输入/输出操作都是以“流”的方式进行。设备可以是文件,网络,内存等。
流具有方向性,至于是输入流还是输出流则是一个相对的概念,一般以程序为参考,如果数据的流向是程序至设备,我们成为输出流,反之我们称为输入流。 可以将流想象成一个“水流管道”,水流就在这管道中形成了,自然就出现了方向的概念。
2、流的特点
1) 方向性
2) 连续性
3) 单位性
3、IO流的分类
- 从方向性分:输入流(
Input Stream
)和输出流(Output Stream
) - 从单位性分:字节流(8为二进制(
bit
))和字符流 - 从功能分(从是否有数据源):节点流和处理流
4、在Java中,所有的流均来自于java.io
包四个抽象类
1)抽象的字节输入流类:InputStream
2)抽象的字节输出流类:OutputStream
3)抽象的字符输入流类:Reader
4)抽象的字符输出流类:Writer
二、四个基本抽象类
使用步骤:
1)声明对象
2)创建对象
3)使用(输入输出)
4)刷新(flush()
输出的时候)
5)关闭
1、抽象的字节输入流类(InputStream)及其文件操作实现类(FileInputStream)
1)以字节方式来读取数据
2)提供的常用方法:
int read();//用来读取一个字节,反馈这个字节对应的整数[0, 255]。当返回-1是,表示读取结束
void close();//关闭字节输入流,释放所占资源,确保数据安全
2、抽象的字节输出流类(OutputStream)及其文件操作实现类(FileOutputStream)
1) 将给定的数据以字节方式输出到文件中;
2) 它提供的常用方法:
void write( int x );// 将给定的整数以字节方式输出。因此,当给定的整数超出了[ 0, 255 ]时,则会失真。
void flush();// 将缓冲区中的数据一次性输出到目的地。确保数据输出成功。
void close();// 关闭字节输出流,释放所占资源,确保数据安全。
注意:必须使用flush()
方法。
Windows文件中输出换行使用/r/n
,即回车换行。(回车指:将光标回到该行的首部。换行指:将光标移到下一行。)
3、字符输入流类(Reader)及其文件操作实现类(FileReader)
1)它以字符的方式来读取数据。
2)他提供的方法:
int read();// 它以字符方式来读取数据,并反馈这个数据的int型值。因此,其范围是[ 0, 65535 ];当反馈一个-1时,则结束。
void close();// 关闭字符输入流。
4、字符输出流类(Writer)及其文件操作实现类(FileWriter)
1) 将给定的数据以字符方式输出。
2) 它提供的常用方法:
void write( int x );// 将给定的整数以字符方式输出,数据在[ 0, 65535 ]范围中。
void flush();// 将缓冲区中的数据一次性输出,确保输出成功。
void close();// 关闭输出流,释放所在占资源,确保安全。
5、字节流和字符流的区别:
1) 字节流可以处理任意类型的文件。
2) 字符流只能用来处理文本文件。
三、四个缓冲流类(属于处理流)
作用:用来提高输入和输出的效率
注意:使用时需要套接在节点流上
1、字节缓冲流
BufferedInputStream
字节缓冲输入流BufferedOutputStream
字节缓冲输出流
应用在FileInputStream
和FileOutputStream
的基础上
FileInputStream fis = new FileInputStream( path_r );
FileOutputStream fos = new FileOutputStream( path_w );
BufferedInputStream bis = new BufferedInputStream( fis ); //将节点流处理成缓冲流
BufferedOutputStream bos = new BufferedOutputStream( fos );
2、字符缓冲流
BufferedReader
字符缓冲输入流BufferedWriter
字符缓冲输出流
应用在FIleReader
和FileWriter
的基础上
FileReader fr = new FileReader( path_r );
FileWriter fw = new FileWriter( path_w );
BufferedReader br = new BufferedReader( fr ); //将节点流处理成缓冲流
BufferedWriter bw = new BufferedWriter( fw );
四、数据流(属于处理流)
目的:保证数据类型不变
注意:使用时需要套接在节点流上,存储和读取时顺序必须一致(因为数据流按照队列存储)。
1、DataInputStream数据的字节输入流类
用来读取八种基本类型的数据及字符串。
byte readByte();// byte
short readShort();// short
int readInt();// int
long readLong();// long
char readChar();// char
float readFloat();// float
double readDouble();// double
boolean readBoolean();// boolean
String readUTF();// string
2、DataOutputStrean数据的字节输出流类
用来输出八种基本类型的数据及字符串
void writeByte(byte);// byte
void writeShort(short);// short
void writeInt(int);// int
void writeLong(long);// long
void writeChar(char);// char
void writeFloat(float);// float
void writeDouble(double);// double
void writeBoolean(boolean);// boolean
void wirteUTF(String);// string
五、对象流(属于处理流)
作用:保证对象的性质不变
注意:
使用时需要套接在节点流上,要存储的对象必须实现
java.io.Serializable
接口transient
修饰属性或方法,表示该属性或方法不可以序列化
1、ObjectInputStream对象的字节输入流类
读取对象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path));
2、ObjectOutputStream对象的字节输出流类
输出对象
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(path));
六、转换流(属于处理流)
在使用FileInputStream
时,读取数据乱码,给的数据和要的数据在单位上不一致,则需要转换流处理。
1、InputStreamReader(字节转换成字符的输入流类)
功能:
1)字节转换成字符,以字符的方式读取数据
2)在创建转换流对象时,可以指定字符编码方案,实现数据的管理
InputStreamReader isr = new InputStreamReader(new FileInputStream(path), "utf-8");
2、OutputStreamWriter(字符转换成字节的输出流类)
功能:
1)字符转换成字节,以字节方式将给定数据输出
2)在创建转换流对象时,可以指定字符编码方案,实现数据的管理
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(path), "utf-8");
十、打印流(输入输出流)
特点:
均属于输出流,模拟打印机的特点来输出信息
具有字符转化成字节的自动转换功能
打印流输出后,会自动调用flush()
方法。
他提供的常用方法print();
和println();
。
打印流属于节点流(不直接连接数据源,不需要套接到数据流上)。
了解:
System类的静态字段:
out
默认是屏幕,可以通过System.setOut(PrintStream);
,修改in
默认是键盘err
错误信息,默认也是屏幕
1、字节打印流(PrintStream)
System.out.println();//这个方法属于字节打印流