一、流的几种不同分类方法
(1)按方向分:输入流,输出流(2)按处理数据类型分:字节流(最基础,最根本),字符流
(3)按功能分:节点流,处理流
二、几种不同的流详解
1.InputStream与OutputStream(为抽象类,不能实例化对象)
(1)InputStream(从文件到内存的流)
#三种读操作
①abstract int read()②int read(byte[] b)
③int read(byte[] b, int off, int len)
(2)OutputStream(从内存到文件的流)
#三种写操作
①abstract void write (int b);
②void write(byte[ ] b);
③void write(byte[ ] b, int off, int len);
2.FileInputStream与FileOutputStream
(1)FileInputStream(从文件到内存的流)
#构造函数
FileInputStream(File file); //为节点流
(2)FileOutputStream(从内存到文件的流)
#构造函数
FileOutputStream(File file);
3.DataInputStream与DataOutputStream(对数据进行处理)
(1)DataInputStream(到内存的流)
#构造函数
DataInputStream(InputStream in);
#几种读函数
boolean readBoolean();
byte readByte();
char readChar();
double readDouble();
float readFloat();
int readInt();
String readLine();
(2)DataOutputStream(从内存出发的流)
#构造函数
DataOutputStream(OutputStream out);
#几种写函数
void writeBoolean(boolean v);
void writeByte(int v);
void writeBytes(String s);
void writeChar(char v);
void writeChars(String s);
void writeDouble(double v);
void writeFloat(float v);
void writeInt(int v);
一个小例子:
FileInputStream fis = new FileInputStream("a.dat");
DataInputStream dis = new DataInputStream(fis);
int i = dis.readInt();
double d = dis.readDouble();
FileOutputStream fos = new FileOutputStream("b.dat");
DataOutputStream dos = new DataOutputStream(fos);
dos.writeInt(5);
dos.writeDouble(3.14);
dos.flush();
dos.close();
fos.close();
4.ObjectInputStream与ObjectOutputStream(处理流)
(1)ObjectInputStream
#读函数 Object readObject();
(2)ObjectOutputStream
#写函数 void writeObject(Object o);
注:若要将类对象逐个输入到流中,必须实现对象序列化接口,并且其聚合的类也要实现序列化接口(标签接口,只需声明即可implements java.io.Serializable)
5.ByteArrayInputStream与ByteArrayOutputStream(节点流)(1)ByteArrayInputStream
字节数组输入流在内存中创建一个字节数组缓冲区,从输入流读取的数据保存在该字节数组缓冲区中。
#构造函数
ByteArrayInputStream(byte[ ] buf);
(2)ByteArrayOutputStream
字节数组输出流在内存中创建一个字节数组缓冲区,所有发送到输出流的数据保存在该字节数组缓冲区中。
#构造函数
ByteArrayOutputStream(int size);
深复制的小例子:
public class Tool {
public static Object deepClone(Object o) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(o);
oos.flush();
byte[] buffer = baos.toByteArray();
ByteArrayInputStream bais = new ByteArrayInputStream(buffer);
ObjectInputStream ois = new ObjectInputStream(bais);
return ois.readObject();
}
}