输出流和输入流的包装类:
DataInputStream : 通过传入一个InputStream对象实例来实现对该输入流的包装,提供了一些直接在文件中读取java基本类型数据的方法,比如readDouble() ,readInt()等等方法,需要注意的是readUTF()方法读取的数据都是通过DataOutputStream中writeUTF()方法对应写入的数据,否则将会出现问题。(因为writeUTF方法将会在写入的数据之中加入一些额外的信息——写入数据的长度)
DataOutputStream : 通过传入一个OutputStream对象实例来实现对该输出流的包装,提供了一些直接在文件中写入java基本类型数据的方法,比如writeDouble() ,writeShort()等等方法,需要注意的是writeBytes()方法和writeChars()方法在DataInputStream 当中没有相对应的读取方法,这两个方法都是写入一串字符串,只不过一个是按照字节顺序,一个是按照字符顺序。为什么在对应的输入流对象当中没有读取一串字符串的方法呢?这是因为在读取的时候程序不知道需读取字符串的大小,也就是不知道何处是字符串的结束位置。所以没有办法读取一个完整的字符串。而readUTF() 能读取字符串是因为在用writeUTF()写入数据(字符串)时就指定了数据的大小,自然而然的就知道结束位置啦。
根据以上几点:就可以很清楚的知道DataInputStream 和DataOutputStream 使用的环境了:
1.操作的是字符流,写入字符数据到文件中。
2.需要一些简单而又直接的方法来对指定文件进行写入或者读取java基本数据类型的操作,而不再是通过直接操作字节数据来完成。
打印流:
printStream 和 printWrite,其中一个是字节打印流,一个是字符打印流。printStream 提供了输出字节流的write方法,而printWrite没有。他们都可以在构造函数中设置是否会自动刷新缓存区,但是printWrite即使是设置了但如果调用的不是printf,format,println其中一个方法,也将不会自动清空缓存区。即使碰到了输出‘\n’等换行符。
另外他们都可以使用字符串格式化功能(printf,format)。这个是他们的一个很好的功能。
对象序列化流:
objectInputStream 和 objectOutputStream两个包装类,用于从底层输入流中读取对象类型的数据和将对象类型的数据写入到底层输出流中。transient 和 static 修饰的变量将不会被写入或者读取。被写入或读取的对象必须实现serializable接口。
package student; import java.io.Serializable; public class Student implements Serializable { int id; String name; int age; String department; Student(int id, String name, int age, String department) { this.id = id; this.age = age; this.name = name; this.department = department; } }
package student; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class SerTest { /** * @param args * @throws IOException * @throws ClassNotFoundException */ public static void main(String[] args) throws IOException, ClassNotFoundException { // TODO Auto-generated method stub Student stu1 = new Student(1,"张三",26,"化雪"); Student stu2 = new Student(2,"李四",26,"数学"); FileOutputStream fos = new FileOutputStream("3.txt"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(stu1); oos.writeObject(stu2); oos.close(); FileInputStream fis = new FileInputStream("3.txt"); ObjectInputStream ois = new ObjectInputStream(fis); stu1 = (Student)ois.readObject(); stu2 = (Student)ois.readObject(); System.out.println(stu1.name); System.out.println(stu1.age); System.out.println(stu1.department); System.out.println(stu1.id); System.out.println(stu2.name); System.out.println(stu2.age); System.out.println(stu2.department); System.out.println(stu2.id); } }