Java缓冲流、转换流、序列化流( 四 )


构造方法
OutputStreamWriter(OutputStream in) : 创建一个使用默认字符集的字符流 。OutputStreamWriter(OutputStream in, String charsetName) : 创建一个指定字符集的字符流 。
构造举例,代码如下:
OutputStreamWriter isr = new OutputStreamWriter(new FileOutputStream("out.txt")); OutputStreamWriter isr2 = new OutputStreamWriter(new FileOutputStream("out.txt") , "GBK");指定编码写出
public class OutputDemo {public static void main(String[] args) throws IOException {// 定义文件路径String FileName = "E:\out.txt";// 创建流对象,默认UTF8编码OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(FileName));// 写出数据osw.write("你好"); // 保存为6个字节osw.close();// 定义文件路径String FileName2 = "E:\out2.txt";// 创建流对象,指定GBK编码OutputStreamWriter osw2 = new OutputStreamWriter(new FileOutputStream(FileName2),"GBK");// 写出数据osw2.write("你好");// 保存为4个字节osw2.close();}}转换流理解图解
转换流是字节与字符间的桥梁!

Java缓冲流、转换流、序列化流

文章插图
 
2.5练习:转换文件编码
将GBK编码的文本文件,转换为UTF-8编码的文本文件 。
案例分析
1.指定GBK编码的转换流,读取文本文件 。
2.使用UTF-8编码的转换流,写出文本文件 。
案例实现
public class TransDemo {public static void main(String[] args) {// 1.定义文件路径String srcFile = "file_gbk.txt"; String destFile = "file_utf8.txt";// 2.创建流对象// 2.1 转换输入流,指定GBK编码InputStreamReader isr = new InputStreamReader(new FileInputStream(srcFile) , "GBK");// 2.2 转换输出流,默认utf8编码OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(destFile));// 3.读写数据// 3.1 定义数组char[] cbuf = new char[1024];// 3.2 定义长度int len;// 3.3 循环读取while ((len = isr.read(cbuf))!=‐1) {// 循环写出osw.write(cbuf,0,len);}// 4.释放资源osw.close();isr.close();}}第三章 序列化3.1概述
Java 提供了一种对象序列化的机制 。用一个字节序列可以表示一个对象,该字节序列包含该 对象的数据 、 对象的 类型 和 对象中存储的属性 等信息 。字节序列写出到文件之后,相当于文件中持久保存了一个对象的信息 。
反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化 。对象的数据 、 对象的类型 和 对象中 存储的数据 信息,都可以用来在内存中创建对象 。看图理解序列化:
Java缓冲流、转换流、序列化流

文章插图
 
3.2ObjectOutputStream类
java.io.ObjectOutputStream 类,将Java对象的原始数据类型写出到文件,实现对象的持久存储 。
构造方法
public ObjectOutputStream(OutputStream out) : 创建一个指定OutputStream的ObjectOutputStream 。
构造举例,代码如下:
FileOutputStream fileOut = new FileOutputStream("employee.txt"); ObjectOutputStream out = new ObjectOutputStream(fileOut);序列化操作
1.一个对象要想序列化,必须满足两个条件:
该类必须实现 java.io.Serializable 接口,Serializable 是一个标记接口,不实现此接口的类将不会使任 何状态序列化或反序列化,会抛出 NotSerializableException。
该类的所有属性必须是可序列化的 。如果有一个属性不需要可序列化的,则该属性必须注明是瞬态的,使用 transient 关键字修饰 。
public class Employee implements java.io.Serializable { public String name;public String address;public transient int age; // transient瞬态修饰成员,不会被序列化public void addressCheck() {System.out.println("Address check : " + name + " ‐‐ " + address);}}2.写出对象方法
public final void writeObject (Object obj) : 将指定的对象写出 。
public class SerializeDemo{public static void main(String [] args) { Employee e = new Employee();e.name = "zhangsan"; e.address = "beiqinglu"; e.age = 20;try {// 创建序列化流对象ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("employee.txt"));// 写出对象out.writeObject(e);// 释放资源out.close(); fileOut.close();System.out.println("Serialized data is saved"); // 姓名,地址被序列化,年龄没有被序列化 。} catch(IOException i) { i.printStackTrace();}}}输出结果:Serialized data is saved3.3ObjectInputStream类
ObjectInputStream反序列化流,将之前使用ObjectOutputStream序列化的原始数据恢复为对象 。
构造方法
public ObjectInputStream(InputStream in) : 创建一个指定InputStream的ObjectInputStream 。


推荐阅读