与节点流类不同,包装类不直接操作目标设备,而是间接调用节点流类,接受一个对应具体溜对象提供各种往输出流对象中写入各种类型数据的方法。
1. DataOutputStream和DataInputStream类,允许以某种方式写入和读取包装类。
2. BufferedInputStream和bufferedOutputStream类:缓冲区包装类
缓冲流为IO增加内存缓冲区,可以一次操作多个字节,这两个类会在字节的实力对象中创建缓冲区。相应的字符流包装类为BufferedReader和BufferedWriter。
习题:分别使用DataOutputStream的writeUTF,writeBytes,writeChars方法,并包装BufferedOutputStream类一起用,多个流对象形成链称为流栈。
import java.io.*;
//习题分别使用DataOutputStream的writeUTF, writeBytes, writeChars方法,使用流栈,多个流对象形成的链成为流栈,包装类包装了另一个包装类
public class TestDataStream {
public static void main(String [] args) throws Exception
{
FileOutputStream fos = new FileOutputStream("TestDataStream.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
DataOutputStream dos = new DataOutputStream(bos);
dos.writeUTF("中国ab");
dos.writeBytes("中国ab");
dos.writeChars("中国ab");
dos.close();
FileInputStream fis = new FileInputStream("TestDataStream.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
DataInputStream dis = new DataInputStream(bis);
System.out.println(dis.readUTF());
byte[] b = new byte[1024];
int len = dis.read(b);
System.out.println(new String(b, 0, len));
dis.close();
}
}
3. printSteam类为输出流添加打印各种数据的功能
System.out就是这个类型的
4. ObjectInputStream和ObjectOutputStream类:用于读取和写入对象类型的数据
其中被读取的对象类必须实现Serializable,编程可序列化的对象,且对象中的transient和static成员变量不会被读取和写入。
习题:创建一个可序列化的类,并写入文件并读取。
import java.io.*;
public class TestObjectInputStream {
public static void main(String [] args) throws Exception
{
Student stu1 = new Student("zhangsan", 24, "自动化");
Student stu2 = new Student("lisi", 25, "计算机");
FileOutputStream fos = new FileOutputStream("TestObjectInputStream.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(stu1);
oos.writeObject(stu2);
oos.close();
FileInputStream fis = new FileInputStream("TestObjectInputStream.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
stu1 = (Student)ois.readObject();
stu2 = (Student)ois.readObject();
System.out.println(stu1.name+":"+stu1.age+"major in"+stu1.major);
System.out.println(stu2.name+":"+stu2.age+"major in"+stu2.major);
ois.close();
}
}
class Student implements Serializable
{
String name ;
int age;
String major;
Student(String name, int age, String major)
{
this.name = name;
this.age = age;
this.major = major;
}
}
5.InputStreamReader和OutputStreamWriter类
前者是将字节流中的字节解码成字符后读取
后者是将字符编码成字节后写入字节流
实现字符流和字节流的转换
为避免频繁的转换,通常使用bufferedWriter和BufferedReader包装起来使用
另外之前所述的所有对应的字符流类都是包装类,道理一样。