·ObjectInputStream和ObjectOutputStream这两个包装类,用于从底层输入流中读取对象类型的数据和对象类型的数据写入到底层输出流。将对象中所有成员变量的取值保存起来就等于保存了对象,将对象中所有成员变量的取值还原就相等于读取了对象。
·ObjectInputStream和ObjectOutputStream类所读写的对象必须实现了Serializable接口。对象中的transient(一种标记,表示变量是临时的)和static类型的成员变量不会被读取和写入。这两个类可以用于网络流中传送对象。
( transient:Java语言的关键字,变量修饰符,如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。
Java的serialization提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,我们不想用 serialization机制来保存它。为了在一个特定对象的一个域上关闭serialization,可以在这个域前加上关键字transient。当一个对象被串行化的时候,transient型变量的值不包括在串行化的表示中,然而非transient型的变量是被包括进去的。)
·一个可以被序列化的MyClass类的定义:
public class MyClass implements Serializable{
public transient Thread t; //t不会被序列化
private String customerID;
private int total;
}
·编程举例:创建一个可序列化的学生对象,并用ObjectOutputStream类把它存储到一个文件(mytext.txt)中,然后再用ObjectInputStream类把存储的数据读取到一个学生对象中,即恢复保存的学生对象。
[java] view
plain copy
- import java.io.*;
- class Student implements Serializable //必须实现Serializable接口才能序列化
- {
- int age;
- String name;
- Student(int age, String name){
- this.age = age;
- this.name = name;
- }
- }
- public class Iotest {
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- Student stu1 = new Student(20,"zhangsan");
- Student stu2 = new Student(22,"lisi");
- try {
- FileOutputStream fos = new FileOutputStream("a.txt");
- ObjectOutputStream oos = new ObjectOutputStream(fos);
- oos.writeObject(stu1);
- oos.writeObject(stu2);
- oos.close();
- FileInputStream fis = new FileInputStream("a.txt");
- ObjectInputStream ois = new ObjectInputStream(fis);
- Student stu3 = (Student) ois.readObject();
- System.out.println("age: "+stu3.age);
- System.out.println("name: "+stu3.name);
- } catch (FileNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (ClassNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
·字节流与字符流的转换
·IO包中的流分为字节流和字符流,应用中经常需要互相转换。
·思考:能不能找到一种简单的方式来读取键盘上输入的一行字符?如何找?
A:查找readLine方法,再通过JDK中的see also寻找接收参数为System.in类型的类。
·InputStreamReader和OutputStreamWriter是用于将字节流转换成字符流来读写的两个类,InputStreamReader可以将一个字节流中的字节解码成字符后读取,OutputStreamWriter将字符编码成字节后写入到一个字节流中。
·避免频繁地在字符与字节间进行转换,最好不要直接使用InputStreamReader和OutputStreamWriter类来读写数据,应尽量使用BufferedWriter类来包装OutputStreamWriter类,用BufferedReader类来包装InputStreamReader.