Java序列化是在c和c++上没有的概念,这个概念还是比较突兀,且一开始接触就把序列化和文本文件的读写搞混了,以下做些记录免得忘记。


InputStream&OutputStream是所有字节输入&输出流的抽象父类


典型实际子类:

FileOutputStream:从文件系统的某个文件获取输出字节流。

FileInputStream:从文件系统的某个文件获取输入字节流。



注意序列化读写和文本文件读写的区别,序列化需要序列化+二进制流化,而文本文件其实只要获取文本流


序列化简例:

try{
//将对象实例序列化(由于字符串,整形,byte[]都是类都是Object,所以这些数据的存起其实都叫“序列化”)
///
//字节流对象的获取
FileOutputStream flos = new FileOutputStream("./zhou.txt");    //输出流对象

//序列化对象的建立
ObjectOutputStream os = new ObjectOutputStream(flos);

//将类打包进行序列化
String data_one = new String("zhou");
os.writeObject((Object)data_one);

//再来一次(序列化的次序也决定这后面的恢复次序)
String data_two = new String("ke");
os.writeObject((Object)data_two);

os.close();
///


//将那些被序列化的Object对象恢复出来
///
//字节流对象的获取
FileInputStream flis = new FileInputStream("./zhou.txt");//输入流对象

//复原化对象的建立
ObjectInputStream is = new ObjectInputStream(flis);

//复原化对象方法为readObject,返回Object引用
Object oril_one = is.readObject();
//最后输出时记得强转回原来的类型
String pst_one = (String)oril_one;
System.out.println(pst_one);


//再来一次(恢复次序由上面的序列化次序决定)
Object oril_two = is.readObject();
String pst_two = (String)oril_two;
System.out.println(pst_two);


is.close();
///
}catch(Exception x){}



注意这两个不是InputStream&OutputStream的子类

FileWriter:从文件系统用于文本数据的写入(流)对象获取。

FileReader:从文件系统用于文本数据的读取(流)对象获取。



文本数据读写

try
{
//如果需要文本文件式的读写,那和序列化完全没有关系
///
FileWriter c_o = new FileWriter("./ke.txt");

c_o.write("zhouke\r\n");
c_o.write("19880820\r\n");
c_o.write("nan");

c_o.close();
///

//读取文本文件
///
FileReader c_i = new FileReader("./ke.txt");

char [] c_str = new char [100];
c_i.read(c_str);
System.out.println(c_str);

c_i.close();
///


//按行读取文本文件,使用BufferedReader对象加工一下
///
FileReader c_i_buff = new FileReader("./ke.txt");    
BufferedReader br = new BufferedReader(c_i_buff);  //也可以将FileInputStream对象传进去,也能按行读取

String str;
str = br.readLine();
System.out.println(str);

str = br.readLine();
System.out.println(str);

str = br.readLine();
System.out.println(str);

//这行不会报错只会读到null
str = br.readLine();
System.out.println(str);
///
}catch(Exception x){}


一个看似原来疑惑的东西:

Socket chatSocket = new Socket(“127.0.0.1”,10086);

//创建抽象父类OutputStream 的一个引用pstream,chatSocket 类的API显示将返回OutputStream 类,其实返回的是OutputStream 的具体子类,而不是OutputStream 的实例,OutputStream 是抽象类不可能返回实例。
OutputStream pstream =  chatSocket.getOutputStream();


//接着使用抽象父类,进行具体方法的调用,注意这里调用的应该是子类集成父类并实现的具体方法,所以可以使用父类引用进行父类方法调用,其实在这里父类引用根本无需知道当下的是什么具体子类。其实就是多态的一种应用。

这会使得,这里的框架代码定了,但是实际的子类具体如何write的可以接着更新,而不会影响到这里的框架代码。

pstream .write(byte[] data);

pstream .flush();